前言
无力吐槽,不知道是knife4j的问题还是swagger的问题,这个微服务网关集成路径问题折磨了我两个小时,官方文档的配置也跑不起来,作者联系不上,交流群加不进去,网上的资源也很少,大多数不清不楚的,下面总结一下怎么能让这个微服务网关跑起来。
版本:springboot2.3.7.RELEASE,spring cloud alibaba2.2.6.RELEASE ,springcloud Hoxton.SR9
其实上面的版本作用不大,主要是springboot的版本,2和3有区别,这个我在上一个博客里面说过
引入依赖
每个服务都引入一个这个依赖即可:
<!-- knife4j-->
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-openapi3-spring-boot-starter</artifactId>
<version>4.3.0</version>
</dependency>
网关服务引入这个依赖
<!-- 文档-->
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-gateway-spring-boot-starter</artifactId>
<version>4.3.0</version>
</dependency>
其实这个时候你访问每个服务的接口文档已经可以访问到了,但是需要集成的话,需要在网关上面加这个配置
knife4j:
gateway:
enabled: true
# 指定服务发现的模式聚合微服务文档,并且是默认`default`分组
strategy: discover
discover:
enabled: true
# 指定版本号(Swagger2|OpenAPI3)
version : openapi3
# 需要排除的微服务(eg:网关服务)
excluded-services:
- ischool-gateway
出现问题
上述就是官方推荐的步骤,然而错了!!!这是我可以访问swagger数据成功的url:http://localhost:8901/user/v3/api-docs
,解释一下上面的url结构,
- user是访问前缀,我的网关会根据这个转发到user微服务上面
- v3/api-docs是openapi3规范的前缀
- default是组名
我如果不加这个组名是可以访问成功的,但是不知道为啥,knife4j访问的时候自动加上了组名default,现在变成了http://localhost:8901/user/v3/api-docs/default
,这下直接404了(我猜测它是默认default分组,但是openapi3规范不兼容,如果默认是default的话就直接省略?)。
解决方法
既然他多个default,那我就在拦截器里面把他给cut掉就可以了,在定义的网关过滤器里面加一个这样的代码(过滤器order为-1)
// 处理knife4j的uri
String path = exchange.getRequest().getURI().getPath();
if (path.contains("/v3/api-docs")) {
String newPath = path.substring(0, path.length() - "/default".length());
ServerWebExchange modifiedExchange = exchange.mutate()
.request(exchange.getRequest().mutate().path(newPath).build())
.build();
return chain.filter(modifiedExchange);
}
最后大功告成
PS
可能有些同学有自定义组的需求,我也试过了,感觉自己用的话比较鸡肋,具体就是配置式的话就是这样
# springdoc-openapi项目配置
springdoc:
swagger-ui:
path: /swagger-ui.html
tags-sorter: alpha
operations-sorter: alpha
api-docs:
path: /v3/api-docs
group-configs:
- group: 'user'
paths-to-match: '/**'
packages-to-scan: com.ischool.controller
网关还需要兼容一下
service-config:
ischool-user:
order: 0
group-name: 用户
group-names:
- 分组1
ischool-community:
order: 1
group-name: 大众点评
group-names:
- 分组2
这样的话访问数据的url就变成http://localhost:8901/user/v3/api-docs/default/组名
了,上面的切割字符串代码就不管用了,自己把default切了就行。
剩下的自定义属性和注释啥的就很简单了,openapi3的规范,我自己开发的话是懒得写......
文章评论