背景

最近在搭建微服务框架,在搭建gateway 的时候 使用nacos做注册中心,在通过网关调用的时候发下一个奇怪的问题,网关可以路由http地址,不能路由lb 的地址,路由lb 就报503。下面记录一下解决的方式。

组件版本

spring-boot-dependencies:2.6.13
spring-cloud-alibaba-dependencies:2021.0.5.0
spring-cloud-dependencies:2021.0.5

分析

先看一下gateway 配置文件信息

server:port: 8088
spring:application:name: api-gatewaycloud:#网关配置gateway:#路由配置routes:- id: order_route       #路由唯一标识uri: http://localhost:8090
#          uri: lb://order-servicepredicates:    # 断言规则- Path=/order-service/**filters:- StripPrefix=1 # 放路径访问不到 返回404#   loadbalancer:#     use404: true# nacos 地址nacos:server-addr: 192.168.57.101:8848discovery:namespace: public

当url 使用的是http://localhost:8090 时,请求接口成功。

当使用lb://order-service 时 ,接口请求就抛出503 异常

一开始我以为order服务没有注册到nacos上,去查看了一下nacos 发现服务是注册成功的。且网关和order服务也都注册到同一个namespace下且是同一个分组,不可能拿不到order服务的信息的。

为啥http 可以 lb 就不可以呢,难道spring-cloud-starter-gateway 这个配置中没有使用本地负载均衡吗。
想到这里,决定看一下服务启动时从spring-cloud-starter-gateway这个包都自动装载了哪些配置。

解决步骤

第一步:

在External libraries 中找到gateway的依赖包如下图

找到spring.factories 文件并打开,发现跟负载均衡有关系的配置类有GatewayNoLoadBalancerClientAutoConfigurationGatewayReactiveLoadBalancerClientAutoConfiguration
这两个配置类。根据名称可以知道
GatewayNoLoadBalancerClientAutoConfiguration 是不支持负载均衡客户端的自动配置类。
而GatewayReactiveLoadBalancerClientAutoConfiguration 是支持负载均衡客户端配置类。

分别查看一下这两个配置类

GatewayNoLoadBalancerClientAutoConfiguration 代码如下

可以看出这个配置类就干了一个事,向容器中注入一个NoLoadBalancerClientFilter过滤器。该过滤器的过滤方法就是当发现url 中配置的是lb 约束 时抛出NotFoundException异常。
查看创建异常方法

以为with404 这个参数从配置文件中配置的,默认值是false。所以该方法会抛出503异常。

GatewayReactiveLoadBalancerClientAutoConfiguration代码如下

查看可以得知在spring-cloud-starter-gateway jar包中缺少LoadBalancerAutoConfigurationLoadBalancerClientFactory,所以GatewayReactiveLoadBalancerClientAutoConfiguration就不会被加载,更不会注入ReactiveLoadBalancerClientFilter bean。
所以spring-cloud-starter-gateway jar 包中只会有NoLoadBalancerClientFilter 不支持负载均衡。
所以问题就定位到了,是因为缺少LoadBalancerAutoConfiguration和LoadBalancerClientFactory 导致ReactiveLoadBalancerClientFilter 不能注入到容器中。所以只要将包含LoadBalancerClientFactory 的jar包添加到pom 文件中即可。
通过查询官网文档,得知使用负载均衡需要依赖

        <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId></dependency>


添加以上依赖,重新编译,启动程序,执行请求成功。完美解决问题!

参考资料

spring cloud 官网文档

总结:

通过查看spring-cloud-starter-gateway jar中的自动配置类的源码。得知,该jar包中是不支持负载均衡的,需要引入spring-cloud-starter-loadbalancer 来支持。

