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

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()                                                    ││                                                                │└────────────────────────────────────────────────────────────────┘
http://www.lryc.cn/news/2396520.html

相关文章:

  • 深度学习---负样本训练
  • SpringAI+DeepSeek大模型应用开发实战
  • 【Python Cookbook】文件与 IO(一)
  • STM32 HAL库函数学习 GPIO篇
  • 如何以 9 种方式将照片从 iPhone 传输到笔记本电脑
  • 根据jvm源码剖析类加载机制
  • Mixly1.0/2.0/3.0 (windows系统) 安装教程及使用常见问题解决
  • DDS通信中间件——DDS-TSN规范
  • JWT安全:弱签名测试.【实现越权绕过.】
  • MATLAB实现井字棋
  • Baklib知识中台加速企业服务智能化实践
  • 在AIX环境下修改oracle 11g rac的IP地址
  • VMware Tools 手动编译安装版
  • android平台驱动开发(六)--Makefile和Kconfig简介
  • 【手写系列】手写线程池
  • python学习打卡day40
  • redis高并发问题
  • Live Helper Chat 安装部署
  • ARXML解析与可视化工具
  • PnP(Perspective-n-Point)算法 | 用于求解已知n个3D点及其对应2D投影点的相机位姿
  • LeetCode 热题 100 208. 实现 Trie (前缀树)
  • python爬虫:RoboBrowser 的详细使用
  • 在日常管理服务器中如何防止SQL注入与XSS攻击?
  • Wkhtmltopdf使用
  • ArcGIS Pro 创建渔网格网过大,只有几个格网的解决方案
  • 重学计算机网络之以太网
  • 《深度解构现代云原生微服务架构的七大支柱》
  • 使用SCSS实现随机大小的方块在页面滚动
  • AI 眼镜新纪元:贴片式TF卡与 SOC 芯片的黄金组合破局智能穿戴
  • 论文阅读(六)Open Set Video HOI detection from Action-centric Chain-of-Look Prompting