目录
1、随机,通过随机的方式进行服务调用,一般使用较少。
2、轮询,ribbon负载均衡默认的使用方式,请求来了之后排队处理。需要注意的是本地轮询是没问题,但放到云上以后,服务器会默认按照当前区域进行轮询,如成都区域的服务器会在该区域内进行优先轮询,而不会直接调度轮询到浙江区域的服务器。
3、加权轮询,通过对服务器性能的分析,给高配置、低负载的服务器分配更高的权重,均衡各服务器的压力。
4、地址Hash,通过客户端请求的地址的Hash值取模进行服务器调度。ip-->hash。
5、最小连接数,即使请求均衡了,压力不一定会均衡,最小连接数法就是根据服务器的情况,将请求分配到当前压力最小的服务器上。通过最小活跃数确定对象。
负载均衡策略是基于服务消费方来实现的。
由于Nacos依赖自动集成了ribbon的负载均衡组件,这里就不再赘述,详情见我的Nacos的配置使用篇。这里我们采用了openFeign进行服务间远程的调用,详情见我的openFeign篇的使用案例。
这里我们开启4个服务进行实验,我们通过访问服务调用方来调用以下三个服务。
这四个服务均注册到了Nacos中进行管理。
此时我们清空所有服务的控制台打印。通过ApiPost进行访问测试。
15次请求调用中,可以看到通过轮询负载均衡3个服务提供方均被调用了5次 。
可以看出Ribbon默认使用了轮询进行负载均衡。
方法一:基于配置类实现
此时为全局生效
- package com.dragonwu.stock.ribbon;
-
- import com.netflix.loadbalancer.IRule;
- import com.netflix.loadbalancer.RandomRule;
- import org.springframework.context.annotation.Bean;
- import org.springframework.context.annotation.Configuration;
-
- /**
- * @author DragonWu
- * @date 2022-09-30 13:29
- **/
- @Configuration
- public class RibbonRandomRuleConfig {
-
- @Bean
- //方法名一定要叫iRule
- public IRule iRule(){
- return new RandomRule();
- }
- }
再次测试就可以看到对应的负载均衡效果了。
方法二:通过配置文件实现,同时适用于局部,推荐
- # 部分服务的负载均衡策略配置
- test-service:
- ribbon:
- NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule
重启运行,在nacos中配置权重
20次访问测试,结果检查:
结果可以看到NacosRule采用的是随机权重的负载均衡策略,权重越高访问概率越高
权重0.2的被访问2次
权重0.7的被访问17次
权重为0.1的被访问了1次
测试次数越多会越接近于该百分比。这便是随机权重负载均衡策略。