Nacos閘道器gateway整合swagger

我們都知道swagger可以

根據在程式碼中使用自定義的註解來生成介面文件,這個在前後端分離的專案中很重要。這樣做的好處是 在開發介面時可以透過swagger 將介面文件定義好,同時也方便以後的維護。

但是分成微服務後,可能會存在多個微服務,這樣如果每個服務都搞個單獨的swagger頁面的話,這樣前段檢視介面會非常麻煩。因此我們可以在閘道器服務整合swagger給註冊中心的微服務來總體展示。

環境配置:

pom:

<!—— api swagger ——> io。springfox springfox-swagger2 2。9。2 io。springfox springfox-swagger-ui 2。9。2 <!—— 依賴於springframework。boot版本 ——> org。springframework。boot spring-boot-starter-thymeleaf 2。3。12。RELEASE

swagger類配置:

閘道器服務配置類:

記住網管服務配置不要加@Configuration註解,否則會報錯,因為閘道器沒有引入springboot-web包。

package com。consumer。swagger;import org。springframework。beans。factory。annotation。Value;import org。springframework。context。annotation。Bean;import org。springframework。context。annotation。Configuration;import springfox。documentation。builders。ApiInfoBuilder;import springfox。documentation。builders。PathSelectors;import springfox。documentation。builders。RequestHandlerSelectors;import springfox。documentation。service。ApiInfo;import springfox。documentation。spi。DocumentationType;import springfox。documentation。spring。web。plugins。Docket;import springfox。documentation。swagger2。annotations。EnableSwagger2;/** * @author xg */@EnableSwagger2public class Swagger2 { @Value(“${spring。application。name}”) String appName; @Bean public Docket createRestApi() { return new Docket(DocumentationType。SWAGGER_2) 。apiInfo(apiInfo()) 。select() 。apis(RequestHandlerSelectors。basePackage(“com。consumer”)) 。paths(PathSelectors。any()) 。build(); } private ApiInfo apiInfo() { return new ApiInfoBuilder() 。title(appName + “專案 RESTful API介面文件”) 。description(“”) 。version(“1。0”) 。build(); }}

接下里我們還要建個類,用來初始化各個服務的swagger,讀取到閘道器的swagger中。

package com。gateway。swagger;import org。springframework。beans。factory。annotation。Autowired;import org。springframework。beans。factory。annotation。Value;import org。springframework。cloud。gateway。route。RouteLocator;import org。springframework。stereotype。Component;import springfox。documentation。swagger。web。SwaggerResource;import springfox。documentation。swagger。web。SwaggerResourcesProvider;import java。util。ArrayList;import java。util。HashSet;import java。util。List;import java。util。Set;/** * @author xg * 聚合各個服務的swagger介面 */@Componentpublic class SwaggerProvider implements SwaggerResourcesProvider { /** * swagger2預設的url字尾 */ private static final String SWAGGER2URL = “/v2/api-docs”; /** * 閘道器路由 */ private final RouteLocator routeLocator; /** * 閘道器應用名稱 */ @Value(“${spring。application。name}”) private String self; @Autowired public SwaggerProvider(RouteLocator routeLocator) { this。routeLocator = routeLocator; } @Override public List get() { List resources = new ArrayList<>(); List routeHosts = new ArrayList<>(); // 由於我的閘道器採用的是負載均衡的方式,因此我需要拿到所有應用的serviceId // 獲取所有可用的host:serviceId routeLocator。getRoutes()。filter(route -> route。getUri()。getHost() != null) 。filter(route -> !self。equals(route。getUri()。getHost())) 。subscribe(route -> routeHosts。add(route。getUri()。getHost())); // 記錄已經新增過的server,存在同一個應用註冊了多個服務在nacos上 Set dealed = new HashSet<>(); routeHosts。forEach(instance -> { // 拼接url,樣式為/serviceId/v2/api-info,當閘道器呼叫這個介面時,會自動透過負載均衡尋找對應的主機 String url = “/” + instance + SWAGGER2URL; if (!dealed。contains(url)) { dealed。add(url); SwaggerResource swaggerResource = new SwaggerResource(); swaggerResource。setUrl(url); swaggerResource。setName(instance); resources。add(swaggerResource); } }); return resources; }}

我們還需要SwaggerController這個類,這個類提供整合swagger頁面

swagger-ui

下拉對應的相關介面

package com。gateway。swagger;import io。swagger。annotations。Api;import io。swagger。annotations。ApiOperation;import org。springframework。beans。factory。annotation。Autowired;import org。springframework。http。HttpStatus;import org。springframework。http。ResponseEntity;import org。springframework。web。bind。annotation。GetMapping;import org。springframework。web。bind。annotation。RequestMapping;import org。springframework。web。bind。annotation。RestController;import reactor。core。publisher。Mono;import springfox。documentation。swagger。web。SecurityConfiguration;import springfox。documentation。swagger。web。SecurityConfigurationBuilder;import springfox。documentation。swagger。web。UiConfiguration;import springfox。documentation。swagger。web。UiConfigurationBuilder;import javax。annotation。Resource;import java。util。Optional;/** * @author xg * swagger介面讀取,以及swagger相關ui讀取 */@Api(tags = “swagger重新整理”)@RestController@RequestMapping(“/swagger-resources”)public class SwaggerController { @Autowired(required = false) private SecurityConfiguration securityConfiguration; @Autowired(required = false) private UiConfiguration uiConfiguration; @Resource private SwaggerProvider swaggerResources; @GetMapping(“/configuration/security”) public Mono> securityConfiguration() { return Mono。just(new ResponseEntity<>( Optional。ofNullable(securityConfiguration)。orElse(SecurityConfigurationBuilder。builder()。build()), HttpStatus。OK)); } @GetMapping(“/configuration/ui”) public Mono> uiConfiguration() { return Mono。just(new ResponseEntity<>( Optional。ofNullable(uiConfiguration)。orElse(UiConfigurationBuilder。builder()。build()), HttpStatus。OK)); } @GetMapping(“”) @ApiOperation(“”) public Mono swaggerResources() { return Mono。just((new ResponseEntity<>(swaggerResources。get(), HttpStatus。OK))); }}

以上閘道器swagger就配置好了,現在我們先啟動nacos註冊中心,和一個集成了swagger的微服務。

Nacos閘道器gateway整合swagger

provider-xg微服務埠號8082:我們直接訪問看看

http://10.45.12.63:8082/swagger-ui.html

Nacos閘道器gateway整合swagger

是可以訪問的,這時候我們啟動閘道器

Nacos閘道器gateway整合swagger

閘道器埠號是8099

http://10.45.12.63:8099/swagger-ui.html

Nacos閘道器gateway整合swagger

此時我們再啟動一個Consumer服務看看:

Nacos閘道器gateway整合swagger

直接埠訪問:

http://10.45.12.63:8085/swagger-ui.html

Nacos閘道器gateway整合swagger

我們開啟閘道器swagger頁面,檢視右上角會發現已經有我們的服務了:

Nacos閘道器gateway整合swagger

點選consumer-xg:

Nacos閘道器gateway整合swagger

整合ok。

Nacos閘道器gateway整合swagger

花有重開日,人無再少年,記錄每一次的心動瞬間。