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

目录

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的实现。切换代码如下。说明:
//@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.niftyadmin.cn/n/5684881.html

相关文章

多处理器的概念与对比

SISD, SIMD, MISD, 和 MIMD 代表了并行计算的四种基本架构&#xff0c;它们描述了处理器如何处理指令和数据。 理解这些架构的关键在于区分指令流&#xff08;Instruction Stream&#xff09;和数据流&#xff08;Data Stream&#xff09;是单一的还是多重的。 1. SISD (Singl…

Web APIs 3:事件流、事件委托

Web APIs 3&#xff08;事件流、事件委托&#xff09; 1.事件流 事件流&#xff1a;事件完整执行过程中的流动路径捕获阶段&#xff1a;从DOM根元素开始去执行对应的事件&#xff08;从外到里&#xff09; DOM.addEventListener(事件类型&#xff0c;事件处理函数&#xff0…

redis和mysql端口修改

因为之前有过被删库勒索的情况所以&#xff0c;今天记录一下怎么修改端口。 redis 要修改Redis的端口&#xff0c;您需要编辑Redis配置文件&#xff0c;通常名为redis.conf。 找到Redis配置文件&#xff1a; 在Linux系统上&#xff0c;该文件通常位于/etc/redis/redis.conf…

生产环境升级mysql流程及配置主从服务

之前写到过mysql升级8.4的文章, 因此不再介绍mysql的安装过程 避免服务器安装多个mysql引起冲突的安装方法_安装两个mysql会冲突吗-CSDN博客 生产环境升级mysql8.4.x流程 安装mysql 参考之前文章: 避免服务器安装多个mysql引起冲突的安装方法_安装两个mysql会冲突吗-CSDN博客…

阳光能源嵌入式面试及参考答案(2万字长文)

管道能够承载的最大传输数据量是多少? 在嵌入式系统中,管道能够承载的最大传输数据量取决于多个因素。 首先,管道的容量受到操作系统的限制。不同的操作系统对管道的大小有不同的规定。一般来说,管道的容量通常是有限的,并且在不同的操作系统版本和配置下可能会有所不同。…

在 C++ std::set 中如何利用不同类型的值进行搜索?

在 C 集合中如何利用不同类型的值进行搜索 一、背景二、初衷三、is_transparent四、总结 一、背景 C14 引入了一项引人注目的功能&#xff0c;为关联容器弥补了某些案例中长久以来的不足之处&#xff1a;即允许使用在语义上被视为键&#xff0c;但在技术上并非真正键的值对关联…

技术成神之路:设计模式(十八)适配器模式

介绍 适配器模式&#xff08;Adapter Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许接口不兼容的类可以协同工作&#xff0c;通过将一个类的接口转换成客户端所期望的另一个接口&#xff0c;使得原本由于接口不兼容而不能一起工作的类可以一起工作。 1.定义 适配…

mysql怎么修改一个字段中的所有部分数据

UPDATE videos SET VideoCode replace(VideoCode,flv,mp4); update 表名 set 字段名 replace&#xff08;字段名&#xff0c;‘修改前’&#xff0c;‘修改后’&#xff09;&#xff1b;