开发环境
- eclipse 4.7.3a
- jdk 8
- zookeeper-3.5.4-beta
- maven 3.5.2
- dubbo 2.7.0-SNAPSHOT
负载均衡
dubbo 提供了多种负载均衡的策略,在org.apache.dubbo.rpc.cluster.loadbalance
包下可以找到dubbo 提供的扩展实现:
- 随机(random): 根据权重设置随机概率。
- 一致性hash(consistenthash): 根据hash值,每次总是请求到同一个服务提供者。
- 轮询(roundrobin):根据权重比例依次调用所有的服务提供者。
- 最少活跃调用(leastactive):请求服务提供者的计数差, 相同活跃数的随机。
dubbo 同时提供了服务端和客户端的负载均衡
配置负载均衡
服务端注解方式配置
@Service(timeout = 5000, loadbalance="random")
public class DemoServiceImpl implements DemoService
{
@Override
public String sayHello(String name)
{
return "Service1 -> Hello " + name;
}
}
客户端注解方式配置
指定@Reference注解引用的路径
@DubboComponentScan(basePackages = "github.freeseawind.springboot.helloworld.consumer")
接口注入
@Reference(loadbalance="random")
private DemoService demoService;
负载均衡案例研究
服务提供者代码:
@Service(timeout = 5000)
public class DemoServiceImpl implements DemoService
{
@Override
public String sayHello(String name)
{
return "Service1 -> Hello " + name;
}
}
@Service(timeout = 5000)
public class DemoServiceImpl2 implements DemoService
{
@Override
public String sayHello(String name)
{
return "Service2 -> Hello " + name;
}
}
服务消费者:
@Reference
private DemoService demoService;
@Test
public void testRPC()
{
for(int i = 0; i < 100; i++)
{
System.out.println(demoService.sayHello("freeseawind"));
}
}
1. 服务端优先还是客户端优先
测试用例
- 创建两个服务提供者,使用随机访问策略
- 创建一个服务消费者,使用一致性hash策略
- 请求100次服务提供者
测试结果
- 随机返回 Service1 和service2
总结
服务提供者负载均衡策略优先级高于消费者。
2. 服务提供者混合策略的副作用
测试用例
- 创建两个服务提供者,其中一个使用一致性hash策略,另外一个使用随机策略
- 创建一个服务消费者,使用随机策略
- 请求100次服务提供者
测试结果
- 返回使用一致性hash策略的服务提供者的响应结果
3. 单节点伪集群
测试用例
- 使用一个web服务加载两个服务提供者,使用随机访问策略
- 创建一个服务消费者,使用随机访问策略
- 请求100次服务提供者
启动代码
@SpringBootApplication
@EnableAutoConfiguration
@DubboComponentScan(basePackages = "github.freeseawind.service.**")
public class ProviderApplication
{
public static void main(String[] args)
{
SpringApplication.run(ProviderApplication.class, args);
}
}
可以看到成功注册了两个服务提供者
测试结果
- 始终返回Service2,并没有进行随机
负载均衡通常由中心协调者进行策略分配,在没有中心节点时,是否由消费端来决定负载策略为好。