Author: haoransun
Wechat: SHR—97
概述
Apache Dubbo是⼀款⾼性能的基于JAVA语⾔的RPC(RemoteProcedureCall)框架。 Apache Dubbo提供了三个关键功能,其中包括接⼝的远程调⽤、容错和负载均衡,以及⾃动 服务注册和发现,Apache Dubbo框架在阿⾥巴巴内外被⼴泛采⽤,包括京东、当当、去哪儿、考拉和其他许多公司。
官⽹
特点
节点 | ⻆⾊说明 |
---|---|
Provider | 暴露服务的服务提供⽅ |
Consumer | 调⽤远程服务的服务消费⽅ |
Registry | 服务注册与发现的注册中⼼ |
Monitor | 统计服务的调⽤次数和调⽤时间的监控中⼼ |
Container | 服务运⾏容器 |
调⽤关系说明
服务容器负责启动,加载,运⾏服务提供者。
服务提供者在启动时,向注册中⼼注册⾃⼰提供的服务。
服务消费者在启动时,向注册中⼼订阅⾃⼰所需的服务。
注册中⼼返回服务提供者地址列表给消费者,如果有变更,注册中⼼将基于⻓连接推送变 更数据给消费者。
服务消费者,从提供者地址列表中,基于软负载均衡算法,选⼀台提供者进⾏调⽤,如果 调⽤失败,再选另⼀台调⽤。
服务消费者和提供者,在内存中累计调⽤次数和调⽤时间,定时每分钟发送⼀次统计数据 到监控中⼼。
快速启动
参考⽂档:http://dubbo.apache.org/en-us/docs/user/quick-start.html
Maven依赖
服务提供者
定义服务接⼝
在服务提供⽅实现接⼝
⽤ Spring 配置声明暴露服务
加载 Spring 配置
服务消费者
通过 Spring 配置引⽤远程服务
加载Spring配置,并调⽤远程服务
支持特性
启动时检查
Dubbo 缺省会在启动时检查依赖的服务是否可⽤,不可⽤时会抛出异常,阻⽌ Spring 初 始化完成,以便上线时,能及早发现问题,默认 check=”true”。可以通过 check=”false” 关 闭检查,⽐如,测试时,有些服务不关⼼,或者出现了循环依赖,必须有⼀⽅先启动。
例:
- 关闭某个服务的启动时检查 (没有提供者时报错):
<dubbo:reference interface="com.foo.BarService" check="false" />
- 关闭所有服务的启动时检查 (没有提供者时报错):
<dubbo:consumer check="false" />
负载均衡
在集群负载均衡时,Dubbo 提供了多种均衡策略,缺省为 random 随机调⽤
负载均衡策略
- Random LoadBalance
- RoundRobin LoadBalance
- LeastActive LoadBalance
- ConsistentHash LoadBalance
集群容错
调⽤服务提供者的时候,dubbo提供了各种容错模式。保证获取到可⽤的服务。
集群容错模式
Failover Cluster
失败⾃动切换,当出现失败,重试其它服务器Failfast Cluster
快速失败,只发起⼀次调⽤,失败⽴即报错。Failsafe Cluster
失败安全,出现异常时,直接忽略。Failback Cluster
失败⾃动恢复,后台记录失败请求,定时重发。Forking Cluster
并⾏调⽤多个服务器,只要⼀个成功即返回。Broadcast Cluster
⼴播调⽤所有提供者,逐个调⽤,任意⼀台报错则报错。
线程模型
如果事件处理的逻辑能迅速完成,并且不会发起新的 IO 请求,⽐如只是在内存中记个标 识,则直接在 IO 线程(处理⽹络数据的线程)上处理更快,因为减少了线程池调度。
但如果事件处理逻辑较慢,或者需要发起新的 IO 请求,⽐如需要查询数据库,则必须派 发到线程池(处理具体业务逻辑),否则 IO 线程阻塞,将导致不能接收其它请求。
需要通过不同的派发策略和不同的线程池配置的组合来应对不同的场景
<dubbo:protocol name="dubbo" dispatcher="all" threadpool="fixed" threads="100" />
Dispatcher(all、direct 、message 、execution 等 ) 分发策略
ThreadPool (fixed 、cached 、limited 等)线程池类型
直连提供者
在开发及测试环境下,经常需要绕过注册中⼼,只测试指定服务提供者,这时候可能需要 点对点直连,点对点直联⽅式,将以服务接⼝为单位,忽略注册中⼼的提供者列表,A 接⼝配 置点对点,不影响 B 接⼝从注册中⼼获取列表。
如:线上需要点对点测试,dubbo:reference中配置URL指向服务提供者,将绕过注册中⼼
1 | <!--直连提供者--> |
多协议
Dubbo 允许配置多协议,在不同服务上⽀持不同协议或者同⼀服务上同时⽀持多种协 议。
不同服务不同协议
1 | <!-- 用dubbo协议在20880端口暴露服务 --> |
多协议暴露服务
1 | <dubbo:protocol name="dubbo" port="20880" /> |
多注册中⼼
Dubbo ⽀持同⼀服务向多注册中⼼同时注册,或者不同服务分别注册到不同的注册中⼼ 上去,甚⾄可以同时引⽤注册在不同注册中⼼上的同名服务。
1 | <!--多注册中心--> |
服务分组
当⼀个接⼝有多种实现时,可以⽤ group 区分
1 | <!-- 服务分组 服务--> |
1 | <!--服务分组 引用--> |
多版本
当⼀个接⼝实现,出现不兼容升级时,可以⽤版本号过渡,版本号不同的服务相互间不引⽤。
1 | <!-- 不同版本的 服务 --> |
1 | <!-- 消费指定版本的服务 --> |
分组聚合
按组合并返回结果,⽐如菜单服务,接⼝⼀样,但有多种实现,⽤group区分,现在消费 ⽅需从每种group中调⽤⼀次返回结果,合并结果返回,这样就可以实现聚合菜单项。
1 | public interface DemoService { |
1 | <!-- 服务分组 --> |
1 | <!-- 分组聚合 合并g1,g2组的结果--> |
结果缓存
结果缓存,⽤于加速热⻔数据的访问速度,Dubbo 提供声明式缓存,以减少⽤户加缓存 的⼯作量。
缓存类型
lru、threadlocal、jcache
配置
1 | <!--服务调用方 结果缓存--> |