7.Dubbo

7.1 什么是dubbo?

工作在 soa 面向服务分布式框架中的服务管理中间件。Dubbo 是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案

它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合(或者最大限度地松耦合)。从服务模型的角度来看,Dubbo 采用的是一种非常简单的模型,要么是提供方提供服务,要么是消费方消费服务,所以基于这一点可以抽象出服务提供方(Provider)和服务消费方(Consumer)两个角色。关于注册中心、协议支持、服务监控等内容。

Dubbo 使用的是缺省协议, 采用长连接和 nio 异步通信,适合小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况。 反之, dubbo缺省协议不适合传送大数据量的服务,比如传文件,传视频等,除非请求量很低

7.2 Dubbo的实现原理图如下

dubbo 长连接 心跳_服务提供者

7.3 节点角色说明

Provider : 暴露服务的服务提供方.

Consumner : 调用远程服务的服务消费方。

registry :服务注册与发现的注册中心。

Monitory : 统计服务的调用次数和调用时间的监控中心。

Container:服务运行容器

7.4 调用关系说明

1、服务容器负责启动,加载,运行服务提供者

2、服务提供者在启动时,向注册中心注册自己提供的服务

3、服务消费者在启动时,向注册中心订阅自己所需要的服务。

4、注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。

5、服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,在选另一台调用。

6、服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

7.5 什么是缺省协议?

缺省协议基于 netty 和 hessina 交互,传输方式是 nio,序列化是 hissian二进制序列化,传说协议tcp,连接方式长连接。连接个数单链接。适用范围,传入传出参数数据包较小(官方建议小与100K),消费者比提供者个数多, 使用场景,常规的远程服务方法调用。

7.6 为什么不能传大包

因 dubbo 协议采用单一长连接,如果每次请求的数据包大小为 500KByte,假设网络为千兆网卡(1024Mbit=128MByte),每条连接最大7MByte(不同的环境可能不一样,供参考),

单个服务提供者的TPS(每秒处理事务数)最大为:

128MByte / 500KByte = 262。

单个消费者调用单个服务提供者的TPS(每秒处理事务数)最大为:
7MByte / 500KByte = 14。
如果能接受,可以考虑使用,否则网络将成为瓶颈。

7.7 Dubbo 中的 zookeeper 做注册中心,如果注册中心集群都 挂掉,发布者和订阅者还能通信吗?

可以通信,启动dubbo时,消费者会从zk拉去注册的生产者的地址接口等数据,缓存在本地,每次调用时,按照本地储存的地址进行调用。 注册中心对等集群,任意一台宕机后,将会切到另一台, 注册中心全部宕机后, 服务的提供者和消费者仍能够通过本地缓存通讯, 服务提供者无状态,任意一台宕机后,不影响使用,服务提供者全部宕机,服务消费者会无法使用并且无限次重连等待服务者回复, 挂掉不是要紧的,但前提是你没有增加新的服务,如果要调用新的服务,则是不能办到的

7.8 dubbo 服务的负载均衡策略?

1、Random loadBalcance 随机按权重设置随机概率,在一个界面上碰撞的概率高,单条用量越大分布越均匀,而且按概率使用权重后也比较均匀有利动态调整供权重者。

2、 roundRobin LoadBalance轮循,按公约后的权重设置轮训比率,存在慢的提供者累积去请求问题. 例如,第二台机器很慢但是没挂。每当请求调用到第二台时就卡在那,久而久之,所有的请求都卡在调到第二台上

3、 leastActive LoadBalance

最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差,使慢的机器收到更少,因为越慢的提供者的调用前后计数差会越大 例如,每个服务维护一个活跃数计数器。当A机器开始处理请求,该计数器加1,此时A还未处理完成(若处理完毕则计数器减1)。而 B机器接受到请求后很快处理完毕。那么 A,B 的活跃数分别是 1,0。当又产生了一个新的请求,则选择B机器去执行(B活跃数最小),这样使慢的机器A收到少的请求。

