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

问题再现:

2023-08-15 16:51:16,151 DEBUG [reactor-http-nio-2][CompositeLog.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-2][GatewayMetricsFilter.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-2][Loggers.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-2][Loggers.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-2][LogFormatUtils.java:91] - [dc73b32c-1] Completed 503 SERVICE_UNAVAILABLE

2023-08-15 16:51:16,195 DEBUG [reactor-http-nio-2][Loggers.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-2][Loggers.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-2][Loggers.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.failover][FailoverReactor.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-0][PropertySourcesPropertyResolver.java:115] - Found key 'spring.profiles.active' in PropertySource 'configurationProperties' with value of type String

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

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

2023-08-15 16:51:17,003 DEBUG [PollingServerListUpdater-0][DynamicServerListLoadBalancer.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

重启服务即可

相关推荐
丁总学Java几秒前
nohup java -jar productQualification.jar --spring.profiles.active=prod $
java·spring·jar
lfl183261621603 分钟前
thingsboard 自定义html
java·前端·html
中國移动丶移不动9 分钟前
Java 并发编程:原子类(Atomic Classes)核心技术的深度解析
java·后端
小马爱打代码28 分钟前
Tomcat整体架构分析
java·架构·tomcat
m0_5485030329 分钟前
【Java Web】Tomcat 快速入门
java·前端·tomcat
畅联云平台35 分钟前
美畅物联丨如何通过视频汇聚平台汇聚视频并推送至上级28181平台
服务器·网络·音视频
李少兄1 小时前
如何从远程Maven仓库下载JAR包并手动放置到本地仓库
java·maven·jar
CodeMartain1 小时前
stream流的toMap
java·开发语言
ling1s1 小时前
C#核心(18)面向对象多态vob
java·开发语言·c#
sin22011 小时前
idea创建springBoot的五种方式
java·spring boot·intellij-idea