JAVA · 07/01/2021

Spring项目接口偶尔报404 Not Found

问题描述

记录项目中碰到的一个小问题。问题描述:测试工程师在测试项目过程中发现会时不时出现404,起初还不相信,后来验证发现确实,而且出现的频率不算太高。

配置及请求

GET: localhost:9000/v1/auth/info?token=xxx

访问错误信息如下:

{
    "timestamp": "2021-06-29T06:46:35.477+0000",
    "status": 404,
    "error": "Not Found",
    "message": "No message available",
    "path": "/auth/info"
}

gateway的yml配置:

      routes:
        - id: auth-service
          uri: lb://auth-service
          predicates:
            - Path=/v1/auth/**
          filters:
            - StripPrefix=2
        - id: bus-service
          uri: lb://bus-service
          predicates:
            - Path=/v1/**
          filters:
            - StripPrefix=1

问题分析

起初出现问题,也不知道如何去定位,而且404没有更详细的日志,接口是经过网关访问Auth服务。

  • 查询各种日志无果

  • 后经验证发现不是Auth服务的问题,但是也很茫然,继续寻求定位问题的途径。

  • 接着增加了Zipkin连续追踪,等待404大爷的到来~

  • 查询404请求,此时发现了问题,解析的http.path是:/auth/info,但是我的auth-service匹配的是StripPrefix=2,匹配的路由难道不应该是/info吗!

于是发现了问题所在:

在匹配/v1/auth/info时,发现路由走了bus-service的/v1/**,并没有按预想的途径进行。所以此时猜想:route下的书写顺序并不能保证路由的匹配优先级,查询到order配置,增加上即可

结论:

gateway配置routes一定要增加order,数字越小优先级越高

反思原因:工具使用不熟练!