Springcloud Alibaba自定义负载平衡详解

[复制链接]
发表于 2025-7-2 05:43:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
重要说一下springcloud alibaba 在使用nacos注册中央过程中,哀求服务负载平衡的设置方法

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

`
  1. <dependency>
  2.       <groupId>org.springframework.cloud</groupId>
  3.       <artifactId>spring-cloud-starter-loadbalancer</artifactId>
  4.       <version>XXX</version>
  5.   </dependency>`
复制代码
默认情况下,负载平衡不需要设置,默认轮询策略,假如我们想改,怎么做呢

先说一下springcloud LoadBalance原理及结构

1、负载平衡器的管理
ReactorLoadBalancer<ServiceInstance> 这就是一个服务绑定的负载平衡器,为每一个服务创建一个负载平衡实体类,实现服务的隔离,虽然我也不知道为啥要如许做
2、工厂来管理负载平衡器
  1. LoadBalancerClientFactory  
复制代码
这个工厂相当于管理所有的负载平衡器,你可以通过getInstance方法拿到你的服务名绑定的负载平衡器
3、负载平衡器
  1. ReactorServiceInstanceLoadBalancer
复制代码
每一个负载平衡器都实现了这个接口 ,内部定义了choose方法,外部就可以用他的choose方法来找到一个服务
类结构讲完了 怎么自定义一个新的负载平衡器呢

这里就需要一个设置类
  1. @Configuration
  2. public class FeignForceLoadBalancerConfig {
  3. @Bean
  4. public ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment,
  5.     LoadBalancerClientFactory loadBalancerClientFactory) {
  6.     String serviceId = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
  7.     System.out.println("Init RandomLoadBalancer for service: " + serviceId);
  8.     return new RandomLoadBalancer(
  9.         loadBalancerClientFactory.getLazyProvider(serviceId, ServiceInstanceListSupplier.class),
  10.         serviceId);
  11. }
复制代码
这里就注册了一个随机策略的负载平衡器,这也是springcloud实现了的,自己定义的话可能需要自己实现接口了
怎么用呢?

上面说了负载平衡器和服务绑定在一起的,所以说还是得声明一下绑定关系
1、随便找个设置类, 加个注解,就分析这个服务走这个负载平衡器
  1. @LoadBalancerClient(value="service-product",configuration = FeignForceLoadBalancerConfig.class)
复制代码
不知道为啥他要这么设计,反正挺恶心, 一个负载平衡器和服务绑定,多个负载平衡器就得写多个设置类
这个时候你再在客户端哀求service-product服务,那就会走loadbalance,不论你是通过RestTemplate哀求还是通过LoadBalanceClient哀求服务
附上一个调用链图

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

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表