网关统一聚合各个微服务swagger文档
这里简单的说下步骤,首先在每个微服务(除了网关微服务)中都需要引入knife4j的微服务依赖,这个依赖是不包含API文档前端UI包的,因为由网关来做统一展示,依赖如下:<dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-micro-spring-boot-star
·
- 这里简单的说下步骤,首先在每个微服务(除了网关微服务)中都需要引入knife4j的微服务依赖,这个依赖是不包含API文档前端UI包的,因为由网关来做统一展示,依赖如下:
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-micro-spring-boot-starter</artifactId>
</dependency>
- 其次在每个微服务(除了网关微服务)中都新建以下swagger配置类,其中添加需要扫描的controller包路径以及补充一些自定义信息,具体如下:
/**
* Swagger API相关配置
*/
@Configuration
@EnableSwagger2
@EnableKnife4j
public class Swagger2Config {
@Bean
public Docket createRestApi(){
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage("com.jiejie.test.controller"))
.paths(PathSelectors.any())
.build();
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("admin")
.description("后台服务API文档")
.contact("jiejie")
.version("1.0")
.build();
}
}
- 接着在网关微服务中引入如下依赖,这个依赖就包含API文档的前端UI包了:
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-spring-boot-starter</artifactId>
</dependency>
- 在网关服务上添加Swagger资源配置类,用于聚合其他微服务中Swagger的api-docs访问路径,如下:
/**
* Swagger资源配置
*/
@Slf4j
@Component
@Primary
@AllArgsConstructor
public class SwaggerResourceConfig implements SwaggerResourcesProvider {
private final RouteLocator routeLocator;
private final GatewayProperties gatewayProperties;
@Override
public List<SwaggerResource> get() {
List<SwaggerResource> resources = new ArrayList<>();
List<String> routes = new ArrayList<>();
//获取所有路由的ID
routeLocator.getRoutes().subscribe(route -> routes.add(route.getId()));
//过滤出配置文件中定义的路由->过滤出Path Route Predicate->根据路径拼接成api-docs路径->生成SwaggerResource
gatewayProperties.getRoutes().stream().filter(routeDefinition -> routes.contains(routeDefinition.getId())).forEach(route -> {
route.getPredicates().stream()
.filter(predicateDefinition -> ("Path").equalsIgnoreCase(predicateDefinition.getName()))
.forEach(predicateDefinition -> resources.add(swaggerResource(route.getId(),
predicateDefinition.getArgs().get(NameUtils.GENERATED_NAME_PREFIX + "0")
.replace("**", "v2/api-docs"))));
});
return resources;
}
private SwaggerResource swaggerResource(String name, String location) {
SwaggerResource swaggerResource = new SwaggerResource();
swaggerResource.setName(name);
swaggerResource.setLocation(location);
swaggerResource.setSwaggerVersion("2.0");
return swaggerResource;
}
}
- 最后在网关微服务中添加自定义Swagger内部各个获取数据接口的类,如下:
/**
* 自定义Swagger的各个配置节点
*/
@RestController
public class SwaggerHandler {
@Autowired(required = false)
private SecurityConfiguration securityConfiguration;
@Autowired(required = false)
private UiConfiguration uiConfiguration;
private final SwaggerResourcesProvider swaggerResources;
@Autowired
public SwaggerHandler(SwaggerResourcesProvider swaggerResources) {
this.swaggerResources = swaggerResources;
}
/**
* Swagger安全配置,支持oauth和apiKey设置
*/
@GetMapping("/swagger-resources/configuration/security")
public Mono<ResponseEntity<SecurityConfiguration>> securityConfiguration() {
return Mono.just(new ResponseEntity<>(
Optional.ofNullable(securityConfiguration).orElse(SecurityConfigurationBuilder.builder().build()), HttpStatus.OK));
}
/**
* Swagger UI配置
*/
@GetMapping("/swagger-resources/configuration/ui")
public Mono<ResponseEntity<UiConfiguration>> uiConfiguration() {
return Mono.just(new ResponseEntity<>(
Optional.ofNullable(uiConfiguration).orElse(UiConfigurationBuilder.builder().build()), HttpStatus.OK));
}
/**
* Swagger资源配置,微服务中这各个服务的api-docs信息
*/
@GetMapping("/swagger-resources")
public Mono<ResponseEntity> swaggerResources() {
return Mono.just((new ResponseEntity<>(swaggerResources.get(), HttpStatus.OK)));
}
}
到这步其实可以发现,复制黏贴就好了,接下里比较关键的是我们定义在网关里的路由规则了,这个路由规则,不管你是用哪种方式去定义,都要遵守一个原则,那就是保证转发请求能够正确匹配到各个服务的http://ip:port/v2/api-docs
文档路径,这样才能获取到数据。
最终结果如下:
表示已经聚合了两个微服务的swagger文档进去了。
更多推荐
已为社区贡献10条内容
所有评论(0)