在实际的项目中经常通过统一网关把服务的API暴露出去,但是如果后端服务数量众多,而且分散在不同的项目中,那么要收集这些项目的API就比较麻烦,虽然能够通过每个项目的Swagger来查看、测试这些API,但是还是存在诸多不便,那么有没有办法将这些分散的Swagger整合到一起呢?答案是肯定的,下面就这个问题的解决办法做一介绍。
统一网关输出API
后端服务使用统一的网关输出API是前提条件,也就是后端API都必须经过网关鉴权和路由。
配置ZUUL
在配置文件里边配置ZUUL,指明后端服务的路由策略。
#feign配置
zuul:
prefix: /open/v1
strip-prefix: true
routes:
userbase:
path: /userbase/**
serviceId: user-base
userorg:
path: /userorg/**
serviceId: user-org
增加Swagger支持
通常网关没有Controller,所以一般也不会引入Swagger,但是为了能够以Swagger的方式集成API,则Swagger的相关支持必须引入到网关项目中,引入方法和Controller项目一致。
- 引入相关maven包
<!--swagger依赖包-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.7.0</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.7.0</version>
</dependency>
- 编写Swagger主类,无需特殊说明
- 编写zuul配置类,该类为了从配置文件中读取相关配置到Bean中作为后面集成后端服务API信息。
@Configuration
@ConfigurationProperties(prefix = "zuul")
@Data
public class ZuulConf {
private String prefix;
private JSONObject routes;
}
- 编写Swagger资源组件,这个组件实现了SwaggerResourcesProvider接口,是Swagger集成的核心部分,就是将需要路由到其他后端服务的Swagger接口配置进来。
@Component
@Primary
class DocumentationConfig implements SwaggerResourcesProvider {
@Autowired
private ZuulConf zuulConf;
@Override
public List<SwaggerResource> get() {
List resources = new ArrayList();
zuulConf.getRoutes().entrySet().forEach(s -> {
resources.add(swaggerResource(s.getKey(), zuulConf.getPrefix() + "/" + s.getKey() + "/v2/api-docs", "2.0"));
});
//对API列表按照名称排序
resources.sort(Comparator.comparing(SwaggerResource::getName));
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;
}
}
集成后的效果
集成后直接打开网关的Swagger即可从下拉列表中切换到其他后端服务API的Swagger,访问这些API也是通过网关访问。
通过网关集成API效果