SpringCloud + GateWay + Nacos访问出现404,Not Found

在学习SpringCloud Gateway时遇到404 NOT FOUND错误,原因是SpringCloud从2020版本起不再支持Ribbon。为解决此问题,需引入Spring Cloud LoadBalancer依赖。此外,配置文件中的StripPrefix过滤器用于去除路由前缀,确保正确路由到服务。例如,通过127.0.0.1:6001/goods/test/buy访问Goods-Server服务。

问题

最近在学SpringCloud,在使用GateWay作为网关时,发现注册的服务通过网关访问找不到路径出现404,NOT FOUND。
在这里插入图片描述

这个问题搞了我挺久,引起这个问题的可能原因有两个点:
1、SpringCloud从2020版本开始就不再支持Ribbon了,所以当我们使用网关时需要在网关服务上加上Ribbon依赖。

  		<!--   由于Nacos2020版之后不支持Ribbon所以通过服务名访问路由将会失败,需要引入以下依赖     -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
        </dependency>

2、由于我们在网关中设置了路由匹配及调用服务,所以我们通过网关进行访问的时候会发送到对应的服务进行接口调用,能么其中路由匹配的前缀就有可能被作为url进行访问,能么我们就需要去除前缀再进行访问,这个是可以通过GateWay进行配置的,如下:

