Dubbo 基础篇(三) - 负载均衡策略

开发环境
  • 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);
    }
}

可以看到成功注册了两个服务提供者

zookeeper注册信息
测试结果
  • 始终返回Service2,并没有进行随机

负载均衡通常由中心协调者进行策略分配,在没有中心节点时,是否由消费端来决定负载策略为好。

上一篇:Dubbo 基础篇(二) - 约定和目录

Github工程地址

你可能感兴趣的:(Dubbo 基础篇(三) - 负载均衡策略)