1. 业务服务中设置了 server.servlet.context-path 导致 gateway代理出问题

    1. spring:
    2. cloud:
    3. gateway:
    4. routes:
    5. - id: server-user
    6. uri: lb://server-user
    7. predicates:
    8. - Path=/api/user/**
    1. 原来的 user 服务中没有 配置 server.servlet.context-path 一切正常
    2. 配置了 server.servlet.context-path 之后接口访问不到了
      1. {
      2. "code": 404,
      3. "message": "Failed to handle request [GET http://localhost:200/api/user/user/login?userName=tn]: 404 NOT_FOUND",
      4. "data": null,
      5. "ts": 1597483157725,
      6. "success": false
      7. }
  2. 解决方法

    1. 所有业务服务不再配置 contextPath (推荐)
    2. 更改配置文件,所有业务的 contextPath 路径层数最好一样 (主要是因为要去适配swagger,如果接口文档时手写的就没有这么麻烦,直接 Path=/api/server-user/ 改为 Path=/api/server-user/conttextPath/ 就行了)

      1. 设置 contextPath 跟 spring.application.name 设置

        1. server:
        2. port: 1003 #端口
        3. servlet:
        4. context-path: /user
        5. spring:
        6. application:
        7. name: server-user
      2. 修改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的测试功能无法使用,因为接口路径少了一部分

          • Path=/basic/** default-filters:

            注意这里 原来写的是2

        • StripPrefix=0
        • name: AuthFilter args: excludePatterns: #不做权限校验的路径
          • /server-user/userInfo/login
          • /server-basic/openFeign/test01

```