Nacos和GateWay路由转发NotFoundException: 503 SERVICE_UNAVAILABLE “Unable to find

问题再现:

2023-08-15 16:51:16,151 DEBUG reactor-http-nio-2CompositeLog.java:147 - dc73b32c-1 Encoding {timestamp=Tue Aug 15 16:51:16 CST 2023, path=/content/course/list, status=503, error=Service Unavai (truncated)...

2023-08-15 16:51:16,175 TRACE reactor-http-nio-2GatewayMetricsFilter.java:115 - gateway.requests tags: tag(httpMethod=POST),tag(httpStatusCode=503),tag(outcome=SERVER_ERROR),tag(routeId=content-api),tag(routeUri=lb://content-api),tag(status=SERVICE_UNAVAILABLE)

2023-08-15 16:51:16,187 DEBUG reactor-http-nio-2Loggers.java:254 - id: 0xdc73b32c, L:/127.0.0.1:63010 - R:/127.0.0.1:53113 Decreasing pending responses, now 0

2023-08-15 16:51:16,190 DEBUG reactor-http-nio-2Loggers.java:249 - id: 0xdc73b32c, L:/127.0.0.1:63010 - R:/127.0.0.1:53113 Last HTTP packet was sent, terminating the channel

2023-08-15 16:51:16,192 DEBUG reactor-http-nio-2LogFormatUtils.java:91 - dc73b32c-1 Completed 503 SERVICE_UNAVAILABLE

2023-08-15 16:51:16,195 DEBUG reactor-http-nio-2Loggers.java:249 - id: 0xdc73b32c, L:/127.0.0.1:63010 - R:/127.0.0.1:53113 Last HTTP response frame

2023-08-15 16:51:16,203 DEBUG reactor-http-nio-2Loggers.java:254 - id: 0xdc73b32c, L:/127.0.0.1:63010 - R:/127.0.0.1:53113 FluxReceive{pending=0, cancelled=true, inboundDone=false, inboundError=null}: dropping frame DefaultLastHttpContent(data: PooledSlicedByteBuf(ridx: 0, widx: 53, cap: 53/53, unwrapped: PooledUnsafeDirectByteBuf(ridx: 296, widx: 296, cap: 2048)), decoderResult: success)

2023-08-15 16:51:16,205 DEBUG reactor-http-nio-2Loggers.java:259 - id: 0xdc73b32c, L:/127.0.0.1:63010 - R:/127.0.0.1:53113 onUncaughtException(SimpleConnection{channel=id: 0xdc73b32c, L:/127.0.0.1:63010 - R:/127.0.0.1:53113})

java.io.IOException: 远程主机强迫关闭了一个现有的连接。

at sun.nio.ch.SocketDispatcher.read0(Native Method)

at sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:43)

at sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:223)

at sun.nio.ch.IOUtil.read(IOUtil.java:192)

at sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:379)

at io.netty.buffer.PooledByteBuf.setBytes(PooledByteBuf.java:253)

at io.netty.buffer.AbstractByteBuf.writeBytes(AbstractByteBuf.java:1134)

at io.netty.channel.socket.nio.NioSocketChannel.doReadBytes(NioSocketChannel.java:350)

at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:151)

at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:719)

at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:655)

at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:581)

at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:493)

at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989)

at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)

at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)

at java.lang.Thread.run(Thread.java:750)

2023-08-15 16:51:16,432 DEBUG com.alibaba.nacos.naming.failoverFailoverReactor.java:147 - failover switch is not found, failover00-00---000-VIPSRV_FAILOVER_SWITCH-000---00-00

2023-08-15 16:51:17,002 DEBUG PollingServerListUpdater-0PropertySourcesPropertyResolver.java:115 - Found key 'spring.profiles.active' in PropertySource 'configurationProperties' with value of type String

2023-08-15 16:51:17,003 DEBUG PollingServerListUpdater-0HostReactor.java:306 - failover-mode: false

2023-08-15 16:51:17,003 DEBUG PollingServerListUpdater-0DynamicServerListLoadBalancer.java:241 - List of Servers for content-api obtained from Discovery client: \[\]

2023-08-15 16:51:17,003 DEBUG PollingServerListUpdater-0DynamicServerListLoadBalancer.java:246 - Filtered List of Servers for content-api obtained from Discovery client: \[\]

问题前提的环境配置:

首先我的nacos上都已经成功注册上了两个服务

其中Gateway的nacos上的配置和本地的配置分别为

XML 复制代码
server:
  port: 63010 # 网关端口
