Dubbo提供四种负载均衡策略

  • 随机 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轮循
Java
@Reference(loadbalance = "roundrobin") //到注册中心中找实现类
private IDubboService dubboService;

重启消费端后刷新浏览器

轮流调用了一二三号服务器

当然我们也可以为服务端设置权重,再使用随机调用
分别在三个服务端的Service类中设置权重大小一次为100,200,300
```java
@com.alibaba.dubbo.config.annotation.Service(weight = 100) //weight为权重

在消费调用端中的DubboAction.java的@Reference注解中添加调用配置random随机,为了放大效果将消费端的循环修改为45次
 ```Java
@Reference(loadbalance = "random")  //到注册中心中找实现类

分别依次重启服务端和消费端,刷新浏览器

服务端一: 11次
服务端二: 13次
服务端三: 21次
可以看出权重大的调用的次数最多,随着数值的增多会趋近于1:2:3

剩下两种是:

LeastActive LoadBalance
最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差。
使慢的提供者收到更少请求,因为越慢的提供者的调用前后计数差会越大。

ConsistentHash LoadBalance
一致性 Hash,相同参数的请求总是发到同一提供者。
当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动。原理参考一致性Hash(Consistent Hashing)原理剖析


今天你恰柠檬了咩