Dubbo提供四种负载均衡策略 [toc]
- 随机 Random LoadBalance
- 轮询 RoundRobin LoadBalance
- 最少活跃调用数(权重)LeastActive LoadBalance
活跃数指调用前后计数差,优先调用高的,相同活跃数的随机。使慢的提供者收到更少请求,因为越慢的提供者的调用前后计数差会越大。 - 一致性Hash ConsistentHash LoadBalance
1. 准备工作
编写三个Dubbo号不同的服务提供端,三个服务提供端中有相同的业务处理方法,不同服务端有不同的服务端口号
Tomcat端口号必须不同
服务端一:
spring.dubbo.application.name=server
spring.dubbo.registry.address=zookeeper://127.0.0.1:2181
spring.dubbo.protocol.name=dubbo
spring.dubbo.protocol.port=20880
server.port=7070
spring.dubbo.server=true
spring.dubbo.scan=com.service
服务端二:
spring.dubbo.application.name=server
spring.dubbo.registry.address=zookeeper://127.0.0.1:2181
spring.dubbo.protocol.name=dubbo
spring.dubbo.protocol.port=20881
server.port=7071
spring.dubbo.server=true
spring.dubbo.scan=com.service
服务端三:
spring.dubbo.application.name=server
spring.dubbo.registry.address=zookeeper://127.0.0.1:2181
spring.dubbo.protocol.name=dubbo
spring.dubbo.protocol.port=20882
server.port=7072
spring.dubbo.server=true
spring.dubbo.scan=com.service
三个服务端中有相同的调用方法,但返回的数字分别为1、2、3:
package com.service;
import org.springframework.stereotype.Service;
@Service
@com.alibaba.dubbo.config.annotation.Service //加入这个后才能调用远程注册方法
public class DubboService implements IDubboService { //远程调用必须实现接口
int i = 0;
@Override
public int test(){
System.out.println("---------01");
return 1;
}
}
编写一个消费者调用端进行调用方法进行测试,服务端返回的数字存入List数组中
package com.action;
import com.alibaba.dubbo.config.annotation.Reference;
import com.service.IDubboService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import sun.rmi.server.LoaderHandler;
import java.util.ArrayList;
import java.util.List;
@RestController
public class DubboAction {
@Reference //到注册中心中找实现类
private IDubboService dubboService;
@RequestMapping("/test")
public String test(){
List<Integer> list = new ArrayList<Integer>();
for (int i=0;i<8;i++){
int z = dubboService.test();
list.add(z);
}
return list.toString();
}
}
2. 开始测试
依次启动三个服务端后,再启动消费端
在浏览器中调用方法
从数组中的数字可以看出确实调用了不同服务中的Test方法
默认情况下,dubbo 是 random load balance 随机调用实现负载均衡
在消费调用端中的DubboAction.java的@Reference注解中添加调用配置,默认为random随机,我们修改为roundrobin轮循
@Reference(loadbalance = "roundrobin") //到注册中心中找实现类
private IDubboService dubboService;
重启消费端后刷新浏览器
轮流调用了一二三号服务器
当然我们也可以为服务端设置权重,再使用随机调用
分别在三个服务端的Service类中设置权重大小一次为100,200,300
@com.alibaba.dubbo.config.annotation.Service(weight = 100) //weight为权重
在消费调用端中的DubboAction.java的@Reference注解中添加调用配置random随机,为了放大效果将消费端的循环修改为45次
@Reference(loadbalance = "random") //到注册中心中找实现类
分别依次重启服务端和消费端,刷新浏览器
服务端一: 11次
服务端二: 13次
服务端三: 21次
可以看出权重大的调用的次数最多,随着数值的增多会趋近于1:2:3
剩下两种是:
LeastActive LoadBalance
最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差。
使慢的提供者收到更少请求,因为越慢的提供者的调用前后计数差会越大。
ConsistentHash LoadBalance
一致性 Hash,相同参数的请求总是发到同一提供者。
当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动。原理参考一致性Hash(Consistent Hashing)原理剖析