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

SpringCloud 2023 LoadBalancer介绍、使用、获取服务列表原理、负载均衡算法

目录

  • 1. 介绍
  • 2. 使用
  • 3 获取服务列表原理
  • 4. 负载均衡算法

1. 介绍

功能:

  1. 提供客户端的负载均衡算法,将请求均摊到多个服务器上。
  2. 属于客户端负载均衡(Nginx属于服务端负载均衡),会将服务列表缓存到JVM本地,然后客户端自己选择请求服务器
  3. 支持Spring Web Flux的WebClient

2. 使用

基本使用可以参考Nacos之SpringCloud集成Nacos注册中心

3 获取服务列表原理

底层是通过DiscoveryClient动态获取所有上线的服务列表。伪代码如下:


@RestController
public class OrderController {

    @Autowired
    private DiscoveryClient discoveryClient;

    @GetMapping("/nacos/getNacosAllServiceInfo")
    public String getNacosAllServiceInfo() {
        List<String> serviceNames = discoveryClient.getServices();
        Map<String, Object> serviceMap = new HashMap<>();
        for (String serviceName : serviceNames) {
            List<ServiceInstance> serviceInstances = discoveryClient.getInstances(serviceName);
            List<Map<String,String>> serviceInstanceInfos = new ArrayList<>();
            for(ServiceInstance serviceInstance: serviceInstances) {
                Map<String, String> serviceInstanceMap = new HashMap<>();
                serviceInstanceMap.put("serviceId", serviceInstance.getServiceId());
                serviceInstanceMap.put("instanceId", serviceInstance.getInstanceId());
                serviceInstanceMap.put("host", serviceInstance.getHost());
                serviceInstanceMap.put("port", String.valueOf(serviceInstance.getPort()));
                serviceInstanceMap.put("uri", serviceInstance.getUri().toString());
                
                serviceInstanceInfos.add(serviceInstanceMap);
            }
            serviceMap.put(serviceName, serviceInstanceInfos);
        }

        return serviceMap.toString();

    }


}

访问http://localhost:8002/nacos/getNacosAllServiceInfo,返回的数据如下:

{orderment=[{instanceId=192.168.163.1#8002#DEFAULT#DEFAULT_GROUP@@orderment, port=8002, host=192.168.163.1, serviceId=orderment, uri=http://192.168.163.1:8002}], payment=[{instanceId=192.168.163.1#8001#DEFAULT#DEFAULT_GROUP@@payment, port=8001, host=192.168.163.1, serviceId=payment, uri=http://192.168.163.1:8001}]}

4. 负载均衡算法

  • 默认的轮询算法RoundRobinLoadBalancer: rest接口第几次请求数 % 服务器集群总数量 = 实际调用服务器位置下标,每次服务重启动后rest接口计数从1开始
  • 同时提供了随机算法RandomLoadBalancer的实现。切换代码如下。说明:
    • 实现了LoadBalancerConfig,会使默认的RoundRobinLoadBalancer失效
    • 要向哪个服务发送请求,就要在@LoadBalancerClient@LoadBalancerClients中定义
//@LoadBalancerClient(value = "payment1", configuration = LoadBalancerConfig.class)
@LoadBalancerClients({
        @LoadBalancerClient(value = "payment1", configuration = LoadBalancerConfig.class),
        @LoadBalancerClient(value = "payment2", configuration = LoadBalancerConfig.class),
})
public class LoadBalancerConfig {

    @Bean
    ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment,
                                                            LoadBalancerClientFactory loadBalancerClientFactory) {
        String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
        return new RandomLoadBalancer(loadBalancerClientFactory
                .getLazyProvider(name, ServiceInstanceListSupplier.class),
                name);
    }
}

http://www.kler.cn/a/326085.html

相关文章:

  • STM32设计井下瓦斯检测联网WIFI加Zigbee多路节点协调器传输
  • 241113.学习日志——[CSDIY] [ByteDance] 后端训练营 [02]
  • 使用 TensorFlow 实现 ZFNet 进行 MNIST 图像分类
  • 【MySQL】InnoDB内存结构
  • FFmpeg 4.3 音视频-多路H265监控录放C++开发十四,总结编码过程,从摄像头获得数据后,转成AVFrame,然后再次转成AVPacket,
  • hive中map_concat函数介绍
  • 【2024保研经验帖】中科院信工所夏令营经验分享
  • 【Git原理与使用】Git初识基本操作
  • 企业微信 标准年级对照表
  • Spring MVC系统学习(三)——数据绑定和响应
  • Lombok 在 IntelliJ IDEA 中的使用步骤
  • 可注射、自修复水凝胶胶粘剂:无缝合伤口闭合的新突破
  • 3. go 运算符
  • WSL2Linux 子系统(十一)
  • 简易CPU设计入门:取指令(三),ip_buf与rd_en的非阻塞赋值
  • chatgpt的ai导师风格设置
  • [ RK3566-Android11 ] 关于移植 RK628F 驱动以及后HDMI-IN图像延迟/无声等问题
  • Tesla T4 P2P测试
  • Vue 实现原生表格 tr td 动态合并 vue前端原生表格动态合并列 合并行
  • win10专业版永久关闭自动更新功能
  • Linux中配置docker环境
  • 基于Arduino的自弹尤克里里机器人
  • Apache DolphinScheduler-1.3.9源码分析(一)
  • Gromacs位置限制问题
  • 强化学习在自动驾驶技术中的应用与挑战
  • Spring 的作用和优势