前言:此篇文章系本人学习过程中记录下来的笔记,里面难免会有不少欠缺的地方,诚心期待大家多多给予指教。
往期回顾目录:
接上期内容:下面开始进入新的组件学习,话不多说,直接发车!
一、什么是负载均衡
负载均衡(Load Balancing)是一种计算机技术,用于在多个计算资源(如服务器、网络链路等)之间分配工作负载,以优化资源使用、提高系统的响应速度、可靠性和可扩展性。简单来说就是将用户的请求平摊的分配到多个服务上,从而达到系统的高可用。
负载均衡的作用:
- 提高系统的可用性:当一台服务器出现故障(如硬件损坏、软件崩溃等),与之相关的服务就会中断。而负载均衡器通过健康检查机制能够实时监测服务器的状态。一旦发现某台服务器不可用,就会自动将请求分配到其他正常的服务器上
- 提升系统的响应和性能:负载均衡器将请求均匀地分配到多个服务器或资源上,避免了部分资源过度使用,而其他资源闲置的情况。
- 可扩展性支持:在业务增长或者流量高峰期,可以增加服务器来满足需求。负载均衡器可以很方便地将新加入的资源纳入资源池进行负载分配。
- 安全防护增强:隐藏真实的IP地址和服务架构,有效防止服务器被攻击的风险。
二、SpringCloudLoadBalancer组件是什么?
Spring Cloud LoadBalancer是由SpringCloud官方提供的一个开源的、简单易用的客户端负载均衡器,它包含在SpringCloud-commons中用它来替换了以前的Ribbon组件。相比较于Ribbon,SpringCloudLoadBalancer不仅能够支持RestTemplate,还支持WebClient。详情请查看官方文档。
三、什么是客户端负载均衡?什么是服务端负载均衡?
一、客户端负载均衡
客户端负载均衡是指负载均衡的决策过程在客户端完成。客户端会维护一个可用服务端的列表,并根据一定的算法选择一个合适的服务端来发送请求。在这种模式下,客户端知道所有服务端的位置和状态等信息,并且自己负责决定将请求发送到哪一个服务端。简单来说在调用微服务接口时候,会在注册中心上获取注册信息服务列表之后缓存到JVM本地,然后在根据负载均衡算法,从而在本地实现RPC远程服务调用技术。
二、服务端负载均衡
服务端负载均衡是在服务器端进行请求分发的负载均衡方式。它有一个专门的负载均衡器位于客户端和后端服务器集群之间,负责接收客户端的请求,并根据一定的算法将请求分配到后端的一个或多个服务器进行处理。比如Nginx,然后由Nginx实现转发到相应的服务端。
四、负载均衡案例实操
一、修改cloud-consume-order8002
- 修改8002的pom.xml文件,导入LoadBalancer依赖(记得刷新maven)
<!--负载均衡 loadbalancer--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-loadbalancer</artifactId> </dependency>
- 在8002下面新增LoadBalancerTestController.java文件
- 将SpringBoot项目加入到idea自带的service管理中。步骤一:
步骤二:
步骤三:
步骤四:
二、新增cloud-provider-payment8003
为了能够更为直观地呈现负载均衡的实际成效,现准备采用两个支付服务作为示例进行演示。新增该服务的两种方式:1、拷贝一个8001服务,只修改包名和端口号,其他文件不动。2、使用idea自带的功能,开启两个实例服务。(我采用的方式2)。
- 新增cloud-provider-payment8003。两种方式:1、拷贝一个8001服务,只修改包名和端口号,其他文件不动。2、使用idea自带的功能,开启一个虚拟的服务。(我采用的方式2)。步骤一:
步骤二:
步骤三:
实际上,8003服务用的也是8001的服务,只不过端口号不一样而已。
- 启动8001、8002、8003,观察对应服务是否成功入注consul
cloud-provider-payment有两个实例,代表8001、8003都已经成功入注consul。
- 访问http://localhost:8002/consume/loadBalancer/get/info,
连续请求两次得到不同的端口号,说明负载均衡配置已经生效了。
五、负载均衡算法学习
一、SpringCloudLoadBalancer默认算法是什么?
SpringCloudLoadBalancer组件默认算法是轮询。答案不是空穴来风,来自官方文档
二、负载均衡算法有几种
目前学习两种,一是轮询,二是随机。当然还可以自定义,因此,没法说清楚具体有几种。
三、负载均衡算法切换实操
一、轮询算法(默认)
由源码知道负载均衡器顶层接口是ReactiveLoadBalancer,官方文档知道默认算法为轮询,可以利用RestTemplate测试一下(简单测试)。
- 修改8001中的RestTemplateConfig文件,拷贝官方文档中的代码。
官方文档提供的是随机算法,需要做一点修改
- 重新启动8002,访问http://localhost:8002/consume/loadBalancer/get/info,第一次请求测试:
第二次请求测试:
第三次请求测试:
由此可见服务确实是在8001、8003有规律循环请求。
二、随机算法
- 修改8001中的RestTemplateConfig文件,将轮询的代码注释掉,直接拷贝官方文档提供的代码。
- 重新启动8002,访问http://localhost:8002/consume/loadBalancer/get/info,第一次请求测试:
第二次请求测试:
第三次请求测试:
由此可见服务确实是在8001、8003随机请求。
三、自定义算法
实现ReactorServiceInstanceLoadBalancer接口即可(省略),一般来说这两个算法足够了。
四、负载均衡算法原理总结
一、轮询算法
rest接口第几次请求数 % 服务器集群总数量 = 实际调用服务器位置下标,每次服务重启后,rest接口计数从1开始。
8001+ 8003 组合成集群,共计两台服务器,按照轮询算法原理:
当总请求数为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
.......
以上结论来自源码,然后经过自己理解,并非空穴来风
二、随机算法
随机顾名思义就是在consul上入注的该服务总数,然后随机取一个。。
六、总结
通过学习 LoadBalancer 组件,掌握了负载均衡相关知识和技术要点,具备了在实际项目中根据不同业务需求、系统架构情况去选择合适的负载均衡算法、实现方式以及应对各类挑战的能力。在未来的工作中,可以运用这些知识助力构建高性能、高可用且可灵活扩展的分布式应用系统,为提升系统整体服务质量发挥重要作用。
ps:努力到底,让持续学习成为贯穿一生的坚守。学习笔记持续更新中。。。。