前言:
dubbo是阿里开源的一个RPC远程调用框架,但从RPC框架来说,dubbo功能比较完善,支持多种传输和序列化方案。
架构图和流程:
dubbo架构图如下:
节点角色:
- provider:暴露服务的服务提供方
- Consumer:调用远程服务的服务消费方
- Registry:服务注册与发现的注册中心
- Monitor:统计服务的调用次数和调用时间的监控中心
- Container:服务运行容器
流程说明:
- 服务容器负责启动,加载,运行服务提供者
- 服务提供者在启动时,向注册中心注册自己提供服务
- 服务消费者启动时,想注册中心订阅自己所需的服务
- 注册中心返回服务提供者地址列表给消费者,如果变更,注册中心将基于长连接推送变更数据给消费者
- 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用
- 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
设计的意义:
- consumer和producer解耦,双方都可以横向增加节点数
- 注册中心对本身可做集群,动态增减节点数,并且任意一台宕掉后,将会自动切到另外一台
- 去中心化,双方不依赖注册中心,即使注册中心全部宕机,短时间内也不会影响服务的调用
- 服务提供者无状态,任意一台宕机,不影响使用。
Dubbo调用模块详解
dubbo调用模块核心功能是发起一个远程方法的调用并顺利拿到返回结果,其体系组成如下:
- 透明代理: 通过动态代理技术,屏蔽远程调用细节以提高编程友好性。
- 负载均衡: 当有多个提供者时,如何选择哪个进行调用的负载算法。
- 容错机制: 当服务调用失败时采取的策略。
- 调用方式: 支持异步调用,同步调用
- 结果获取: 指同步等待结果返回还是异步通过回调通知获取结果。
负载均衡:
Dubbo目前官方支持的负载均衡策略如下:
- 随机(Random): 按权重设置随机概率,此为默认算法
- 轮训(roundrobin):按公约后的权重设置轮训比率
- 最少活跃调用数: 相同活跃数随机,活跃数指调用前后计数差
- 一致性:相同的参数总是发到同一台机器
设置方式支持如下四种方式设置,优先级由低至高:
loadbalance="roundrobin" />
容错:
Dubbo官方目前支持以下容错策略:
- 失败自动切换:调用失败后基于retries=“2” 属性重试其它服务器
- 快速失败:快速失败,只发起一次调用,失败立即报错。
- 勿略失败:失败后勿略,不抛出异常给客户端。
- 失败重试:失败自动恢复,后台记录失败请求,定时重发。通常用于消息通知操作
- 并行调用: 只要一个成功即返回,并行调用指定数量机器,可通过 forks="2" 来设置最大并行数。
- 广播调用:广播调用所有提供者,逐个调用,任意一台报错则报错
设置方式支持如下两种方式设置,优先级由低至高:
cluster="broadcast" />
cluster="broadcast"/ >
异步调用:
异步调用指发起远程调用之后获取结果的方式:
- 同步等待结果返回
- 异步等待结果返回
- 不需要返回结果
Dubbo中关于异步调用等待返回结果实现流程如图: