注册中心
注册中心通过registry标签配置,可配置多个。
- 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
- 注册中心不做请求转发,相当于目录服务,存储地址和地址变更通知
- 注册中心与消费端、服务端均为长连接,与服务端保持长连接可以检测服务提供端是否异常,与消费端保持长连接可以通知服务端地址变动。
- 注册中心异常不会影响已经运行中的消费者和服务提供者,消费者缓存了服务提供端地址。
- 注册中心非必须,可以消费端直接连接服务提供方,一般只有测试时使用这种方式,通过jvm参数或配置文件或reference标签可以指定某个服务消费哪个地址。
- 服务提供方宕机,消费端会无限次重连
- 支持一个服务注册注册多个服务中心,service标签的registry参数可以通过逗号分隔配置多个注册中心名
- 支持Multicast、
负载均衡策略
- 通过protocol标签、service标签、reference标签
rloadbalance参数配置
。权重则通过管理后台可以配置
。
Random LoadBalance(默认策略)
随机。按权重设置随机概率,在一个截面上碰撞的概率高,重试时,可能出现瞬间压力不均
RoundRobin LoadBalance
轮询。按公约后的权重设置轮询比率,存在慢的机器累积请求问题,极端情况可能产生雪崩。
LeastActive LoadBalance
最少活跃调用数。相同活跃数的随机,活跃数指调用前后计数差,使慢的机器收到更少请求。不支持权重,在容量规划时,不能通过权重把压力导向一台机器压测容量
ConsistentHash LoadBalance
一致性Hash。相同参数的请求总是发到同一提供者,当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动。默认虚拟节点是160个虚拟节点,根据服务存活数分摊。存在压力分摊不均问题。默认通过第一个参数进行hash,可以通过配置修改。
<dubbo:parameter key=“hash.arguments” value=“0,1”/>
扩展负载均衡算法
基于spi,实现LoadBalance类,在指定目录文件配置,META-INF/dubbo/com.alibaba.dubbo.rpc.cluster.LoadBalance,负载均衡策略名字=权限定名
调用监控
- 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
协议对比
- 通过protocol配置协议,指定端口,可以配置多个协议。service标签可以通过protocol参数指定协议,通过逗号分隔可配置多个。
<dubbo:protocol name="dubbo" port="20880" />
Dubbo协议(推荐使用)
采用NIO复用单一长连接,并使用线程池并发处理请求,减少握手和加大并发效率,性能较好。在大文件传输时,单一连接会成为瓶
。
Rmi协议。
可与原生RMI互操作,基于TCP协议,偶尔会连接失败,需重建Stub
。
Hessian协议
可与原生Hessian互操作,基于HTTP协议,需hessian.jar支持。http短连接的开销大
,设置传输大文件、大数据
。
调用失败策略
- 通过服务提供
service
标签和消费reference
标签的cluster参数设置
Failover Cluster(默认策略)
失败自动切换,当出现失败,重试其它服务器,通常用于读操作.重试会带来更长延迟,默认重试3次。
Failfast Cluster
快速失败,只发起一次调用,失败立即报错,通常用于非幂等写操作,如果有机器正在重启,可能会出现调用失败。
Failsafe Cluster
失败安全,出现异常时,直接忽略,通常用于写入审计日志等操作,调用信息丢失
Failback Cluster
失败立即返回,后台记录失败请求,定时重试,通常用于消息通知操作。不可靠,重启丢失
Forking Clus