spring:
  application:
    name: Gateway-Server
  profiles:
    active: dev
  cloud:
    nacos:
      discovery:
        server-addr: ${REGISTER_HOST:localhost}:${REGISTER_PORT:8848}
        namespace: dev
      config:
        server-addr: ${REGISTER_HOST:localhost}:${REGISTER_PORT:8848}
        file-extension: yaml
        prefix: Gateway-Server
        namespace: dev
    gateway:
      routes:
        - id: Goods-Server  # 路由 id,唯一标识
          uri: lb://Goods-Server
          predicates:
            - Path=/goods/**  # 断言,路由匹配条件,匹配 /product 开头的所有 api
          filters:
            - StripPrefix=1
        - id: Order-Server
          uri: lb://Order-Server  # 微服务名称,lb:// 表示根据微服务名称从注册中心拉去服务请求路径
          predicates:
            - Path=/order/**  # 断言,路由匹配条件,匹配 /order 开头的所有 api
          filters:
           - StripPrefix=1
        - id: User-Server
          uri: lb://User-Server  # 微服务名称,lb:// 表示根据微服务名称从注册中心拉去服务请求路径
          predicates:
            - Path=/user/**  # 断言,路由匹配条件,匹配 /order 开头的所有 api
          filters:
            - StripPrefix=1

其中起到去除前缀的配置就是
filters:
- StripPrefix=1
所以当我们利用网关路由匹配服务的时候就可以使用ip:匹配前缀 + 实际访问服务接口url
即127.0.0.1:6001/goods/test/buy
在这里插入图片描述

<think>好的,我现在需要帮助用户解决Spring Cloud Gateway返回404 NOT_FOUND错误的问题。首先,我需要整理用户提供的信息和已有的引用内容,看看有没有相关线索。 用户提到了引用[1]是关于配置Consul的配置服务器,里面设置了端口和应用名称。这可能涉及到服务发现或路由配置是否正确的问题。如果Gateway没有正确连接到Consul,或者服务名称不匹配,可能会导致路由无法解析,从而返回404错误。 引用[2]涉及@RequestMapping的请求方式,如果后端服务的控制器没有正确配置method属性,可能会导致请求无法匹配,进而Gateway转发请求时得到404。不过,这可能更多是后端服务的问题,但Gateway的配置也需要确保路由规则正确指向有效的端点。 接下来,我需要回忆常见的Spring Cloud Gateway404错误原因。通常包括以下几个方面: 1. **路由配置错误**:路由规则中的predicates或filters配置不正确,导致请求无法正确转发到目标服务。 2. **服务注册与发现问题**:如果使用服务发现(如Consul),服务名称是否匹配,服务实例是否健康且已注册。 3. **目标URI配置错误**:手动配置URI时,格式是否正确,比如是否使用了lb://服务名,或者直接URL是否正确。 4. **路径处理问题**:比如是否使用了StripPrefix过滤器,或者重写路径的配置是否正确,导致后端服务接收到的路径不符合预期。 5. **依赖或版本问题**:Spring Cloud版本兼容性问题,或者缺少必要的依赖,如Spring Cloud Starter Gateway或服务发现客户端。 6. **请求方式不匹配**:根据引用[2],如果后端服务限定了请求方法,而Gateway转发的请求方法不匹配,也可能导致404。不过这种情况通常是后端返回405,但需要确认。 现在,我需要一步步引导用户检查这些可能的方面。例如,检查路由配置的predicates是否匹配请求的路径,URI是否正确指向已注册的服务或有效的URL,是否配置了必要的过滤器来处理路径,以及服务发现是否正常工作。同时,检查日志是否有更详细的错误信息,比如转发后的URL是否正确,或者是否有连接超时等问题。 另外,用户提供的引用[1]中配置了Consul的相关信息,可能需要确认Gateway是否配置了与服务发现相关的依赖和配置,比如是否启用了服务发现功能,并且Consul服务是否正常运行,端口是否正确。例如,检查spring.cloud.gateway.discovery.locator.enabled是否为true,以及是否正确设置了服务名。 还需要考虑是否在路由配置中使用了lb://前缀来指示使用负载均衡,或者如果直接使用URL,是否格式正确。例如,如果目标服务在Consul中的名称是configserver(根据引用[1]的spring.application.name=configserver),那么在路由配置中的URI应该是lb://configserver,而不是其他名称。 最后,建议用户检查Gateway的日志,查看具体的转发细节,比如转发的目标URL是什么,是否有异常抛出。这有助于更精确地定位问题所在。</think>针对Spring Cloud Gateway返回404 NOT_FOUND错误的问题,以下是逐步排查与解决方案: --- ### **1. 检查路由配置** 路由规则是导致404的核心因素。在`application.yml`中确认: ```yaml spring: cloud: gateway: routes: - id: service_route uri: lb://SERVICE_NAME # 或直接URL如http://localhost:8080 predicates: - Path=/api/** filters: - StripPrefix=1 # 移除路径前缀/api ``` - **关键点**: - `uri`是否指向**有效服务名或地址**。若使用服务发现(如Consul),需确保服务名与注册中心一致(如引用[1]中的`spring.application.name=configserver`需对应)。 - `predicates`中的路径是否与请求路径匹配(如请求路径是否包含`/api`)。 - `filters`是否正确处理路径。例如`StripPrefix=1`会移除路径的第一部分(如将`/api/user`转为`/user`)。 --- ### **2. 验证服务发现配置** 若使用Consul/Nacos等服务发现: 1. **确认依赖已添加**: ```xml <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-consul-discovery</artifactId> </dependency> ``` 2. **检查配置**: ```properties spring.cloud.gateway.discovery.locator.enabled=true # 启用服务发现 spring.cloud.consul.host=localhost # 与引用[1]中的配置一致 spring.cloud.consul.port=8500 ``` 3. **查看服务注册状态**: - 访问Consul控制台(`http://localhost:8500`),确认目标服务已注册且状态为`healthy`。 --- ### **3. 路径重写与过滤器配置** 若后端服务路径与Gateway路径不匹配,需配置路径重写: ```yaml filters: - RewritePath=/api/(?<segment>.*), /$\{segment} # 将/api/xxx重写为/xxx ``` 或使用`StripPrefix`移除前缀: ```yaml filters: - StripPrefix=1 # 移除第一个路径段(如/api) ``` --- ### **4. 检查请求方法与端点映射** 根据引用[2],若后端服务限定了请求方法(如`@RequestMapping(method=RequestMethod.POST)`),需确保: - Gateway转发的请求方法(GET/POST等)与后端匹配。 - 后端服务的控制器路径是否与Gateway转发后的路径一致。例如,若Gateway转发到`/user`,后端需有对应的`@GetMapping("/user")`。 --- ### **5. 查看日志与调试** 在Gateway的日志中搜索关键信息: ```log 2023-10-01 12:00:00 DEBUG o.s.c.g.h.RoutePredicateHandlerMapping: Route matched: service_route 2023-10-01 12:00:00 DEBUG o.s.c.g.h.RoutePredicateHandlerMapping: Forwarding to URI: http://service-instance/path ``` - 确认路由是否匹配,以及转发的目标URI是否正确。 - 若日志显示`No instances available for service`,说明服务发现未找到可用实例(检查服务注册状态)。 --- ### **6. 版本与依赖兼容性** 确保Spring Cloud版本与Spring Boot兼容: | Spring Boot | Spring Cloud | |-------------|--------------| | 2.6.x | 2021.0.x | | 2.7.x | 2022.0.x | | 3.0.x | 2023.0.x | --- ### **总结方案** 1. **路由配置错误** → 核对`uri`和`predicates`。 2. **服务未注册** → 检查Consul控制台及依赖配置[^1]。 3. **路径不匹配** → 使用`StripPrefix`或`RewritePath`。 4. **请求方法不匹配** → 根据引用[2]核对后端接口限制[^2]。 --- 相关问题
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值