Spring Cloud Zuul 整合 swagger

文 / 拖延症晚期
2019-08-16 18:37
"

最近我们有一个需求,就是把各个系统的swagger文档集中在一起。有了这么一个需求之后,我去百度了,结合swagger的源码实现了一下

Spring Cloud Zuul 整合 swagger

Spring Cloud Zuul 整合 swagger

首先我们可以先看看单个系统的swagger页面,

第一部分是一个下拉框,就是一个选择swagger资源的下拉框,默认就是本应用;

第二部分是一个请求,是第一部分数据的请求

第三部分是第二部分请求的一个结果展示,json部分一共有三个key,由图片可知第一个key是name,第二个key是location。也就是这个资源的访问url,第三个key是version,也就是版本号

根据我们自己的需求,怎么将各个系统的api数据集中在一起呢?其实思路可以从我上面的截图得到。

步骤1:

首先要先从swagger源码中找到第二步的请求源码,如下

Spring Cloud Zuul 整合 swagger

Spring Cloud Zuul 整合 swagger

Spring Cloud Zuul 整合 swagger

Spring Cloud Zuul 整合 swagger

红线区域是核心,主要就是生成swaggerResource返回给前端,默认是只返回本document的swaggerResource。

步骤2:

理解步骤1之后,其实我们可以大概能想象怎么处理我们之前的需求。处理方式就是自定义resourceProvide类实现SwaggerResourceProvider接口,然后我们只要重写get方法,代码如下:

@Component
@Primary
class MySwaggerResourcesProvider implements SwaggerResourcesProvider {
@Override
public List<SwaggerResource> get() {
List resources = new ArrayList<>();
resources.add(swaggerResource("service-a", "/swagger-service-a/v2/api-docs", "2.0"));
resources.add(swaggerResource("service-b", "/swagger-service-b/v2/api-docs", "2.0"));
return resources;
}
private SwaggerResource swaggerResource(String name, String location, String version) {
SwaggerResource swaggerResource = new SwaggerResource();
swaggerResource.setName(name);
swaggerResource.setLocation(location);
swaggerResource.setSwaggerVersion(version);
return swaggerResource;
}
}
Spring Cloud Zuul 整合 swagger

主要是get方法,代码主要把增加了各个系统的swaggerResource(数据访问来源),

SwaggerResource有三个参数,

第一个参数:名称,也就是之前那个下拉框的选择条名称

第二个参数:url,就是访问具体系统swagger的链接

第三个参数:version ,就是swagger的版本

之后就启动网关项目,访问网关项目的swagger地址就可以看到各个系统集中的api数据了

"