首页 > 其他分享 >05-LoadBalancer负载均衡

05-LoadBalancer负载均衡

时间:2024-10-01 22:45:42浏览次数:1  
标签:负载 05 spring consul LoadBalancer 均衡 cloud 客户端

1.Ribbon目前也进入维护模式

1.1 Ribbon介绍

Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具。

简单的说,Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法和服务调用。Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。简单的说,就是在配置文件中列出Load Balancer(简称LB)后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随机连接等)去连接这些机器。我们很容易使用Ribbon实现自定义的负载均衡算法。

https://github.com/Netflix/ribbon

1.2 Ribbon替代方案


spring-cloud-loadbalancer

2.spring-cloud-loadbalancer概述

2.1 官网

2.2 是什么

LB负载均衡(Load Balance)是什么

简单的说就是将用户的请求平摊的分配到多个服务上,从而达到系统的HA(高可用),常见的负载均衡有软件NginxLVS,硬件F5

spring-cloud-starter-loadbalancer组件是什么

Spring Cloud LoadBalancer是由SpringCloud官方提供的一个开源的、简单易用的客户端负载均衡器,它包含在SpringCloud-commons中用它来替换了以前的Ribbon组件。相比较于Ribbon,SpringCloud LoadBalancer不仅能够支持RestTemplate,还支持WebClient(WeClient是Spring Web Flux中提供的功能,可以实现响应式异步请求)。

https://docs.spring.io/spring-cloud-commons/reference/spring-cloud-commons/loadbalancer.html

2.3 面试题

loadbalancer本地负载均衡客户端 VS Nginx服务端负载均衡区别

Nginx是服务器负载均衡,客户端所有请求都会交给nginx,然后由nginx实现转发请求,即负载均衡是由服务端实现的。

loadbalancer本地负载均衡,在调用微服务接口时候,会在注册中心上获取注册信息服务列表之后缓存到JVM本地,从而在本地实现RPC远程服务调用技术。

个人理解,客户端负载均衡,是由客户端,选择向那台机器发起请求,并获得响应。而服务端负载均衡,是由服务器端(nginx),决定某个请求,由那台机器处理,然后响应给客户端。

3.spring-cloud-loadbalancer负载均衡解析

3.1 理论


LoadBalancer 在工作时分成两步:

第一步,先选择ConsulServer从服务端查询并拉取服务列表,知道了它有多个服务(上图3个服务),这3个实现是完全一样的,

默认轮询调用谁都可以正常执行。类似生活中求医挂号,某个科室今日出诊的全部医生,客户端你自己选一个。

第二步,按照指定的负载均衡策略从server取到的服务注册列表中由客户端自己选择一个地址,所以LoadBalancer是一个客户端的负载均衡器。

3.2 实操

3.2.1 官网参考如何正确使用

https://docs.spring.io/spring-cloud-commons/reference/spring-cloud-commons/loadbalancer.html


3.2.2 按照8001拷贝新建8002

3.2.3 启动Consul,然后启动8001和8002

启动Consul

consul agent -dev

获取在consul中配置的测试信息,通过8001或8002接口

bug

在consul中的配置重启后,消失了

3.2.4 Consul数据持久化配置并注册为Window服务

1.在consul.exe的同级目录下,新建mydata文件夹

2.新建consul_start.bat文件

@echo.Consul Start......  
@echo off  
@sc create Consul binpath= "D:\Develop\consul\consul.exe agent -server -ui -bind=127.0.0.1 -client=0.0.0.0 -bootstrap-expect  1  -data-dir D:\Develop\consul\mydata   "
@net start Consul
@sc config Consul start= AUTO  
@echo.Consul start is OK......success
@pause

3.管理员权限打开

4.启动结果

5.win后台

会多出consul服务

6.后续consul的配置数据会保存到mydata文件夹

3.2.5 修改Order模块

1.引入依赖

<!--loadbalancer-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

2.新增接口

@GetMapping(value = "/consumer/pay/get/info")
public  String getInfoByConsul() {
    return restTemplate.getForObject(PAYMENT_SRV_URL + "/pay/get/info", String.class);
}