解决springcloud集成nacos 使用lb 无效相关推荐

  1. springCloud集成nacos

    之前项目中用的apollo,需要换成nacos做配置和注册中心.[先将erueka的jar包依赖从pom文件移除,否则会有冲突报错] nacos文档地址:https://nacos.io/zh-cn/ ...

  2. spring-cloud集成nacos Discovery

    nacos搭建参考https://blog.csdn.net/john1337/article/details/98626255这篇文章,本文就不再赘述nacos服务的搭建过程,直接进入nacos客户 ...

  3. SpringCloudGateway 集成 nacos 整合实现动态路由_04

    接上一篇:SpringCloud Gateway 集成 oauth2 实现统一认证授权 文章目录 一.目前存在的问题 1. 问题简述 2. 集成nacos前配置 3. 前言简述 二.网关模块改造集成n ...

  4. 分布式服务框架Dubbo集成Nacos框架实现注册中心

    在讨论Nacos之前,我们先讨论一下CAP理论 CAP理论是分布式场景绕不开的重要理论 一致性:所有节点在同一时间具有一样的数据: 可用性:保证每个请求不管成功还是失败都有响应: 分区容忍性:系统中任 ...

  5. Springboot集成nacos实现服务发现和配置中心

    Nacos是阿里巴巴开源的服务发现和配置中心的中间件,springboot集成nacos比较方便,只需要以下三步: 1.依赖配置(pom文件) <properties><spring ...

  6. angularjs 让当前路由重新加载_Spring Cloud Gateway的动态路由怎样做?集成Nacos实现很简单...

    一.说明 网关的核心概念就是路由配置和路由规则,而作为所有请求流量的入口,在实际生产环境中为了保证高可靠和高可用,是尽量要避免重启的,所以实现动态路由是非常有必要的:本文主要介绍 Spring Clo ...

  7. 手动造轮子——为Ocelot集成Nacos注册中心

    前言 近期在看博客的时候或者在群里看聊天的时候,发现很多都提到了Ocelot网关的问题.我之前也研究过一点,网关本身是一种通用的解决方案,主要的工作就是拦截请求统一处理,比如认证.授权.熔断.限流.注 ...

  8. springcloud集成sentinel 《微服务》

    1.安装 1.1 docker安装 docker run --name sentinel -d -p 8858:8858 -p 8719:8719 -d bladex/sentinel-dashboa ...

  9. # SpringCloud集成 报错 An attempt was made to call a method that does not exist. The attempt was

    SpringCloud集成 报错 An attempt was made to call a method that does not exist. The attempt was made from ...

最新文章

  1. 分布式 RPC 框架
  2. mysql主从复制、redis基础、持久化和主从复制
  3. 【pmcaff】电商人必须了解的生意经:女人的生意怎么做?
  4. 计算机组成原理(哈工大刘宏伟)135讲(一)
  5. vb计算机水平考试笔试,2007年4月全国计算机等级考试二级VB笔试试卷及参考答案...
  6. 《C++字符串完全指南——第一部分:win32 字符编码》
  7. stm32单片机OLED显示图片 位图转换 Image2Lcd使用
  8. Java(Jdk1.8)通过ODBC 连接数据库(以SQLServer为例)
  9. 基础资料表:行政区划、车型库、行业类别 可下载
  10. 【Appium】手机按键(比如返回键、Home键等)的数字代号总结
  11. k8s健康检查(七)--技术流ken
  12. VS2017解决方案整理解决(一)
  13. Java微信公众平台开发之获取地理位置
  14. Long Short-Term Memory(长短期记忆网络)
  15. 如何快速提升网站排名流量
  16. IPv4 和 IPv6 报文格式详解
  17. liunx启动jar包
  18. 区块链、货币和社交扩展性 1
  19. word一行没写完就换行
  20. 变电站UWB人员定位方案

热门文章

  1. 读书笔记 | 《走出思维的误区》
  2. Qcon演讲实录 | XQUIC与多路径传输技术Multipath QUIC
  3. CAM350光绘文件检查说明
  4. rust php 扩展,在PHP程序中使用Rust扩展的方法
  5. 个人总结的Java小工具类
  6. 国外程序员推荐的免费编程书籍资源
  7. 浅谈DC-IRIS的PID控制方法
  8. Facebook购买帐号
  9. 如何利用AI技术在零售业做产品创新——京东无人超市的成长之路
  10. PostgreSQL 11 新特性之 PL/pgSQL 增强