Dubbo是什么

Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案

Dubbo解决什么问题

负载均衡
帮助架构师理清服务调用先后关系
统计服务调用量,响应时间并动态调整权值

Dubbo架构

Dubbo相关

Dubbo相关
服务容器负责启动,加载,运行服务提供者。
服务提供者在启动时,向注册中心注册自己提供的服务。
服务消费者在启动时,向注册中心订阅自己所需的服务。
注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

Zookeeper

Zookeeper 是 Apacahe Hadoop 的子项目,是一个树型的目录服务,支持变更推送,适合作为 Dubbo 服务的注册中心,工业强度较高,可用于生产环境,并推荐使用。

负载均衡策略

权值调整
获取服务运行时间
获取服务预热时间
如果预热时间大于运行时间,权值=(运行时间/预热时间)*权值
权重的计算过程,该过程主要用于保证当服务运行时长小于服务预热时间时,对服务进行降权,避免让服务在启动之初就处于高负载状态。服务预热是一个优化手段,与此类似的还有 JVM 预热。主要目的是让服务启动后“低功率”运行一段时间,使其效率慢慢提升至最佳状态。

RandomLoadBalance
假设我们有一组服务器 servers = [A, B, C],他们对应的权重为 weights = [5, 3, 2],权重总和为10。现在把这些权重值平铺在一维坐标值上,[0, 5) 区间属于服务器 A,[5, 8) 区间属于服务器 B,[8, 10) 区间属于服务器 C。接下来通过随机数生成器生成一个范围在 [0, 10) 之间的随机数,然后计算这个随机数会落到哪个区间上。比如数字3会落到服务器 A 对应的区间上,此时返回服务器 A 即可。权重越大的机器,在坐标轴上对应的区间范围就越大,因此随机数生成器生成的数字就会有更大的概率落到此区间内。
RandomLoadBalance 的算法思想比较简单,在经过多次请求后,能够将调用请求按照权重值进行“均匀”分配。当然 RandomLoadBalance 也存在一定的缺点,当调用次数比较少时,Random 产生的随机数可能会比较集中,此时多数请求会落到同一台服务器上。这个缺点并不是很严重,多数情况下可以忽略。RandomLoadBalance 是一个简单,高效的负载均衡实现,因此 Dubbo 选择它作为缺省实现。

LeastActiveLoadBalance
每个服务有活跃数,初始为0
每收到一个请求,活跃数+1,完成请求,活跃数-1
任务优先分配给活跃数小的服务
如果活跃数相同,选权重大的
权重也相同,随机选

ConsistentHashLoadBalance

使用Dubbo踩坑

直接使用教程的demo
provider会报错

[16/05/19 10:28:14:444 CST] main  WARN multicast.MulticastRegistry:  [DUBBO] Ignore empty notify urls for subscribe url provider://172.17.151.85:20880/org.apache.dubbo.demo.DemoService?anyhost=true&application=demo-provider&bean.name=org.apache.dubbo.demo.DemoService&bind.ip=172.17.151.85&bind.port=20880&category=configurators&check=false&deprecated=false&dubbo=2.0.2&dynamic=true&generic=false&interface=org.apache.dubbo.demo.DemoService&methods=sayHello&pid=8864&qos.port=22222&register=true&release=&side=provider&timestamp=1557973690076, dubbo version: , current host: 172.17.151.85

这个问题是服务注册到组播中失败,已将系统参数设置为ipv4,并且组播协议已打开,原因未知
解决方法:
https://blog.csdn.net/tc1106_site/article/details/73381535
使用直连,配置xml文件:
广播端

<!-- 直连模式 -->
<dubbo:registry address="N/A"/>

使用端

<!-- 直连模式 在 dubbo:reference中 加上url="dubbo://127.0.0.1:20880" -->

配置完后,provider正常工作,但是consumer还是失败,经检查,cosumer的timeout是1000ms,我的电脑性能不好,超时了
重新设置timeout为3000ms,正常工作。

连接zookeeper
一开始,直接无法加载zookeeper容器,这是因为教材例子太坑爹,没有给出dubbo的版本号,导致pom文件的dubbo-dependencies-zookeeper失效,我定义dubbo版本号为2.7.1。之后,zookeeper又初始化失败,这是因为教程给的是3.3.3,而dubbo2.7.1只支持3.4.x,我换成3.4.14成功启动provider,cosumer成功与provider交互

相关文章: