SpringCloud微服务配合Swagger
前言
在SpringBoot项目中目前普遍使用Swagger作为Api文档以及测试工具。
而在SpringCloud的微服务环境下,自然也少不了Api文档和测试工具,但使用Swagger对单一模块来进行查看的话,十分的繁琐,而且使用的接口测试并没有通过微服务的路由请求,所以在SpringCloud微服务项目下的Swagger如果进行配置,这是一直以来的难题。
解决方法
在微服务项目中,接口通常是路由方式进行跳转实现的。所以在需要考虑使用在路由中暴露一个Swagger网页,要求所有的模块Swagger文档都能在这里查询出来,并且可以直接在路由的Swagger这个网页上运行测试。
实现操作
由于是微服务,所有我们需要在common模块下导入Swagger依赖,这里我们选择一个可以快速配置的Swagger-Spring-boot-starter:
这个版本中使用的是Swagger-3,这里需要注意下,因为后面需要讲述一下需要注意的问题。
在接口模块中的Swagger配置
由于我们常用的是第三方的Swagger-starter配置,这个依赖的特点是 支持直接在Yaml、Properties文件下直接进行配置Swagger信息,不需要单独创建一个Swagger配置类。
来到一个接口模块下:
这里的swagger.base-package
用来设置模块下的Controller的位置的,用来寻找接口。
swagger.global-operation-parameters
这个配置是当前这个依赖包的Bug问题解决方法,因为Swagger要求全局参数必须存在,否则的话模块启动将会包NPE错误。所以这里我们设置了一个空参数。
随后我们在Controller下写入常规的Swagger注释即可:
在路由中配置Swagger
接下来就是这次的问题重点了,在路由中配置Swagger,这里我们使用的是目前SpringCloud官方推荐的
还是和上面用于在Xml、Properties文件下进行配置文件:
这里由于我们在路由中所以不需要设置Controller的位置,它本身是没有文档内容的。
随后我们需要对其Swagger的连接特殊处理:
由于Spring GateWay并没有采用传统的SpringWeb结构,而是使用SpringFlux。
所以需要进行重写Swagger的请求。
这时我们访问路由的Swagger地址 localhost:XXXX/swagger-ui/index.html 即可成功进入Swagger文档页面了。
但是这是Swagger文档的页面并没有归纳在一起,我们需要将其模块的Swagger文档归纳到路由Swagger页面来。
上面我们就添加了一个叫login-component
的模块页在Swagger页面上了,它的地址对应到模块的路由Swagger文档Api地址,这里我们采用的Swagger依赖包基于Swagger3所以这里的Api地址默认在v3/api-docs下。
对于后续的模块我们可以依次加入进去即可。
页面成功显示了,模块Api也归纳了,看似几乎成功了…
但其实这里有个问题,这时虽然看的见文档接口,但是对于执行测试的时候,执行的连接并不是对于路由到模块的连接地址,而是直接在路由的连接后拼接,所以执行测试的地址错误。
这是目前的Swagger3的问题,目前的Swagger3无法进行自动对微服务的测试执行拼接请求连接,而是基于当前的Swagger地址连接根目录进行的。
为了解决这个方法,目前暂时可以通过覆盖本地包来重写Swagger请求逻辑。
在项目创建一个springfox.documentation.oas.web包,在其中创建SpecGeneration类。
当我们重写了原本的Swagger3内容后,即解决了模块请求连接的问题。即可正常在路由中执行Swagger中的模块接口。