4、 一致性hash

相同参数的请求总是发送到同一个提供者, 当某一台提供者挂了,原本发往该提供者的请求,基于虚拟节点,平摊到其他提供者 不会引起剧烈变动。 缺省值对第一个参数hash, 如果要修改请配置:

<dubbo :parameter key=”hash.arguments” value”0,1”/> 
 缺省用160份虚拟节点 。 如果要修改 请配置 
 <dubbo:parameter key=”hash.nodes” value=”320”>
7.9 Dubbo 在安全机制方面是如何解决的?

Dubbo通过token令牌防止用户绕过注册中心直连。 然后再注册中心上管理授权,dubbo还提供服务黑白名单, 来控制服务所允许的调用方。

7.10 dubbo 链接注册中心和直连有什么区别?

在开发级测试环境下,经常需要绕过注册中心, 只测试制定服务提供者,这时候可能需要点对点直连。

点对点直连方式 :将以服务接口为单位,忽略注册中心出的提供者列表。注册中心:动态的注册和发现服务,使服务的位置透明,并通过在消费方获取服务提供方地址列表,实现软负载均衡和failover。注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。

服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用, 如果调用失败,再选另一台调用, 注册中心负责服务地址的注册于查找,相当于目录服务, 服务提供者和消费者只在启动时与注册中心进行交互,注册中心不转发请求,服务消费者向注册中心获取服务提供者地址列表, 并根据软负载算法直接调用提供者.注册中心,服务提供者,服务消费者三者之间均为长连接。 监控中心除外,注册中心通过长连接感知服务提供者的存在,服务提供者宕机, 注册中心将立即推送事件通知消费者,注册中心和监控中心全部宕机,不影响已运行的提供者和消费者,消费者在本地缓存了提供者列表 注册中心和监控中心都是可选的,服务消费者可以直连服务提供者。

7.11 dubbo 服务集群的容错模式

在集群调用失败时,Dubbo 提供了多种容错方案,缺省为failover 重试。可以自行扩展集群容错策略

1.failover Cluster(默认)

失败自动切换,当出现失败,重试其他服务器,(缺省)通常用于读操作,但重试会带来更长的延迟,可通过retries=”2“来色湖之重试次数(不含第一次)。

<dubbo:service retries="2" cluster="failover"/>或: 
<dubbo:reference retries="2" cluster="failover"/>           
cluster="failover"可以不用写,因为默认就是failover
  1. Failfast Cluster
    快速失败,只发起一次调用,失败立即报错。通常用于非幂等性的写操作,比如新增记录。
dubbo:service cluster="failfast" />          
 或:<dubbo:reference cluster="failfast" />     cluster="failfast"和 把
cluster="failover"、retries="0"是一样的效果,retries="0"就是不重
  1. 失败安全,出现异常时,直接忽略。通常用于写入审计日志等操作
<dubbo:service cluster="failsafe" />         
  或:<dubbo:reference cluster="failsafe" />
  1. 失败自动恢复,后台记录失败请求,定时重发。通常用于消息通知操作
<dubbo:service cluster="failback" />  或:          
 <dubbo:reference cluster="failback" />

5.并行调用多个服务器 只要有一个成功即返回, 通常用于实时性要求较高的读操作,但需要浪费更多服务器资源,通过 forks=“2”来设置最大并行数

6.广播调用所有提供者 ,逐个调用,任意一台报错则报错(2.1.0 开始支持), 通常用于通知所有提供者更新缓存或日志等本地资源信息

dubbo 长连接 心跳_java_02

在项目开发中,我们项目框架已经由我们项目经理搭建好了,我们在使用
中只用在服务方和消费方配置好需要暴露的接口,在消费用通过
, 通常用于通知所有提供者更新缓存或日志等本地资源信息

在项目开发中,我们项目框架已经由我们项目经理搭建好了,我们在使用
中只用在服务方和消费方配置好需要暴露的接口,在消费用通过
@Reference 注解进行引入服务