spring boot版本2.7.0,spring cloud alibba版本2021.0.5.0,spring cloud 版本2021.0.3
在通过网关将请求转发至其他服务时,网关报错:503 SERVICE_UNAVAILABLE Unable to find instance for xxx
先检查服务是否都处于一个命名空间下且有正常实例
既然服务没问题,那么就排查一下网关路由是否配置错误
spring:
# nacos注册配置
cloud:
nacos:
discovery:
# 配置命名空间
namespace: xxxxxxxxxxxxxxxxxxxxx
# 分组
group: ${spring.cloud.nacos.config.group}
gateway:
discovery:
locator:
# 让gateway根据注册中心找到其他服务
enabled: true
routes:
# 配置服务名称
- id: test
# 转发到哪个服务
uri: lb://test
# 谓词、用于匹配请求的条件
predicates:
- Path=/test/**
# 过滤器、用于修改请求或响应. 例子中,RewritePath 过滤器用于重写路径
filters:
- RewritePath=/test/(?<segment>.*), /$\{segment}
发现配置也无任何问题,配置的服务名称也与实例服务名称对应,这就很奇怪了
接下来就开始排查是否nacos转发的问题,将gateway网关路由配置中转发服务的配置改为ip,不从nacos上查找服务
启动!访问!接口转发成功!那就可以确定问题了
查阅了相关资料发现从Spring Cloud 2020开始弃用了Ribbon,因此Spring Cloud Alibaba在2021版本nacos中删除了Ribbon的jar包,因此无法通过lb路由到指定微服务,出现了503情况
所以我们要手动添加依赖让"lb"可用
<!--客户端负载均衡loadbalancer-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
如果项目中使用的是feign还要添加对应的依赖
<!--fegin组件 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!-- Feign Client for loadBalancing -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-loadbalancer</artifactId>
</dependency>