SpringCloud微服务(四)

前言:此篇文章系本人学习过程中记录下来的笔记,里面难免会有不少欠缺的地方,诚心期待大家多多给予指教。

往期回顾目录:

  1. SpringCloud微服务(一)
  2. SpringCloud微服务(二)
  3. SpringCloud微服务(三)

接上期内容:下面开始进入新的组件学习,话不多说,直接发车!


一、什么是负载均衡

负载均衡(Load Balancing)是一种计算机技术,用于在多个计算资源(如服务器、网络链路等)之间分配工作负载,以优化资源使用、提高系统的响应速度、可靠性和可扩展性。简单来说就是将用户的请求平摊的分配到多个服务上,从而达到系统的高可用。

负载均衡的作用:

  1. 提高系统的可用性当一台服务器出现故障(如硬件损坏、软件崩溃等),与之相关的服务就会中断。而负载均衡器通过健康检查机制能够实时监测服务器的状态。一旦发现某台服务器不可用,就会自动将请求分配到其他正常的服务器上
  2. 提升系统的响应和性能负载均衡器将请求均匀地分配到多个服务器或资源上,避免了部分资源过度使用,而其他资源闲置的情况。
  3. 可扩展性支持:在业务增长或者流量高峰期,可以增加服务器来满足需求。负载均衡器可以很方便地将新加入的资源纳入资源池进行负载分配。
  4. 安全防护增强:隐藏真实的IP地址和服务架构,有效防止服务器被攻击的风险。

 二、SpringCloudLoadBalancer组件是什么?

Spring Cloud LoadBalancer是由SpringCloud官方提供的一个开源的、简单易用的客户端负载均衡器,它包含在SpringCloud-commons中用它来替换了以前的Ribbon组件。相比较于Ribbon,SpringCloudLoadBalancer不仅能够支持RestTemplate,还支持WebClient。详情请查看官方文档。


三、什么是客户端负载均衡?什么是服务端负载均衡?

一、客户端负载均衡

客户端负载均衡是指负载均衡的决策过程在客户端完成。客户端会维护一个可用服务端的列表,并根据一定的算法选择一个合适的服务端来发送请求。在这种模式下,客户端知道所有服务端的位置和状态等信息,并且自己负责决定将请求发送到哪一个服务端。简单来说在调用微服务接口时候,会在注册中心上获取注册信息服务列表之后缓存到JVM本地,然后在根据负载均衡算法,从而在本地实现RPC远程服务调用技术。


二、服务端负载均衡

服务端负载均衡是在服务器端进行请求分发的负载均衡方式。它有一个专门的负载均衡器位于客户端和后端服务器集群之间,负责接收客户端的请求,并根据一定的算法将请求分配到后端的一个或多个服务器进行处理。比如Nginx,然后由Nginx实现转发到相应的服务端。


 四、负载均衡案例实操

一、修改cloud-consume-order8002

  1. 修改8002的pom.xml文件,导入LoadBalancer依赖(记得刷新maven)
            <!--负载均衡 loadbalancer-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-loadbalancer</artifactId>
            </dependency>
  2. 在8002下面新增LoadBalancerTestController.java文件
  3. 将SpringBoot项目加入到idea自带的service管理中。步骤一:步骤二:步骤三:步骤四:

二、新增cloud-provider-payment8003

为了能够更为直观地呈现负载均衡的实际成效,现准备采用两个支付服务作为示例进行演示。新增该服务的两种方式:1、拷贝一个8001服务,只修改包名和端口号,其他文件不动。2、使用idea自带的功能,开启两个实例服务。(我采用的方式2)。

  1. 新增cloud-provider-payment8003。两种方式:1、拷贝一个8001服务,只修改包名和端口号,其他文件不动。2、使用idea自带的功能,开启一个虚拟的服务。(我采用的方式2)。步骤一:步骤二:步骤三:实际上,8003服务用的也是8001的服务,只不过端口号不一样而已。
  2. 启动8001、8002、8003,观察对应服务是否成功入注consulcloud-provider-payment有两个实例,代表8001、8003都已经成功入注consul。
  3. 访问http://localhost:8002/consume/loadBalancer/get/info,连续请求两次得到不同的端口号,说明负载均衡配置已经生效了。

五、负载均衡算法学习

一、SpringCloudLoadBalancer默认算法是什么?

SpringCloudLoadBalancer组件默认算法是轮询。答案不是空穴来风,来自官方文档


二、负载均衡算法有几种

目前学习两种,一是轮询,二是随机。当然还可以自定义,因此,没法说清楚具体有几种。


三、负载均衡算法切换实操

一、轮询算法(默认)

由源码知道负载均衡器顶层接口是ReactiveLoadBalancer,官方文档知道默认算法为轮询,可以利用RestTemplate测试一下(简单测试)。

  1. 修改8001中的RestTemplateConfig文件,拷贝官方文档中的代码。官方文档提供的是随机算法需要做一点修改
  2. 重新启动8002,访问http://localhost:8002/consume/loadBalancer/get/info,第一次请求测试:第二次请求测试:第三次请求测试:由此可见服务确实是在8001、8003有规律循环请求。

二、随机算法

  1. 修改8001中的RestTemplateConfig文件,将轮询的代码注释掉,直接拷贝官方文档提供的代码。
  2. 重新启动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:努力到底,让持续学习成为贯穿一生的坚守。学习笔记持续更新中。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

啥也不会的小神龙·

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值