在《第一个 Spring Boot 子服务——会员服务》章节中已经实现了集成 Swagger2,通过 UI 进行接口的展现、测试功能,当单体项目或者对外只提供一个 API 接口文档时,采用 Swagger 的方式访问 API 还算简单,但当微服务项目增多,外部端接入 API 时,就要面对众多的 Swagger 界面——服务端口、接口路径各异,调用难度增大不少,这时迫切需要做一个整合,将所有 API 展现在一个页面中统一对外。
两种实现思路
因之前的每个子模块中都已经集成了 Swagger,可以通过指定的路径访问到各自的 API,有两种方式可以将所有的 API 管理起来。
1. 自行制作单页,将子模块的 swagger-ui 页面全部装进去,页面中通过 iframe 的形式访问接口。此方式简单粗暴,弊端也显而易见:
- 子模块接口暴露在外,易引起安全风险,需要网关统一处理的功能,如鉴权等,在子模块中缺失。
- 不经网关,访问每个子模块的端口不一,编码易出错。
- 如果模块有变动,单页需要保持更新。
2. 将各模块的 swagger-ui 集成在网关层,上述三个弊端均不是问题。
本实例中将通过 Gateway 服务层集成所有 swagger-ui 页面,统一对外暴露。
Gateway 层集成 Swagger
首先我们来看看访问 swagger-ui.html 时,都加载了哪些内容。以积分服务为例,如果使用的是 chrome 浏览器,右键打开“检查”功能,切换到 network 页签,刷新页面后,按“Type”列排序,默认调用 4 个异步方法: