Dubbo

功能特性
- 面向接口代理的高性能RPC调用,屏蔽远程调用使用细节。
- 智能负载均衡。
- 服务自动注册与发现。
- 高度可扩展的能力。
- 运行期流量调度,配置不同的路由规则,实现灰度发布。
- 可视化的服务治理与运维。
服务注册与发现
- 初始化
- start:容器启动
- register:服务提供者将自己提供的服务注册到注册中心。
- subscribe:服务消费者订阅注册中心所需要的服务。
- 运行
- notify:注册中心将服务提供者状态的变更提供给服务消费者。
- invoke:服务消费者同步调用服务提供者提供的服务(多个服务提供者可调用,根据负载均衡算法随机调用)。
- count:调用信息发送到监控中心,监控中心监控服务的运行状态。
支持的协议
- dubbo(推荐),rmi,hessian,http,webservice,thrift,memcached,redis,rest。
- 服务消费者数量大于服务提供者
- 服务消费者数量大于服务提供者,压满网卡。
- 传入传出参数数据包较小(小于100K)
- 网络将成为瓶颈,传输大包影响TPS。
- 异步单一长连接
- 单一连接:保证单一消费者不会压垮提供者。
- 长连接:减少握手验证。
- 异步IO,复用线程池:较少CPU消耗,防止C10K问题。
- 约束
- 参数及返回值需要实现Serializable接口。
- 服务器端和客户端的对象按照最大匹配原则匹配。
- 序列化
- Hessian二进制序列化
框架设计
| 名称 | 说明 |
|---|---|
| 服务接口层 | 与业务逻辑相关 |
| 配置层 | 对外配置接口 |
| 服务代理层 | 服务接口代理 |
| 服务注册层 | 封装服务地址的注册与发现 |
| 集群层 | 封装提供者的路由及负载均衡,桥接注册中心 |
| 监控层 | RPC调用次数和调用事件监控 |
| 远程调用层 | 封装RPC调用 |
| 信息交换层 | 封装请求响应模式,同步转异步 |
| 网络传输层 | 抽象mina和netty为同一接口 |
| 序列化 | 可服用的工具 |
- 通信框架:NIO netty(默认)
- 序列化框架:hessian(默认)
负载均衡
- Random:随机,按权重设置随机概率。
- RoundRobin:轮询,按照公约后的权重设置轮询比率。
- LeastActive:最少活跃调用数挑选最快的服务器,相同活跃数的随机。
- ConsistentHash:一致性Hash,相同的请求发送到同一台服务器上。
核心配置
| 配置 | 用途 | 说明 |
|---|---|---|
| service | 服务配置 | 暴露服务,定义服务的元信息 |
| reference | 引用配置 | 创建远程服务代理(check检查服务是否可用,不可用时抛出异常) |
| protocol | 协议配置 | 配置提供服务的协议信息 |
| application | 应用配置 | 配置当前应用的信息 |
| module | 模块配置 | 配置当前模块的信息(可选) |
| registry | 注册中心配置 | 配置注册中心相关的信息 |
| monitor | 监控中心配置 | 配置监控中心相关的信息(可选) |
| provider | 提供方配置 | 当 ProtocolConfig 和 ServiceConfig 某属性没有配置时,采用此缺省值,可选 |
| consumer | 消费方配置 | 当 ReferenceConfig 某属性没有配置时,采用此缺省值,可选 |
| method | 方法配置 | 用于 ServiceConfig 和 ReferenceConfig 指定方法级的配置信息 |
| argument | 参数配置 | 指定方法参数配置 |
- provider上配置consumer端的属性
- timeout:方法调用超时
- retries:方法重试次数
- loadbalance:负载均衡算法,默认随机
- actives:最大并发调用限制
集群容错机制
| 容错方案 | 说明 |
|---|---|
| failover | 失败自动切换,重试其他服务器(默认) |
| failfast | 快速失败,调用服务失败立即报错 |
| failsave | 安全失败,出现异常忽略(记录日志) |
| failback | 失败自动回复,记录失败请求,定时重发 |
| forking | 并行调用多个服务器,只要一个成功就返回 |
| broadcast | 广播逐个调用所有提供者,任意一个报错则报错 |
安全机制
- Token机制防止用户绕过注册中心直连。
- 黑白名单控制服务允许的调用方。
服务暴露
-
配置
-
ServiceBean实现了InitializingBean,ApplicationListener等接口。
- 覆写其中的afterPropertiesSet,配置各项属性信息。
-
暴露服务
-
通过
protocol.export(invoker)方法把服务暴露出去(会根据当前的协议做相应的暴露操作),最后将Url和对应的执行器存起来,存放在注册表中,以供消费者调用。- invoker:屏蔽调用细节,统一暴露一个可执行体。
-
本地暴露:内部调用时消费同一个JVM,避免网络通信。
-
注册服务
- 注册服务到注册中心。
- 订阅注册中心的服务。
- 生成一个新的Exporter实例,将上面的Exporter进行引入,然后返回。
超时时间设置
- 服务提供者超时时间尽量多配置。
- 服务消费者超时时间优先级高于服务提供者。
高可用
- 监控中心宕机,不影响使用丢失部分采样数据。
- 数据库宕机,通过缓存提供服务列表查询,但不能提供注册服务。
- 注册中心对等集群,任意一台宕机可自动切换。
- 注册中心全部宕机,服务提供者和服务消费者通过本地缓存通讯。
- 服务提供者无状态,任意一台宕机,不影响使用。
- 服务提供者全部宕机,服务消费者应用无法使用,无限次重连等待服务提供者恢复。
SPI
- 服务发现机制。
- 将接口实现类的全限定名配置在文件中,并由服务加载器读取配置文件,加载实现类。
- 运行时,动态为接口替换实现类。
你知道的越多,你不知道的越多。

Dubbo通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成。
浙公网安备 33010602011771号