概念

dubbo负载均衡官网介绍:
中文官网介绍的非常的详细
https://dubbo.apache.org/zh/docs/v2.7/user/examples/loadbalance/

四种策略

Random LoadBalance

  • 随机,按权重设置随机概率。
  • 在一个截面上碰撞的概率高,但调用量越大分布越均匀,而且按概率使用权重后也比较均匀,有利于动态调整提供者权重。

RoundRobin LoadBalance

  • 轮询,按公约后的权重设置轮询比率。
  • 存在慢的提供者累积请求的问题,比如:第二台机器很慢,但没挂,当请求调到第二台时就卡在那,久而久之,所有请求都卡在调到第二台上。

LeastActive LoadBalance

  • 最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差。

  • 使慢的提供者收到更少请求,因为越慢的提供者的调用前后计数差会越大。

    假如说A B C三个服务提供者, 每个服务都记录自己当前有几个请求正在处理,
    假如说A服务现在有三个请求正在处理, B服务有一个请求正在处理 ,C服务有四个请求正在处理. 那么consumer发起调用的时候会调用B服务,因为B服务正在处理的请求最少
    如果A B C 这三个provider ,A和B服务有1个正在处理的请求,C服务有2个正在处理的请求. 那么A和B服务都是最小活跃调用数,而且两个数都是一样的,都是1,那么consumer就对A和B这两个最小活跃调用数随机找一台出来进行调用,.

    消费者是怎么知道每个provider服务正在执行的最小请求数呢?

  1. 消费者会缓存所调用服务的所有提供者,这个是从注册中心去查询的

  2. 比如记为p1、p2、p3三个服务提供者对象,每个提供者对象内都有一个提供者服务url属性,一个属性记为active,默认位0

  3. 消费者在第一次调用次服务时,如果负载均衡策略是leastactive,因为是第一次调用,三台服务的提供者都是0,那么直接就随机找出一台进行调用否则的话消费者端会判断缓存的所有服务提供者的active,选择最小的,如果都相同,则随机.

  4. 选出某一个服务提供者后,假设服务是p2服务,Dubbo就会对p2服务的active属性进行+1操作,然后再发出请求调用该服务

  5. 消费端收到响应结果后,对p2服务的active属性-1操作

  6. 这样服务的消费端就完成了对某个服务提供者当前活跃调用数进行了统计,并且并不影响服务调用的性能

ConsistentHash LoadBalance

  • 一致性 Hash,相同参数的请求总是发到同一提供者。

  • 当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动。

使用

负载均衡可以在服务发起者服务定义的时候配,也可以在消费者那里配置.

如果在消费端和服务端同时都配置了负载均衡策略,以消费端的配置为准(服务端的配置不生效)。

在生产者配置

类上面的@Service注解有个loadbalance属性

//loadbalance = "roundrobin"  配置负载均衡算法,默认是随机,roundrobin是轮训
@Service(version = "default" ,loadbalance = "roundrobin")
public class DefaultDemoService implements DemoService {@Overridepublic String sayHello(String name) {System.out.println("执行了服务" + name);URL url = RpcContext.getContext().getUrl();return String.format("%s:%s, Hello, %s", url.getProtocol(), url.getPort(), name);  // 正常访问}}

在消费者配置

引用dobbo接口的@Reference 注解有个loadbalance属性

@SpringBootApplication
public class DubboConsumerDemo  {//loadbalance 负载均衡配置,默认是随机,roundrobin是轮训@Reference(version = "default",loadbalance = "roundrobin")private DemoService demoService;public static void main(String[] args)  {ConfigurableApplicationContext context = SpringApplication.run(DubboConsumerDemo.class);DemoService demoService = context.getBean(DemoService.class);System.out.println((demoService.sayHello("周瑜")));}}

代码地址和测试

https://gitee.com/zjj19941/ZJJ_Dubbo.git

下载下来看load-balancing项目,
然后先启动两个provider ,注意要修改provider的配置文件的server.port和dubbo.protocol.port 这两个属性,不要重复了,不然会出现端口占用.

然后看一下zookeeper发现有两个provider.

然后执行consumer类的DubboConsumerDemo方法,注意观察控制台,发现被随机调用了.

dubbo:20881, Hello, 周瑜
dubbo:20880, Hello, 周瑜
dubbo:20881, Hello, 周瑜
dubbo:20880, Hello, 周瑜
dubbo:20881, Hello, 周瑜
dubbo:20880, Hello, 周瑜
dubbo:20881, Hello, 周瑜
dubbo:20880, Hello, 周瑜
dubbo:20881, Hello, 周瑜
dubbo:20880, Hello, 周瑜
dubbo:20881, Hello, 周瑜
dubbo:20880, Hello, 周瑜
dubbo:20881, Hello, 周瑜

观察provider控制台,也发现被调用了,这个控制台结果就不贴上来了.

dubbo负载均衡概念和使用相关推荐

