Spring cloud gateway 设置context-path服务路由404排查

本文深入探讨了SpringCloud Gateway在整合Knife4j时遇到的404错误问题,详细分析了context-path设置的影响及路由机制的工作原理,并提供了多种解决方案,包括配置调整、源码分析及自定义过滤器的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、背景

    最近做网关重构,技术选型为spring cloud gateway,采用consul作为配置中心和注册中心,秉承不重启原则,网关内部实现动态路由机制,采用定时任务定时更新网关路由信息。

 

二、服务信息

   微服务网关:spring-cloud-gateway

   微服务:order-service、user-service

 

三、问题描述

   因为网关服务集成了knife4j,因此可以通过访问http://网关ip:port/doc.html,即可访问所有在同一个注册中心的服务的knife4j信息,但是实际访问时用户服务相关接口报404错误。

 

四、问题排查

  1、排查发现order-service未设置server.servlet.context-path,user-service有设置;

  2、验证context-path的影响发现在路由设置时path字段值必须加前缀再截取才可以正常路由;

  3、由于公司网关是既有产品,当前是技术框架重构,因此不能改动原来接口访问路径,因此不可以在原有路径前面再加前缀;

  排查源码发现请求会经过

FilteringWebHandler的
filter方法,此方法

在路由过程中会走12个过滤器,其中第5个过滤器

RewritePathGatewayFilterFactory中的
apply方法会匹配服务启动时加载的
regexp正则,从而对服务path进行改写。

源码如下:

 

五、解决方案

1)若配置路由URI为lb,则注册中心服务名称不能和server.servlet.context-path名称一致,否则contextPath会被改写为空字符串;

2)若注册中心和server.servlet.context-path必须一致,则断言中设置Path时需在contextPath前包装一层前缀,且Filter中需截取第一个字符串;

3)禁止gateway网关主动从consul拉取路由信息并设置默认过滤器,该操作会设置默认过滤规则,reWritePath匹配正则修改请求路径

      在启动类添加注解:

     

 @SpringBootApplication( exclude = org.springframework.cloud.gateway.discovery.GatewayDiscoveryClientAutoConfiguration.class) 

4)推荐使用

   重写过滤链(只需添加如下配置):

   

spring.cloud.gateway.discovery.locator.filters[0]=PreserveHostHeader

 

### 解决 Spring Cloud Gateway 配置完成后访问报错 404 的方法 当遇到 Spring Cloud Gateway 访问接口返回 404 错误的情况时,通常是因为路由配置不正确或者路径映射存在问题。以下是详细的排查和解决办法: #### 1. 检查 `servlet.context-path` 设置 如果项目中设置了 `server.servlet.context-path` 属性,则实际的 API 请求路径将会变为 `${context.path}/api`[^1]。因此,在定义网关路由时应考虑此上下文路径的影响。 #### 2. 确认路由 ID 对齐方式 确保在 `application.yml` 文件中的 `routes` 下面定义的每条路由前都有连字符 `-` 并且与其他项保持水平对齐。不对齐可能会引发诸如 503 这样的错误而不是 404,但这也是配置不当的表现之一[^3]。 ```yaml spring: application: name: getway-service cloud: gateway: routes: - id: pms-route # 注意这里的 '-' 符号要与 'routes' 对齐 uri: lb://pms-service predicates: - Path=/pms/** ``` #### 3. 处理多级断言规则顺序 对于具有不同层次结构的服务路由(例如 coupon_route 和 product_route),应该按照从高到低的优先级来排列这些路由。更具体的模式应当位于较早的位置以便先被匹配处理,从而避免因次序问题引起的 404 错误[^5]。 #### 4. 核实 URI 地址准确性 确认所使用的负载均衡器 (`lb`) 后端服务名称是否已在 Nacos 或其他注册中心成功注册并可用。此外还要验证目标微服务的实际 URL 是否拼写无误,并能通过直连方式进行正常通信测试。 #### 5. 排除跨域影响因素 虽然这不是直接引起 404 的原因,但如果存在 CORS (Cross-Origin Resource Sharing) 相关设置不合理的话也可能间接造成前端无法获取资源而显示为 404 页面。可以参照特定版本下的最佳实践调整相应的头信息和其他参数以支持跨源资源共享需求[^2]。 #### 6. 审视文件上传场景特殊性 如果是涉及到大文件传输或者其他复杂表单提交操作的情况下,请特别留意是否有额外的数据转换逻辑或中间件干扰到了原始 HTTP POST 请求体的内容完整性,进而导致接收方找不到预期的目标处理器函数[^4]。 综上所述,以上几点可以帮助定位并修复由 Spring Cloud Gateway 引起的 404 响应码异常状况。建议逐一审查上述方面直至找到确切的原因所在。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值