SpringCloud网关聚合Swagger接口文档实践
文章插图
目前大多数项目都是以微服务架构设计 , 以前后端分离技术解耦前端开发工程师和后端开发工程师的工作量 , 这样一来前后端的对接将是一项重要的沟通工作量 , 如果后端没有一个合适的API文档 , 那么这样的前后端对接将是一项繁琐的工作 。
大多数情况下 , 开发人员可能会使用在线文档工具或者离线文档来描述接口的一些信息 。 离线文档存在最大的缺点就是当接口发生变化后 , 需要对接口文档进行更新 , 无形中增加了开发人员的工作量 。 如果接口文档更新不及时 , 那么在前后端对接的过程中将会产生误差 , 这样将会大大增加前后端对接的沟通成本 。
目前后端开发中应用到最多的可能是在线文档生成工具 , 例如:swagger 。 当我们的后端接口源代码发生变更或者重构后能够及时的生成接口文档 。 方便前端开发人员进行对接 , 减少了后端开发人员编写接口文档的工作量 , 同时也节省了前后端对接过程中沟通成本 。
Swagger在线文档生成工具整合到后端框架中也是比较简单的 , 本文将以SpringCloud的微服务架构演示如何将swagger整合到网关服务中 。 下面详细介绍下整合的详细过程:
swagger官方文档:
【SpringCloud网关聚合Swagger接口文档实践】分别新建三个微服务其中具体功能如下:
- 网关服务sentinel-cloud-gateway;
- 模拟用户服务nacos-microservice-user;
- 模拟订单服务nacos-microservice-order;
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
- 技术文章—FPGA的单线聚合(SWA)优势
- 广州国际创新节启用新主场 基地聚合五大功能平台
- 5G加速内容圈层聚合 中国移动咪咕启动“5G+内容生态共同体”
- 激活|紫外线激活的聚合物可使智能织物更加智能化
- 如何将Spring Cloud Zuul网关修改为短连接?
- 用MQTT和边缘网关简化数据采集&为大数据和工业4.0做准备
- 全网超好用的聚合神器,内含100种插件,永久免费
- 科技无界、聚合共生,中新数字经济与人工智能高峰论坛云端召开
- 全面的讲解SpringCloud中Zuul网关原理及其配置,看它就够了
- 吹爆!这份有思路有案例能落地的SpringCloud开发笔记