SpringCloud网关聚合Swagger接口文档实践
文章插图
目前大多数项目都是以微服务架构设计 , 以前后端分离技术解耦前端开发工程师和后端开发工程师的工作量 , 这样一来前后端的对接将是一项重要的沟通工作量 , 如果后端没有一个合适的API文档 , 那么这样的前后端对接将是一项繁琐的工作 。
大多数情况下 , 开发人员可能会使用在线文档工具或者离线文档来描述接口的一些信息 。 离线文档存在最大的缺点就是当接口发生变化后 , 需要对接口文档进行更新 , 无形中增加了开发人员的工作量 。 如果接口文档更新不及时 , 那么在前后端对接的过程中将会产生误差 , 这样将会大大增加前后端对接的沟通成本 。
目前后端开发中应用到最多的可能是在线文档生成工具 , 例如:swagger 。 当我们的后端接口源代码发生变更或者重构后能够及时的生成接口文档 。 方便前端开发人员进行对接 , 减少了后端开发人员编写接口文档的工作量 , 同时也节省了前后端对接过程中沟通成本 。
Swagger在线文档生成工具整合到后端框架中也是比较简单的 , 本文将以SpringCloud的微服务架构演示如何将swagger整合到网关服务中 。 下面详细介绍下整合的详细过程:
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;}}
- R数据分析:如何计算问卷的聚合效度,实例操练
- 使用原位聚合增强"染色"过程,赋予纺织品电子特性
- 联发科携手中国联通和中国电信完成5G SA 3.5GHz频段双载波聚合测试
- 嘿科技在这里|打造混合计算中国ICT能力聚合平台,蒋志祥:分享通信面向5G
- 大京网|集奥聚合作为标杆企业入围,《2020中国大数据产业发展白皮书》震撼发布
- 化学加|Chem. 华东理工大学马骧教授团队构建发光可调控的智能纯有机室温磷光聚合物材料,Angew.