使用SpringCloud Gateway,根据各个服务的路由信息,自动聚合各个服务的swagger信息。
1、引入maven依赖:
<!-- 网关 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!-- swagger -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
2、编辑application.yml或bootstrap.yml文件:
server:
port: 8088
spring:
application:
name: gateway-server
cloud:
gateway:
discovery:
locator:
lower-case-service-id: true
enabled: true
routes:
- id: server-user-api
uri: lb://moli-ms-user
predicates:
- Path=/api-user/**
- id: server-auth-api
uri: lb://moli-auth
predicates:
- Path=/api-auth/**
- id: server-robot-api
uri: lb://moli-ms-robot
predicates:
- Path=/api-robot/**
- id: server-order
uri: lb://moli-ms-order
predicates:
- Path=/api-order/**
default-filters:
- StripPrefix=1
3、自定义swagger接口:
package com.molicloud.moli.gateway.swagger.handler;
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.*;
import java.util.Optional;
/**
* 自定义swagger接口请求
*
* @author feitao <yyimba@qq.com> 2019-6-27 00:23:31
*/
@RestController
@RequestMapping("/swagger-resources")
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;
}
@GetMapping("/configuration/security")
public Mono<ResponseEntity<SecurityConfiguration>> securityConfiguration() {
return Mono.just(new ResponseEntity<>(
Optional.ofNullable(securityConfiguration).orElse(SecurityConfigurationBuilder.builder().build()), HttpStatus.OK));
}
@GetMapping("/configuration/ui")
public Mono<ResponseEntity<UiConfiguration>> uiConfiguration() {
return Mono.just(new ResponseEntity<>(
Optional.ofNullable(uiConfiguration).orElse(UiConfigurationBuilder.builder().build()), HttpStatus.OK));
}
@GetMapping("")
public Mono<ResponseEntity> swaggerResources() {
return Mono.just((new ResponseEntity<>(swaggerResources.get(), HttpStatus.OK)));
}
}
4、从网关路由中聚合swagger信息:
package com.molicloud.moli.gateway.swagger.config;
import org.springframework.cloud.gateway.config.GatewayProperties;
import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.support.NameUtils;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import springfox.documentation.swagger.web.SwaggerResource;
import springfox.documentation.swagger.web.SwaggerResourcesProvider;
import java.util.ArrayList;
import java.util.List;
/**
* 从网关路由中聚合swagger信息
*
* @author feitao <yyimba@qq.com> 2019-6-27 00:20:35
*/
@Primary
@Component
public class GatewaySwaggerProvider implements SwaggerResourcesProvider {
public static final String API_URI = "/v2/api-docs";
private final RouteLocator routeLocator;
private final GatewayProperties gatewayProperties;
public GatewaySwaggerProvider(RouteLocator routeLocator, GatewayProperties gatewayProperties) {
this.routeLocator = routeLocator;
this.gatewayProperties = gatewayProperties;
}
@Override
public List<SwaggerResource> get() {
List<SwaggerResource> resources = new ArrayList<>();
List<String> routes = new ArrayList<>();
// 取出Spring Cloud Gateway中的route
routeLocator.getRoutes().subscribe(route -> routes.add(route.getId()));
// 结合路由配置,只获取有效的route节点
gatewayProperties.getRoutes().stream()
// id不为空,并且id以 -api 结尾的路由
.filter(routeDefinition -> routes.contains(routeDefinition.getId()) && StringUtils.endsWithIgnoreCase(routeDefinition.getId(), "-api"))
.forEach(routeDefinition -> routeDefinition.getPredicates().stream()
.filter(predicateDefinition -> ("Path").equalsIgnoreCase(predicateDefinition.getName()))
.forEach(predicateDefinition -> resources.add(swaggerResource(routeDefinition.getId(),
predicateDefinition.getArgs().get(NameUtils.GENERATED_NAME_PREFIX + "0")
.replace("/**", API_URI)))));
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;
}
}
效果图:

未经允许不得转载:小茉莉 » SpringCloud Gateway聚合各个服务的Swagger
最新评论
最多嵌套多少层?
秀,被你找到了,还没有公布
我靠666
秀得很
老哥测试一下