dubbo学习笔记—dubbo中的负载均衡
1.负载均衡基本配置
- 负载均衡(Load Balance), 其实就是将请求分摊到多个操作单元上进行执行,从而共同完成工作任务。
- 负载均衡策略主要用于客户端存在多个提供者时进行选择某个提供者。
- 在集群负载均衡时,Dubbo 提供了多种均衡策略(包括随机、轮询、最少活跃调用数、一致性Hash),缺省为random随机调用。
- 官方链接: ttp://dubbo.apache.org/zh-cn/docs/user/demos/loadbalance.html
2.负载均衡基本配置实战
在服务消费者一方配置负载均衡策略
//在服务消费者一方配置负载均衡策略 @Reference(check = false,loadbalance = "random")
在服务提供者一方配置负载均衡
//在服务提供者一方配置负载均衡 @Service(loadbalance = "random") public class HelloServiceImpl implements HelloService { public String sayHello(String name) { return "hello " + name; } }
3.自定义负载均衡器
- 负载均衡器在Dubbo中的SPI接口是
org.apache.dubbo.rpc.cluster.LoadBalance
, 可以通过实现这个接口来实现自定义的负载均衡规则。 - 配置负载均衡器在
dubbo-spi-loadbalance
工程的META-INF/dubbo
目录下新建org.apache.dubbo.rpc.cluster.LoadBalance
文件,并将当前类的全名写入(org.apache.dubbo.rpc.cluster.LoadBalance
是扩展点,扩展点里面写的内容是扩展点的实现类)onlyFirst=com.lagou.loadbalance.OnlyFirstLoadbalancer
- 在服务提供者工程实现类中编写用于测试负载均衡效果的方法 启动不同端口时 方法返回的信息不同
public class OnlyFirstLoadbalancer implements LoadBalance { @Override public <T> Invoker<T> select(List<Invoker<T>> invokers, URL url, Invocation invocation) throws RpcException { //所有的服务提供者,都按照IP+端口的排序,选择第一个,所以我们就要从List列表中找到调用者,找到关于服务的调用信息 return invokers.stream().sorted((i1,i2)->{ final int IpCompare = i1.getUrl().getIp().compareTo(i2.getUrl().getIp()); if (IpCompare==0){ return Integer.compare(i1.getUrl().getPort(),i2.getUrl().getPort()); } return IpCompare; }).findFirst().get(); } }
- 启动多个服务 要求他们使用同一个接口注册到同一个注册中心 但是他们的dubbo通信端口不同
- 在服务消费方指定自定义负载均衡器
onlyFirst
/** * 消费者组件 * @author yh */ @Component public class ComsumerComponet { @Reference(loadbalance = "onlyFirst") private HelloService helloService; public String sayHello(String name){ return helloService.sayHello(name); } }
- 测试自定义负载均衡的效果