Dubbo
Apache Dubbo 是一款微服务开发框架,可以用于 RPC通信 与 微服务治理 。
六大核心能力
-
面向接口代理的高性能RPC调用:提供高性能的基于代理的远程调用能力,服务以接口为粒度,为开发者屏蔽远程调用底层细节。
-
智能负载均衡:内置多种负载均衡策略,智能感知下游节点健康状况,显著减少调用延迟,提高系统吞吐量。
-
服务自动注册与发现:支持多种注册中心服务,服务实例上下线实时感知。
-
高度可扩展能力:遵循微内核+插件的设计原则,所有核心能力如Protocol、Transport、Serialization被设计为扩展点,平等对待内置实现和第三方实现。
-
运行期流量调度:内置条件、脚本等路由策略,通过配置不同的路由规则,轻松实现灰度发布,同机房优先等功能。
-
可视化的服务治理与运维:提供丰富服务治理、运维工具:随时查询服务元数据、服务健康状态及调用统计,实时下发路由策略、调整配置参数。
服务发现
服务发现,即消费端自动发现服务地址列表的能力。
服务发现的一个核心组件是注册中心,Provider 注册地址到注册中心,Consumer 从注册中心读取和订阅 Provider 地址列表,进而对地址发起通信。
节点 | 角色说明 |
---|---|
Provider | 暴露服务的服务提供方 |
Consumer | 调用远程服务的服务消费方 |
Registry | 服务注册与发现的注册中心 |
Monitor | 统计服务的调用次数和调用时间的监控中心 |
Container | 服务运行容器 |
调用关系说明(对应上图的步骤):
0.服务容器负责启动,加载,运行服务提供者。
1.服务提供者在启动时,向注册中心注册自己提供的服务。
2.服务消费者在启动时,向注册中心订阅自己所需的服务。
3.注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
4.服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
5.服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
配置
xml配置详情见: https://dubbo.apache.org/zh/docs/v2.7/user/references/xml/
- 服务提供者 provider.xml示例:
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
<dubbo:application name="demo-provider"/>
<dubbo:registry address="zookeeper://127.0.0.1:2181"/>
<dubbo:protocol name="dubbo" port="20890"/>
<bean id="demoService" class="org.apache.dubbo.samples.basic.impl.DemoServiceImpl"/>
<dubbo:service interface="org.apache.dubbo.samples.basic.api.DemoService" ref="demoService"/>
</beans>
- 服务消费者consumer.xml示例:
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
<dubbo:application name="demo-consumer"/>
<dubbo:registry group="aaa" address="zookeeper://127.0.0.1:2181"/>
<dubbo:reference id="demoService" check="false" interface="org.apache.dubbo.samples.basic.api.DemoService"/>
</beans>
- 各个配置的作用:
标签 | 用途 | 解释 |
---|---|---|
dubbo:service | 服务配置 | 用于暴露一个服务,定义服务的元信息,一个服务可以用多个协议暴露,一个服务也可以注册到多个注册中心 |
dubbo:reference | 引用配置 | 用于创建一个远程服务代理,一个引用可以指向多个注册中心 |
dubbo:protocol | 协议配置 | 用于配置提供服务的协议信息,协议由提供方指定,消费方被动接受 |
dubbo:application | 应用配置 | 用于配置当前应用信息,不管该应用是提供者还是消费者 |
dubbo:module | 模块配置 | 用于配置当前模块信息,可选 |
dubbo:registry | 注册中心配置 | 用于配置连接注册中心相关信息 |
dubbo:monitor | 监控中心配置 | 用于配置连接监控中心相关信息,可选 |
dubbo:provider | 提供方配置 | 当 ProtocolConfig 和 ServiceConfig 某属性没有配置时,采用此缺省值,可选 |
dubbo:consumer | 消费方配置 | 当 ReferenceConfig 某属性没有配置时,采用此缺省值,可选 |
dubbo:method | 方法配置 | 用于 ServiceConfig 和 ReferenceConfig 指定方法级的配置信息 |
dubbo:argument | 参数配置 | 用于指定方法参数配置 |
协议
协议详情见: https://dubbo.apache.org/zh/docs/v2.7/user/references/protocol/
协议 | 特性 | 缺点 |
---|---|---|
Dubbo协议 | 采用NIO复用单一长连接,并使用线程池并发处理请求,减少握手和加大并发效率,性能较好(推荐使用) | 在大文件传输时,单一连接会成为瓶颈 |
Rmi协议 | 可与原生RMI互操作,基于TCP协议 | 偶尔会连接失败,需重建Stub |
Hessian协议 | 可与原生Hessian互操作,基于HTTP协议 | 需hessian.jar支持,http短连接的开销大 |
集群容错
集群容错模式(策略) | 特性 | 缺点 |
---|---|---|
Failover Cluster(失败自动切换) | 当出现失败,重试其它服务器,通常用于读操作(推荐使用) | 重试会带来更长延迟 |
Failfast Cluster(快速失败) | 只发起一次调用,失败立即报错,通常用于非幂等性的写操作 | 如果有机器正在重启,可能会出现调用失败 |
Failsafe Cluster(失败安全) | 出现异常时,直接忽略,通常用于写入审计日志等操作 | 调用信息丢失 |
Failback Cluster(失败自动恢复) | 后台记录失败请求,定时重发,通常用于消息通知操作 | 不可靠,重启丢失 |
Forking Cluster(并行调用多个服务器) | 只要一个成功即返回,通常用于实时性要求较高的读操作 | 需要浪费更多服务资源 |
Broadcast Cluster(广播调用所有提供者) | 逐个调用,任意一台报错则报错,通常用于更新提供方本地状态 | 速度慢,任意一台报错则报错 |
负载均衡
dubbo负载均衡的几种方式如下。
负载均衡策略 | 特性 | 缺点 |
---|---|---|
Random LoadBalance(随机) | 按权重设置随机概率(推荐使用) | 在一个截面上碰撞的概率高,重试时,可能出现瞬间压力不均 |
RoundRobin LoadBalance(轮询) | 按公约后的权重设置轮询比率 | 存在慢的机器累积请求问题,极端情况可能产生雪崩 |
LeastActive LoadBalance(最少活跃调用数) | 相同活跃数的随机,活跃数指调用前后计数差,使慢的机器收到更少请求 | 不支持权重,在容量规划时,不能通过权重把压力导向一台机器压测容量 |
ConsistentHash LoadBalance(一致性Hash) | 相同参数的请求总是发到同一提供者,当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动 | 压力分摊不均 |
参考资料:
dubbo官方文档
https://dubbo.apache.org/zh/docs/v2.7/user/preface/architecture/
https://dubbo.apache.org/zh/docs/v2.7/user/examples/