3.consul服务


4.测试

http://localhost:8080/consumer/pay/get/info

访问改接口,可见交替访问8001和8002

3.3 小总结

3.3.1 使用DiscoveryClient动态获取上线的服务列表

3.3.2 订单模块新增代码
@Resource
private DiscoveryClient discoveryClient;

@GetMapping("/discovery")
public String discovery() {
    //获取所有的consul中的服务名
    List<String> services = discoveryClient.getServices();
    for (String element : services) {
        System.out.println(element);
    }
    System.out.println("===================================");
	//获取key服务的所有服务实例
    List<ServiceInstance> instances = discoveryClient.getInstances("cloud-payment-service");
    for (ServiceInstance element : instances) {
        //服务实例名 + 服务主机名 + 服务端口号 + 服务url
        System.out.println(element.getServiceId() + "\t" + element.getHost() + "\t" + element.getPort() + "\t" + element.getUri());
    }

    return instances.get(0).getServiceId() + ":" + instances.get(0).getPort();
}

输出信息

cloud-consumer-order
cloud-payment-service
consul
===================================
cloud-payment-service	x	8001	http://x:8001 x是主机名
cloud-payment-service	x	8002 	http://x:8002

3.3.3 负载均衡原理小总结

负载均衡算法:rest接口第几次请求数 % 服务器集群总数量 = 实际调用服务器位置下标 ,每次服务重启动后rest接口计数从1开始。

List<ServiceInstance> instances = discoveryClient.getInstances("cloud-payment-service");
//如
List [0] instances = 127.0.0.1:8002
List [1] instances = 127.0.0.1:8001

8001+ 8002 组合成为集群,它们共计2台机器,集群总数为2, 按照轮询算法原理:

当总请求数为1时: 1 % 2 =1 对应下标位置为1 ,则获得服务地址为127.0.0.1:8001

当总请求数位2时: 2 % 2 =0 对应下标位置为0 ,则获得服务地址为127.0.0.1:8002

当总请求数位3时: 3 % 2 =1 对应下标位置为1 ,则获得服务地址为127.0.0.1:8001

当总请求数位4时: 4 % 2 =0 对应下标位置为0 ,则获得服务地址为127.0.0.1:8002

如此类推......

4.负载均衡算法原理

4.1 默认算法,有几种

4.1.1 官网

https://docs.spring.io/spring-cloud-commons/reference/spring-cloud-commons/loadbalancer.html#switching-between-the-load-balancing-algorithms

4.1.2 默认两种


轮询

public class RoundRobinLoadBalancer implements ReactorServiceInstanceLoadBalancer

随机

public class RoundRobinLoadBalancer implements ReactorServiceInstanceLoadBalancer 

源码

略,见org.springframework.cloud.client.loadbalancer.reactive.ReactiveLoadBalancer接口

4.2 算法切换

@LoadBalancerClient(value = "cloud-payment-service",configuration = RestTemplateConfig.class)
public class RestTemplateConfig {

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }

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

}

The classes you pass as @LoadBalancerClient or @LoadBalancerClients configuration arguments should either not be annotated with @Configuration or be outside component scan scope.

在RestTemplateConfig的类上,有@LoadBalancerClient或者@LoadBalancerClients,就不该在使用@Configuration注解了,包含了。

Configuration(proxyBeanMethods = false)
@Import(LoadBalancerClientConfigurationRegistrar.class)
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface LoadBalancerClient 
@Configuration(proxyBeanMethods = false)
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE })
@Documented
@Import(LoadBalancerClientConfigurationRegistrar.class)
public @interface LoadBalancerClients

只是为了记录自己的学习历程,且本人水平有限,不对之处,请指正。

标签:负载,05,spring,consul,LoadBalancer,均衡,cloud,客户端
From: https://www.cnblogs.com/changming06/p/18444219

