1、Dubbo支持的负载均衡策略
1)、随机:Random LoadBalance
- 随机,按权重设置随机概率。
- 在一个截面上碰撞的概率高,但调用量越大分布越均匀,而且按概率使用权重后也比较均匀,有利于动态调整提供者权重。
2)、轮询:RoundRobin LoadBalance
- 轮询,按公约后的权重设置轮询比率。
- 存在慢的提供者累积请求的问题,比如:第二台机器很慢,但没挂,当请求调到第二台时就卡在那,久而久之,所有请求都卡在调到第二台上。
3)、最少活跃调用数:LeastActive LoadBalance
- 最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差。
- 使慢的提供者收到更少请求,因为越慢的提供者的调用前后计数差会越大。
4)、一致性 Hash:ConsistentHash LoadBalance
- 一致性 Hash,相同参数的请求总是发到同一提供者。
- 当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动。
2、Dubbo负载均衡策略的优先级
上面4种配置的优先级是:
- 客户端方法级别配置。
- 客户端接口级别配置。
- 服务端方法级别配置。
- 服务端接口级别配置。
需要指出的是,Dubbo默认的负载均衡策略是随机。
3、在消费者端(客户端)配置负载策略
策略在Spring Boot项目中,只需要在请求的controller类上的注解,增加负载配置参数即可,具体代码如下:
package com.shenmazong.serverdubboconsumer.controller;import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;import com.shenmazong.service.UserService;import lombok.extern.slf4j.Slf4j;import org.apache.dubbo.config.annotation.Reference;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RestController;@RestController@Slf4jpublic class UserController { @Reference(interfaceClass = UserService.class, version = "1.0.0", check = false, loadbalance = "roundrobin") UserService userService; @GetMapping(value = "/getWelcome") @HystrixCommand(fallbackMethod = "fallBackHi") public Object getWelcome() { String msg = userService.sayHello(); System.out.println("消费者:"+msg); return msg; } public String fallBackHi() { return "熔断了...."; }}
上面代码中loadbalance = "roundrobin"的参数设置就是配置了该接口调用生产者使用轮询的策略。