spring:
  cloud:
    gateway:
      discovery:
        locator:
          lowerCaseServiceId: true
          # 让gateway根据注册中心找到其他服务
          enabled: true
      routes: 
        - id: content-api # 路由id,自定义,只要唯一即可
          uri: lb://content-api # 路由的目标地址 lb就是负载均衡,后面跟服务名称
          predicates: # 路由断言,也就是判断请求是否符合路由规则的条件
            - Path=/content/** # 这个是按照路径匹配,只要以/content/开头就符合要求
        - id: system-api
          uri: lb://system-api
          predicates:
            - Path=/system/**
XML 复制代码
#微服务配置
spring:
  application:
    name: gateway
  cloud:
    nacos:
      server-addr: 192.168.101.65:8848
      discovery:
        namespace: ${spring.profiles.active}
        group: EducationPlatform-project
      config:
        namespace: ${spring.profiles.active}
        group: EducationPlatform-project
        file-extension: yaml
        refresh-enabled: true
        shared-configs:
          - data-id: logging-${spring.profiles.active}.yaml
            group: EducationPlatform-common
            refresh: true
  profiles:
    active: dev11

而content-api的nacos上的配置和本地的配置分别为

XML 复制代码
server:
  servlet:
    context-path: /content
  port: 63040

test_config:
 a: 3a
 b: 3b

#配置本地优先
spring:
 cloud:
  config:
    override-none: true
XML 复制代码
#微服务配置
spring:
  application:
    name: content-api
  cloud:
    nacos:
      server-addr: 192.168.101.65:8848
      discovery:
        namespace: ${spring.profiles.active}
        group: EducationPlatform
        username: nacos
        password: nacos
      config:
        namespace: ${spring.profiles.active}
        group: EducationPlatform
        file-extension: yaml
        refresh-enabled: true
        extension-configs:
          - data-id: content-service-${spring.profiles.active}.yaml
            group: EducationPlatform
            refresh: true
        shared-configs:
          - data-id: swagger-${spring.profiles.active}.yaml
            group: EducationPlatform-common
            refresh: true
          - data-id: logging-${spring.profiles.active}.yaml
            group: EducationPlatform-common
            refresh: true
  profiles:
    active: dev11

而发送了一个这个请求

问题解决:

首先可以在idea里快速的按两下shift,然后搜这个方法名,打个断点看看方法能不能送到这里来,可以看到我这的uri已经是有了的,证明配置和服务都没有问题,问题缩小到路由转发出了问题。

其次这两个问题报错也让我们要注意的问题就是转发问题

Zone aware logic disabled or there is only one zone
NotFoundException: 503 SERVICE_UNAVAILABLE "Unable to find instance for content-api

一、pom配置

因为路由转发配置上用到了lb: ,这个是负载均衡的标志,而在Spring Cloud 2020版本以后,就移除了Ribbon负载均衡器,官方默认推荐使用Spring Cloud Loadbalancer正式替换Ribbon。因此我们需要把Spring Cloud Loadbalancer加载到pom里面

XML 复制代码
<!--客户端负载均衡loadbalancer-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
            <optional>true</optional>
        </dependency>

实在不行的再加载这两个

XML 复制代码
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

二、小细节

我是加上了pom都还不行的,而后面发现我的group是不同的,在nacos中group的作用就是区分不同类型的配置文件,进行分组管理

相同Data Id而不同Group的意义就在相当于相同的目录下不同的文件,不同group直接的服务调用是只能通过额外config里配置

因此解决办法就是把nacos中的group的后缀都改成-project,本地配置中的也改了然后实在不行的话Gateway配置上再添加上lowerCaseServiceId: true

重启服务即可

相关推荐
程序猿老A21 分钟前
轻量应用服务器总是CPU 100%怎么办?
服务器
艾伦_耶格宇26 分钟前
【kubernetes - 1.28版本】-11 K8S核心组件
java·容器·kubernetes
2301_7807896641 分钟前
深度伪造即服务:新型网络诈骗的“完美面具”与识别之道
java·网络·ddos
LHICOD1 小时前
Linux-2
java·linux·后端·jar·vmware·svm·vm
香蕉大香蕉(06敬畏市场)1 小时前
MySQL 单点详解(03)
java·数据库·mysql·面试·八股·大厂实习
余额瞒着我当琳1 小时前
Linux初识:Linux的历史,计算机的发展脉络,发行版本,选购云服务器,安装Xshell,第一次连接,基础命令指南
linux·运维·服务器
呆呆敲代码的小Y1 小时前
【实战精选面试题】C# 面试题详细解答,按难易程度排序
android·java·游戏·c#·游戏开发·unity面试题·c#面试题
垆边人似月.1 小时前
RDMA 文件传输踩坑(四):从固定延时改造为 READY/ACK 协议
linux·服务器·网络
水无痕simon2 小时前
3、工程重构
java·spring cloud·重构
阿里云基础软件2 小时前
Agent 任务提速 10.71%,内存占用降低 21.60%|Alibaba Cloud Linux 4 重大发布
java·linux·人工智能·操作系统·agent