相关文章

  • Day05数据类型
    数据类型;1.强类型语言,要求变量的使用要严格符合规定,所有变量都必须先定义后才能使用;​JAVA就是强类型语言2.弱类型语言。八大数据类型注意:在表示long类型时,数后面有L表示float类型时,数后面有F字节位(bit):是计算机内部数据储存的最小单位,11001100......
  • NAT模式 LVS负载均衡群集部署
    目录NAT模式LVS负载均衡群集部署1.关闭所有虚拟机的防火墙和核心防护2.部署共享存储nfs(ip:192.168.110.20)3.配置nginx节点服务器(192.168.110.70,192.168.110.80)4.配置tomcat节点服务器(192.168.110.50,192.168.110.60)4.配置负载调度器(内网关ens33:192.168.110.10,外网关ens......
  • (洛谷)题目题号P1047 [NOIP2005 普及组] 校门外的树
    Hello大家好我是小亦,这是今天发布的第二篇题解,唉我就在想怎么样才能把粉丝提上来呢隔壁朋友都比我高了好多唉苦恼qwq,好吧接受现实,好那么好今天我们来讲的是来自于NOIP2005年普及组的真题名叫:校门外的树,其实这道题跟其他几道题很相似,应该是同一家的吧qwq,好了不废话了思路给大家q......
  • P6105 [Ynoi2010] y-fast trie
    这可能也是一个关于匹配的经典trick。题意给定常数\(C\),你需要维护一个集合\(S\),支持以下操作:1x,加入数\(x\),保证\(x\)之前不存在。2x,删除数\(x\),保证\(x\)之前存在。每次操作后你需要回答$$\max_{i,j\inS,i\not=j}(i+j)\bmodC$$\(Q\le5\times10^5\),强制在......
  • 3805 谁拿了最多的奖学金 结构体排序
    解决思路 定义结构体:定义一个结构体 Student 来存储每个学生的信息和奖金总数。 读取输入:读取每个学生的信息,并计算每个学生的奖金总数。 3. 排序:根据奖金总数对学生进行排序,如果奖金总数相同,则按输入顺序排序。 输出结果:输出获得最多奖金的学生的姓名、奖金......
  • Python - [05] 爬虫
    题记部分 001||爬虫的工作原理(1)获取数据。爬虫程序会根据提供的网址,向服务器发起请求,然后返回数据。(2)解析数据。爬虫程序会把服务器返回的数据解析成我们能读懂的格式。(3)提取数据。爬虫程序再从中提取出我们需要的数据。(4)储存数据。爬虫程序把这些有用的数据保存起来,......
  • 南沙C++信奥赛陈老师解一本通题 2005:【20CSPJ普及组】直播获奖
    ​ 【题目描述】NOI2130即将举行。为了增加观赏性,CCF决定逐一评出每个选手的成绩,并直播即时的获奖分数线。本次竞赛的获奖率为 w%w%,即当前排名前 w%w% 的选手的最低成绩就是即时的分数线。更具体地,若当前已评出了 pp 个选手的成绩,则当前计划获奖人数为 max(1,⌊p∗w%......
  • 负载箱:充电桩测试利器
    RCD负载箱是用于测试和验证电气设备在故障状态下的性能的设备。它可以模拟真实的负载情况,从而帮助工程师和技术人员对设备进行准确的检测和维护。此外,RCD负载箱也是一种重要的安全保护设备,主要用于防止电路中的漏电现象引发的事故。它通常被安装在电路的起始位置,作为主断路器或分......
  • 返利机器人在电商返利系统中的负载均衡实现
    返利机器人在电商返利系统中的负载均衡实现大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!今天我们来聊一聊如何在电商返利系统中实现返利机器人的负载均衡,尤其是在面对高并发和大量数据处理场景时,如何通过合理的架构设计确保系统的高可用性与......
  • P10589 楼兰图腾(树状数组)
    #include<bits/stdc++.h>usingnamespacestd;#definexfirst#defineysecondtypedefpair<int,int>PII;typedeflonglongll;typedefunsignedlonglongull;typedefunsignedintuint;typedefvector<string>VS;typedefvector<int>......