  1. cstring只获取到第一个数_一文讲透 Dubbo 负载均衡之最小活跃数算法

    (给ImportNew加星标,提高Java技能) 作者:why技术(本文来自作者投稿) 本文是对于Dubbo负载均衡策略之一的最小活跃数算法的详细分析.文中所示源码,没有特别标注的地方均为2.6.0版 ...

  2. 一文讲透Dubbo负载均衡之最小活跃数算法

    本文是对于Dubbo负载均衡策略之一的最小活跃数算法的详细分析.文中所示源码,没有特别标注的地方均为2.6.0版本. 为什么没有用截止目前的最新的版本号2.7.4.1呢?因为2.6.0这个版本里面有两 ...

  3. 【RPC Dubbo】dubbo负载均衡策略

    文章目录 前言 1. 什么是负载均衡 1.1:负载均衡简介 1.2:简单解释 2. dubbo负载均衡策略 2.1 Random LoadBalance 2.2 RoundRobin LoadBala ...

  4. dubbo负载均衡策略解析

    dubbo负载均衡策略 前言:在上一篇博客中,介绍了zookeeper作为dubbo的注册中心是如何工作的,有一个很重要的点,我们的程序是分布式应用,服务部署在几个节点(服务器)上,当消费者调用服务时 ...

  5. Dubbo 负载均衡的实现

    前言 负载均衡是指在集群中,将多个数据请求分散在不同单元上进行执行,主要为了提高系统容错能力和加强系统对数据的处理能力. 在 Dubbo 中,一次服务的调用就是对所有实体域 Invoker 的一次筛选 ...

  6. dubbo调用失败策略_面试官:dubbo负载均衡策略,集群容错策略,动态代理策略有哪些...

    面试官心理分析 继续深问吧,这些都是用 dubbo 必须知道的一些东西,你得知道基本原理,知道序列化是什么协议,还得知道具体用 dubbo 的时候,如何负载均衡,如何高可用,如何动态代理. 说白了,就 ...

  7. dubbo负载均衡策略和集群容错策略

    dubbo负载均衡策略 random loadbalance 默认情况下,dubbo是random load balance随机调用实现负载均衡,可以对provider不同实例设置不同的权重,会按照权 ...

  8. Dubbo面试 - dubbo 负载均衡策略和集群容错策略都有哪些?

    Dubbo面试 - dubbo 负载均衡策略和集群容错策略都有哪些? 面试题 dubbo 负载均衡策略和集群容错策略都有哪些?动态代理策略呢? 面试官心理分析 继续深问吧,这些都是用 dubbo 必须 ...

  9. dubbo负载均衡策略配置

    前言 在生产环境中,服务的集群部署是常有的事,从消费端来说,本身并不关注所需要的服务是由哪台机器提供,但是为了应用的健壮性和高可用性,从消费端来说,可以配置一定的负载均衡策略,确保消费端的应用能够及时 ...

最新文章

  1. 0409-0416的笔记
  2. 关于java中敏感词检测的一些总结
  3. 【错误记录】Google Play 上架报错 ( 此版本不符合 Google Play 关于提供 64 位版本应用的要求 )
  4. Halcon知识:segment_contours_xld算子
  5. Google Archive Patch 源码解析
  6. 5.贝叶斯算法、单词拼写错误案例
  7. 初识Mysql(part1)--我需要知道的基本概念
  8. 电大计算机网络网考,电大计算机网络(本)学习周期01任务A_0009答案
  9. Linux常用指令2
  10. 高品质空间合成海报,让夜色更迷人
  11. Linux 原生异步 IO 原理与使用
  12. poj 2987 Firing (最大权 闭合 图)
  13. Linux-HA 高可用开源方案 Keepalived VS Heartbeat 的选择
  14. BLOCK_TYPE_US_VALID(pHead-nBlockUse)
  15. 微信公众号连接服务器显示404,WordPress 微信机器人自动回复显示 404 错误解决办法...
  16. Spark Streaming官网重点整理
  17. shell之常用工具(cut、sort、uniq、tr)
  18. linux增加分辨率addmode,设置分辨率xrandr --addmode
  19. uni-app 中微信小程序使用高德地图等第三方 SDK的方法
  20. 操作必须使用一个可更新的查询的解决方法

热门文章

  1. 服务治理,服务发现,服务注册
  2. Webstorm安装Less
  3. Java深入学习并发原理总结
  4. 数组作为函数参数传递
  5. <Linux>《Linux 之 ps 命令详解大全(含实用命令)》
  6. slf4j与log4j区别
  7. std::string::npos的使用
  8. cv2.CV_IMWRITE_JPEG_QUALITY 参数是否影响保存图片文件的大小
  9. Qt+vs2017无法将参数1从const char转换为lpcwstr
  10. BGP/MPLS IP VPF(N) 实验(ensp)