当前位置: 首页 > news >正文

Springcloud Alibaba自定义负载均衡详解

主要说一下springcloud alibaba 在使用nacos注册中心过程中,请求服务负载均衡的配置方法

引入依赖包 这个依赖包是springcloud在新版本的负载均衡实现,2020版本以上

`

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId><version>XXX</version></dependency>`
默认情况下,负载均衡不需要配置,默认轮询策略,如果我们想改,怎么做呢
先说一下springcloud LoadBalance原理及结构

1、负载均衡器的管理
ReactorLoadBalancer<ServiceInstance> 这就是一个服务绑定的负载均衡器,为每一个服务创建一个负载均衡实体类,实现服务的隔离,虽然我也不知道为啥要这样做
2、工厂来管理负载均衡器

LoadBalancerClientFactory  

这个工厂相当于管理所有的负载均衡器,你可以通过getInstance方法拿到你的服务名绑定的负载均衡器
3、负载均衡器

ReactorServiceInstanceLoadBalancer

每一个负载均衡器都实现了这个接口 ,内部定义了choose方法,外部就可以用他的choose方法来找到一个服务

类结构讲完了 怎么自定义一个新的负载均衡器呢

这里就需要一个配置类

@Configuration
public class FeignForceLoadBalancerConfig {@Bean
public ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment,LoadBalancerClientFactory loadBalancerClientFactory) {String serviceId = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);System.out.println("Init RandomLoadBalancer for service: " + serviceId);return new RandomLoadBalancer(loadBalancerClientFactory.getLazyProvider(serviceId, ServiceInstanceListSupplier.class),serviceId);
}

这里就注册了一个随机策略的负载均衡器,这也是springcloud实现了的,自己定义的话可能需要自己实现接口了

怎么用呢?

上面说了负载均衡器和服务绑定在一起的,所以说还是得声明一下绑定关系
1、随便找个配置类, 加个注解,就说明这个服务走这个负载均衡器

@LoadBalancerClient(value="service-product",configuration = FeignForceLoadBalancerConfig.class)

不知道为啥他要这么设计,反正挺恶心, 一个负载均衡器和服务绑定,多个负载均衡器就得写多个配置类

这个时候你再在客户端请求service-product服务,那就会走loadbalance,不论你是通过RestTemplate请求还是通过LoadBalanceClient请求服务

附上一个调用链图

                        ┌────────────────────────────┐│  @LoadBalancerClient       ││  name="service-product"    ││  config = CustomLBConfig   │└────────────┬───────────────┘│┌───────────────────────────▼──────────────────────────┐│ Spring Context 注入 Bean:                             ││ ReactorLoadBalancer<ServiceInstance>                 ││ → 例如 RandomLoadBalancer                            ││ → 由 CustomLBConfig 中的 @Bean 方法提供              │└───────────────────────────┬──────────────────────────┘│┌──────────────────▼───────────────────┐│ LoadBalancerClientFactory             ││ - 管理每个服务对应的负载类实例       ││ - 按 serviceId 提供策略               │└──────────────────┬───────────────────┘│┌──────────────────────────▼──────────────────────────┐│ ReactorServiceInstanceLoadBalancer.choose(request) ││ (通用选择接口,最终调用你配置的策略类)           │└──────────────────────────┬──────────────────────────┘│┌────────────────────────────────▼────────────────────────────────┐│                                                                ││    Feign 调用链:                                              ││    FeignClient → LoadBalancerFeignClient → choose()           ││                                                                ││    RestTemplate 调用链:                                       ││    RestTemplate + @LoadBalanced → LoadBalancerInterceptor →   ││    choose()                                                    ││                                                                │└────────────────────────────────────────────────────────────────┘

相关文章:

  • ESP8266常用指令
  • Kerberos面试内容整理-会话密钥的协商与使用
  • 华为OD机试真题——生成哈夫曼树(2025A卷:100分)Java/python/JavaScript/C/C++/GO六种最佳实现
  • 华为OD机试真题——模拟消息队列(2025A卷:100分)Java/python/JavaScript/C++/C语言/GO六种最佳实现
  • 工业物联网中的事件驱动采样架构及优化
  • 墨香阁小说阅读前端项目
  • 基于Sqoop的MySQL-Hive全量/增量同步解决方案(支持多表批量处理
  • 训练中常见的运动强度分类
  • 大语言模型值ollama使用(1)
  • WPS快速排版
  • uni-app学习笔记十六-vue3页面生命周期(三)
  • 【Java】分页工具类
  • Kafka ACK机制详解:数据可靠性与性能的权衡之道
  • 让大模型看得见自己的推理 — KnowTrace结构化知识追踪
  • SOC-ESP32S3部分:21-非易失性存储库
  • 【深度学习】15. Segment Anything Model (SAM) :基于提示的分割新时代
  • 密码编码器使用指南
  • Torch Geometric环境下无线通信网络拓扑推理节点数据缺失实验
  • YOLOv8 移动端升级:借助 GhostNetv2 主干网络,实现高效特征提取
  • MySQL中count(1)和count(*)的区别及细节
  • 给别人做网站的销售叫什么/百度最新版下载
  • 怎么查网站是不是百度做的/西安今日头条最新新闻
  • 做网站广告费/360优化大师官方官网
  • 淘客怎样做自己的网站/站长工具友链查询
  • b2c 电子商务网站的经营特点/个人网页怎么制作
  • 上海卫生人才网官网/十大seo公司