业务服务中设置了 server.servlet.context-path 导致 gateway代理出问题
spring:
cloud:
gateway:
routes:
- id: server-user
uri: lb://server-user
predicates:
- Path=/api/user/**
- 原来的 user 服务中没有 配置 server.servlet.context-path 一切正常
- 配置了 server.servlet.context-path 之后接口访问不到了
{
"code": 404,
"message": "Failed to handle request [GET http://localhost:200/api/user/user/login?userName=tn]: 404 NOT_FOUND",
"data": null,
"ts": 1597483157725,
"success": false
}
解决方法
- 所有业务服务不再配置 contextPath (推荐)
更改配置文件,所有业务的 contextPath 路径层数最好一样 (主要是因为要去适配swagger,如果接口文档时手写的就没有这么麻烦,直接 Path=/api/server-user/ 改为 Path=/api/server-user/conttextPath/ 就行了)
设置 contextPath 跟 spring.application.name 设置
server:
port: 1003 #端口
servlet:
context-path: /user
spring:
application:
name: server-user
修改gateway的路由 注意: - Path= context-path 且 - StripPrefix=0(统一设置,如果业务服务的context-path不一样,就得在rotet里单独设置
filters: - StripPrefix=n
) ```yaml spring: cloud: gateway: routes:- id: server-user
uri: lb://server-user
predicates:
- Path=/api/server-user/** ##这样主要是为了适配swagger 要不然swagger的测试功能无法使用,因为接口路径少了一部分
- Path=/user/**
- id: server-basic
uri: lb://server-basic
predicates:
- Path=/api/server-basic/** ##这样主要是为了适配swagger 要不然swagger的测试功能无法使用,因为接口路径少了一部分
- StripPrefix=0
- name: AuthFilter
args:
excludePatterns: #不做权限校验的路径
- /server-user/userInfo/login
- /server-basic/openFeign/test01
- id: server-user
uri: lb://server-user
predicates:
```