介绍 Dubbo 各个功能、策略的成熟度
功能成熟度
Feature | Maturity | Strength | Problem | Advise | User |
并发控制 | Tested | 并发控制 | 试用 | ||
连接控制 | Tested | 连接数控制 | 试用 | ||
直连提供者 | Tested | 点对点直连服务提供方,用于测试 | 测试环境使用 | Alibaba | |
分组聚合 | Tested | 分组聚合返回值,用于菜单聚合等服务 | 特殊场景使用 | 可用于生产环境 | |
参数验证 | Tested | 参数验证,JSR303 验证框架集成 | 对性能有影响 | 试用 | LaiWang |
结果缓存 | Tested | 结果缓存,用于加速请求 | 试用 | ||
泛化引用 | Stable | 泛化调用,无需业务接口类进行远程调用,用于测试平台,开放网关桥接等 | 可用于生产环境 | Alibaba | |
泛化实现 | Stable | 泛化实现,无需业务接口类实现任意接口,用于 Mock 平台 | 可用于生产环境 | Alibaba | |
回声测试 | Tested | 回声测试 | 试用 | ||
隐式传参 | Stable | 附加参数 | 可用于生产环境 | ||
异步调用 | Tested | 不可靠异步调用 | 试用 | ||
本地调用 | Tested | 本地调用 | 试用 | ||
参数回调 | Tested | 参数回调 | 特殊场景使用 | 试用 | Registry |
事件通知 | Tested | 事件通知,在远程调用执行前后触发 | 试用 | ||
本地存根 | Stable | 在客户端执行部分逻辑 | 可用于生产环境 | Alibaba | |
本地伪装 | Stable | 伪造返回结果,可在失败时执行,或直接执行,用于服务降级 | 需注册中心支持 | 可用于生产环境 | Alibaba |
延迟暴露 | Stable | 延迟暴露服务,用于等待应用加载 warmup 数据,或等待 spring 加载完成 | 可用于生产环境 | Alibaba | |
延迟连接 | Tested | 延迟建立连接,调用时建立 | 试用 | Registry | |
粘滞连接 | Tested | 粘滞连接,总是向同一个提供方发起请求,除非此提供方挂掉,再切换到另一台 | 试用 | Registry | |
令牌验证 | Tested | 令牌验证,用于服务授权 | 需注册中心支持 | 试用 | |
路由规则 | Tested | 动态决定调用关系 | 需注册中心支持 | 试用 | |
配置规则 | Tested | 动态下发配置,实现功能的开关 | 需注册中心支持 | 试用 | |
访问日志 | Tested | 访问日志,用于记录调用信息 | 本地存储,影响性能,受磁盘大小限制 | 试用 | |
分布式事务 | Research | JTA/XA 三阶段提交事务 | 不稳定 | 不可用 |
策略成熟度
Feature | Maturity | Strength | Problem | Advise | User |
Zookeeper 注册中心 | Stable | 支持基于网络的集群方式,有广泛周边开源产品,建议使用 dubbo-2.3.3 以上版本(推荐使用) | 依赖于 Zookeeper 的稳定性 | 可用于生产环境 | |
Redis 注册中心 | Stable | 支持基于客户端双写的集群方式,性能高 | 要求服务器时间同步,用于检查心跳过期脏数据 | 可用于生产环境 | |
Multicast 注册中心 | Tested | 去中心化,不需要安装注册中心 | 依赖于网络拓扑和路由,跨机房有风险 | 小规模应用或开发测试环境 | |
Simple 注册中心 | Tested | Dogfooding,注册中心本身也是一个标准的 RPC 服务 | 没有集群支持,可能单点故障 | 试用 | |
Feature | Maturity | Strength | Problem | Advise | User |
--- | --- | --- | --- | --- | --- |
Simple 监控中心 | Stable | 支持 JFreeChart 统计报表 | 没有集群支持,可能单点故障,但故障后不影响 RPC 运行 | 可用于生产环境 | |
Feature | Maturity | Strength | Problem | Advise | User |
--- | --- | --- | --- | --- | --- |
Dubbo 协议 | Stable | 采用 NIO 复用单一长连接,并使用线程池并发处理请求,减少握手和加大并发效率,性能较好(推荐使用) | 在大文件传输时,单一连接会成为瓶颈 | 可用于生产环境 | Alibaba |
Rmi 协议 | Stable | 可与原生 RMI 互操作,基于 TCP 协议 | 偶尔会连接失败,需重建 Stub | 可用于生产环境 | Alibaba |
Hessian 协议 | Stable | 可与原生 Hessian 互操作,基于 HTTP 协议 | 需 hessian.jar 支持,http 短连接的开销大 | 可用于生产环境 | |
Feature | Maturity | Strength | Problem | Advise | User |
--- | --- | --- | --- | --- | --- |
Netty Transporter | Stable | JBoss 的 NIO 框架,性能较好(推荐使用) | 一次请求派发两种事件,需屏蔽无用事件 | 可用于生产环境 | Alibaba |
Mina Transporter | Stable | 老牌 NIO 框架,稳定 | 待发送消息队列派发不及时,大压力下,会出现 FullGC | 可用于生产环境 | Alibaba |
Grizzly Transporter | Tested | Sun 的 NIO 框架,应用于 GlassFish 服务器中 | 线程池不可扩展,Filter 不能拦截下一 Filter | 试用 | |
Feature | Maturity | Strength | Problem | Advise | User |
--- | --- | --- | --- | --- | --- |
Hessian Serialization | Stable | 性能较好,多语言支持(推荐使用) | Hessian 的各版本兼容性不好,可能和应用使用的 Hessian 冲突,Dubbo 内嵌了 hessian3.2.1 的源码 | 可用于生产环境 | Alibaba |
Dubbo Serialization | Tested | 通过不传送 POJO 的类元信息,在大量 POJO 传输时,性能较好 | 当参数对象增加字段时,需外部文件声明 | 试用 | |
Json Serialization | Tested | 纯文本,可跨语言解析,缺省采用 FastJson 解析 | 性能较差 | 试用 | |
Java Serialization | Stable | Java 原生支持 | 性能较差 | 可用于生产环境 | |
Feature | Maturity | Strength | Problem | Advise | User |
--- | --- | --- | --- | --- | --- |
Javassist ProxyFactory | Stable | 通过字节码生成代替反射,性能比较好(推荐使用) | 依赖于 javassist.jar 包,占用 JVM 的 Perm 内存,Perm 可能要设大一些:java -XX:PermSize=128m | 可用于生产环境 | Alibaba |
Jdk ProxyFactory | Stable | JDK 原生支持 | 性能较差 | 可用于生产环境 | |
Feature | Maturity | Strength | Problem | Advise | User |
--- | --- | --- | --- | --- | --- |
Failover Cluster | Stable | 失败自动切换,当出现失败,重试其它服务器,通常用于读操作(推荐使用) | 重试会带来更长延迟 | 可用于生产环境 | Alibaba |
Failfast Cluster | Stable | 快速失败,只发起一次调用,失败立即报错,通常用于非幂等性的写操作 | 如果有机器正在重启,可能会出现调用失败 | 可用于生产环境 | Alibaba |
Failsafe Cluster | Stable | 失败安全,出现异常时,直接忽略,通常用于写入审计日志等操作 | 调用信息丢失 | 可用于生产环境 | Monitor |
Failback Cluster | Tested | 失败自动恢复,后台记录失败请求,定时重发,通常用于消息通知操作 | 不可靠,重启丢失 | 可用于生产环境 | Registry |
Forking Cluster | Tested | 并行调用多个服务器,只要一个成功即返回,通常用于实时性要求较高的读操作 | 需要浪费更多服务资源 | 可用于生产环境 | |
Broadcast Cluster | Tested | 广播调用所有提供者,逐个调用,任意一台报错则报错,通常用于更新提供方本地状态 | 速度慢,任意一台报错则报错 | 可用于生产环境 | |
Feature | Maturity | Strength | Problem | Advise | User |
--- | --- | --- | --- | --- | --- |
Random LoadBalance | Stable | 随机,按权重设置随机概率(推荐使用) | 在一个截面上碰撞的概率高,重试时,可能出现瞬间压力不均 | 可用于生产环境 | Alibaba |
RoundRobin LoadBalance | Stable | 轮询,按公约后的权重设置轮询比率 | 存在慢的机器累积请求问题,极端情况可能产生雪崩 | 可用于生产环境 | |
LeastActive LoadBalance | Stable | 最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差,使慢的机器收到更少请求 | 不支持权重,在容量规划时,不能通过权重把压力导向一台机器压测容量 | 可用于生产环境 | |
ConsistentHash LoadBalance | Stable | 一致性 Hash,相同参数的请求总是发到同一提供者,当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动 | 压力分摊不均 | 可用于生产环境 | |
Feature | Maturity | Strength | Problem | Advise | User |
--- | --- | --- | --- | --- | --- |
条件路由规则 | Stable | 基于条件表达式的路由规则,功能简单易用 | 有些复杂多分支条件情况,规则很难描述 | 可用于生产环境 | Alibaba |
脚本路由规则 | Tested | 基于脚本引擎的路由规则,功能强大 | 没有运行沙箱,脚本能力过于强大,可能成为后门 | 试用 | |
Feature | Maturity | Strength | Problem | Advise | User |
--- | --- | --- | --- | --- | --- |
Spring Container | Stable | 自动加载 META-INF/spring 目录下的所有 Spring 配置 | 可用于生产环境 | Alibaba | |
Jetty Container | Stable | 启动一个内嵌 Jetty,用于汇报状态 | 大量访问页面时,会影响服务器的线程和内存 | 可用于生产环境 | Alibaba |
Log4j Container | Stable | 自动配置 log4j 的配置,在多进程启动时,自动给日志文件按进程分目录 | 用户不能控制 log4j 的配置,不灵活 | 可用于生产环境 | Alibaba |