准备工作
首先我们需要在每一个微服务模块中都引入Knife4j的依赖,如下:
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-openapi3-spring-boot-starter</artifactId>
<version>4.1.0</version>
</dependency>
如果不想每一个微服务的pom文件都配置一遍也可以创建一个base服务,在里面管理所有微服务公共的依赖。
然后在网关微服务中引入用来聚合所有接口文档的依赖,如下:
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-gateway-spring-boot-starter</artifactId>
<version>4.1.0</version>
</dependency>
这里用到的knife4j相关依赖都是最新的4.1.0版本
配置
微服务
这里使用openapi3.0
首先在每一个微服务的application.yml文件中,配置接口文档的相关内容,如下:
springdoc:
swagger-ui:
path: /swagger-ui.html
tags-sorter: alpha
operations-sorter: alpha
api-docs:
path: v3/api-docs # 指定生成文档的路径,网关会访问这个路径来拉取文档
group-configs:
- group: 'default'
paths-to-match: '/**'
packages-to-scan: com.keyl1me.edu.controller # 指定要扫描的包
knife4j:
enable: true # 开启knife4j接口文档美化
setting:
language: zh_cn # 指定语言
对于每一个微服务都要进行相同的配置,api-docs.path这个配置是十分重要的,它决定了网关需要访问哪一个路径来拉取这个微服务生成的文档内容,这里尽量将其保持为默认的v3/api-docs,这样在网关中就不需要额外的配置了。
网关
spring:
cloud:
gateway:
discovery:
locator:
enabled: true # 开启服务发现
routes:
- id: service-ucenter
uri: lb://service-ucenter
predicates:
- Path=/service-ucenter/** # 配置转发规则
filters:
- StripPrefix=1
- id: service-edu
uri: lb://service-edu
predicates:
- Path=/service-edu/**
filters:
- StripPrefix=1
# 这里可以配置更多微服务的路径...
# 这里配置文档聚合规则
knife4j:
gateway:
enabled: true
strategy: discover
discover: # 开启服务发现,启动之后就会自动聚合在注册中心注册的所有微服务文档了
enabled: true
version: openapi3
配置完成后网关就会自动向所有注册中心中注册的微服务发起请求拉取它们的接口文档了。注意这里我们必须配置:
filters
- StripPrefix=1
因为网关会自动在每一个接口地址前添加这个接口所属的微服务的名称,所以如果不过滤第一个前缀,发出的请求是无法匹配接口真正的地址的。
随后我们启动所有的微服务,注册中心以及网关,再访问网关地址/doc.html就可以看到一个聚合之后的接口文档了。
如图,我们可以使用左上角的选择器选择不同的微服务文档,现在就可以在同一个地址下访问所有的文档了。