常规的swagger必须要应用服务在启动状态才能访问,很多时候由于服务端在发布,前端开发同事就不能查看接口文档了。
基于此背景,经过一番调研和思考,有了下面的wagger注册中心+swagger离线访问方案(说明一下这里是用的springfox 2.x)
一、首先分析
1、swagger-ui 主要调用2个接口拿数据
1)/swagger-resources 获取接口组列表
2)/v2/api-docs 获取对应组的接口信息
2、文档聚合模式
1)常见的是gateway聚合,前端访问 gateway访问的文档地址,然后gateway将请求转发到对应的微服务获取数据;
二、方案
1、建立一个swagger注册中心,可以是gateway,也可以是任意一个服务;
2、每个服务启动完成后查询本服务的Swagger信息,调用接口自动上报给swagger注册中心;
3、swagger注册中心接收各微服务上班的swagger信息数据,并做存储;
4、前端直接访问swagger注册中心获取数据,不用再讲过个各微服务。
三、核心代码
1、获取Swagger信息
- private Swagger getSwagger() {
- Swagger swagger = null;
- if (serviceModelToSwagger2Mapper != null && documentationCache != null) {
- Documentation documentation = documentationCache.documentationByGroup(hscSystemPropertiesProvider.getApplicationDesc());
- if (documentation != null) {
- swagger = serviceModelToSwagger2Mapper.mapDocumentation(documentation);
- }
- }
- return swagger;
- }
2、将Swagger信息序列化并上报注册中心
- SwaggerRegisterInfoDto swaggerRegisterInfoDto = new SwaggerRegisterInfoDto();
- swaggerRegisterInfoDto.setSwaggerName(hscSystemPropertiesProvider.getApplicationDesc());
- swaggerRegisterInfoDto.setSwaggerContent(jsonSerializer.toJson(swagger).value());
- registerationPortal.registerSwaggerInfo(session, swaggerRegisterInfoDto);
3、Swagger注册中心定义接口接收数据并存储到数据库
数据库核心字段就2个: name、content,name唯一。
4、前端访问改造
1)前端获取接口组列表 需要接口实现重写
分析/swagger-resources源码,我们想要从数据库获取注册的组列表,需要重新实现SwaggerResourcesProvider 接口,主要要标记@Primary以覆盖默认的。
2)前端获取接口详情
默认是调用的/v2/api-docs?group=xx,其实就是访问的上一步返回的接口组列表的地址,这里可以根据实际情况修改地址;然后注册中心收到此请求就查询数据库返回content。
根据实际情况,可以启用缓存,毕竟这个数据不经常更新。甚至有需求的还可以做版本控制,对微服务多次上报注册的swagger信息分版本记录。