SpringCloud网关聚合Swagger接口文档实践


SpringCloud网关聚合Swagger接口文档实践文章插图
目前大多数项目都是以微服务架构设计 , 以前后端分离技术解耦前端开发工程师和后端开发工程师的工作量 , 这样一来前后端的对接将是一项重要的沟通工作量 , 如果后端没有一个合适的API文档 , 那么这样的前后端对接将是一项繁琐的工作 。
大多数情况下 , 开发人员可能会使用在线文档工具或者离线文档来描述接口的一些信息 。 离线文档存在最大的缺点就是当接口发生变化后 , 需要对接口文档进行更新 , 无形中增加了开发人员的工作量 。 如果接口文档更新不及时 , 那么在前后端对接的过程中将会产生误差 , 这样将会大大增加前后端对接的沟通成本 。
目前后端开发中应用到最多的可能是在线文档生成工具 , 例如:swagger 。 当我们的后端接口源代码发生变更或者重构后能够及时的生成接口文档 。 方便前端开发人员进行对接 , 减少了后端开发人员编写接口文档的工作量 , 同时也节省了前后端对接过程中沟通成本 。
Swagger在线文档生成工具整合到后端框架中也是比较简单的 , 本文将以SpringCloud的微服务架构演示如何将swagger整合到网关服务中 。 下面详细介绍下整合的详细过程:
swagger官方文档:
【SpringCloud网关聚合Swagger接口文档实践】分别新建三个微服务其中具体功能如下:

  1. 网关服务sentinel-cloud-gateway;
  2. 模拟用户服务nacos-microservice-user;
  3. 模拟订单服务nacos-microservice-order;
一 , 在pom.xml中引入swagger的依赖:
io.springfox springfox-swagger2 2.9.2 io.springfox springfox-swagger-ui 2.9.2二 , 分别在两个微服务nacos-microservice-user和nacos-microservice-order配置swagger:
@Configuration@EnableSwagger2public class Swagger2Config {@Value("${swagger.enable:true}")private boolean enableSwagger;@Beanpublic Docket createRestApi() {return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).enable(enableSwagger).select().apis(RequestHandlerSelectors.basePackage("com.spring.cloud.alibaba.controller")).paths(PathSelectors.any()).build();}private ApiInfo apiInfo() {return new ApiInfoBuilder().title("SprintBoot Swagger2 build API docs").description("Spring Boot Swagger2 Restful API").contact(new Contact("xiaobaoqiang", "", "xiaobaoqiang@163.com")).version("1.0").build();}}三 , 在网关服务中新建SwaggerProvider类实现SwaggerResourcesProvider接口:
@Primary@Component@Slf4j@AllArgsConstructorpublic class SwaggerProvider implements SwaggerResourcesProvider {public static final String API_URI = "/v2/api-docs";private final RouteLocator routeLocator;private final GatewayProperties gatewayProperties;@Overridepublic List get() {List resources = new ArrayList<>();List routes = new ArrayList<>();//取出gateway的routerouteLocator.getRoutes().subscribe(route -> routes.add(route.getId()));//结合配置的route-路径(Path) , 和route过滤 , 只获取有效的route节点gatewayProperties.getRoutes().stream().filter(routeDefinition -> routes.contains(routeDefinition.getId())).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;}}四 , 在网关服务中新建SwaggerHandler类:
@RestController@RequestMapping("/swagger-resources")public class SwaggerHandler {@Autowired(required = false)private SecurityConfiguration securityConfiguration;@Autowired(required = false)private UiConfiguration uiConfiguration;private final SwaggerResourcesProvider swaggerResources;@Autowiredpublic SwaggerHandler(SwaggerResourcesProvider swaggerResources) {this.swaggerResources = 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("")public Mono