Dubbo
Dubbo是一款高性能Java RPC框架。采用全Spring配置方式,透明化接入应用。Spring只需加载Dubbo配置即可。(也可以通过api方式进行调用)。(服务接口单独打jar,供服务提供方和服务消费方共享)
三大核心能力
- 面向接口的远程调用
- 智能容错和负载均衡
- 服务自动注册和发现
Dubbo结构
- Provider,暴露服务的服务提供方。
- Consumer,调用远程服务的服务消费方。
- Registry,服务注册与发现的注册中心。(仅负责地址注册与查找,不转发请求,压力小)
- Montior,统计服务的调用次数和调用时间的监控中心。
- Container,服务运行容器。
- 服务容器负责启动、加载、运行服务提供者
- 服务提供者在启动时,向注册中心注册自己提供的服务
- 服务消费者在启动时,向注册中心订阅自己所需的服务
- 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送消息给消费者
- 服务消费者,从提供者地址列表中,基于负载均衡算法,选一台提供者进行调用,如果调用是失败,再选一台
- 服务提供者和消费者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心
- 注册中心,服务提供者,服务消费者三者之间均为长连接,监控中心除外
- 注册中心通过长连接感知服务提供者的存在,服务提供者宕机,注册中心将立即推送事件通知消费者
- 注册中心和监控中心全部宕机,不影响已运行的提供者和消费者,消费者在本地缓存了提供者列表
- 注册中心和监控中心都是可选的,服务消费者可以直连服务提供者
特性
- 面向接口代理的高性能RPC调用(服务以接口为粒度,为开发者屏蔽远程调用底层细节)
- 服务自动注册与发现(支持多种注册中心服务,服务实例上下线感知)
- 智能负载均衡(内置多种负载均衡策略,可感知节点状况)
- 可视化的服务治理与运维(提供丰富服务治理、运维工具)
服务提供方
服务提供方通过配置声明、暴露服务。
需要的属性有
- 服务注册中心 <dubbo:registry address="">(将服务地址暴露到服务注册中心)
- 提供方应用信息 <dubbo:application name="">(用于计算依赖关系)
- 配置暴露到协议以及端口 <dubbo:protocol name="" port="">
- 声明要暴露的服务接口 <dubbo:service interface="" ref="">
服务消费方
通过spring配置引用远程服务
- 服务注册中心 <dubbo:registry address="">(发现服务注册地址)
- 消费方应用信息 <dubbo:application name="">(用于计算依赖关系)
- 生成远程服务代理,可以和本地bean一样去使用 <dubbo:reference id="" interface="">
配置覆盖
以timeout(超时)为例(建议由服务提供方配置超时)
- 方法级优先,接口级次之,全局配置再次之。
- 如果级别一样,则消费方优先,提供方次之。
动态配置中心
- 外部化配置。启动配置的集中式存储 (简单理解为dubbo.properties的外部化存储)。
- 服务治理。服务治理规则的存储与通知。
<dubbo:config-center address="zookeeper://127.0.0.1:2181"/>
外部配置拥有最高优先级,会覆盖本地配置
zookeeper,默认所有的配置都在 /dubbo/config 节点下
/dubbo/config/dubbo 全局配置
/dubbo/config/application 应用配置
启动时检查
通过配置check="true",不可用时会抛出异常,阻止spring初始化完成
集群容错
当集群调用失败时,dubbo提供了多种容错方案,缺省为重试
- Failover Cluster 失败自动切换,重试其他服务器(重试会带来更长延迟),可设置重试次数(不包含第一次),通常用于读操作
- Failfast Cluster 快速失败,只发器一次调用,失败立即报错。通常用于非幂等性的写操作,比如新增
- Failsafe Cluster 失败安全,出现异常时,直接忽略。通常用于学入审计日志等操作
- Failback Cluster 失败自动恢复,后台记录失败请求,定时重发。通常用于消息通知操作
- Forking Cluster 并行调用多个服务器,只要一个成功即返回。会消费更多服务资源。可通过fork来设置最大并行数
- Broadcast Cluster 广播调用所有提供者,任意一台报错则报错。通常用于通知所有提供者更新缓存或日志等本地信息
负载均衡
缺省为随机调用
- Random LoadBalance 随机,可按照权重设置随机概率
- RoundRobin LoadBalance 轮询,按公约后等权重设置轮询比
- LeastActive LoadBalance 最少活跃调用数,相同活跃数随机,使慢的提供者收到更少的请求
- ConsistentHash LoadBalance 一致性hash,相同参数的请求总是发到同一提供者。当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其他提供者。
服务降级
可以通过服务降级临时屏蔽某个出错的非关键服务,并定义降级后的返回策略
线程模型
I/O线程,配置在netty连接点的用于处理网络数据的线程。dubbo默认采用的是长连接的方式,即一个consumer和一个provider之间只会建立一条链接。I/O线程的工作就是编码和解码
如果事件处理的逻辑能快速完成,则直接在I/O线程上处理会更快,因为减少了线程池的调度
但如果处理慢,就派发到线程池。
http://dubbo.apache.org/zh-cn/docs/user/demos/thread-model.html
直连提供者
在开发及测试环境下,经常需要绕过注册中心来连接指定的服务提供方(点对点连接)
多协议
dubbo配置允许多协议,在不同服务上支持不同协议或者同以服务上支持多种协议。比如:大数据用短链接协议,小数据大并发用长连接协议。
多注册中心
Dubbo 支持同一服务向多注册中心同时注册,或者不同服务分别注册到不同的注册中心上去,甚至可以同时引用注册在不同注册中心上的同名服务
服务分组
当一个接口有多种实现时,可以用group区分
多版本
当一个接口实现,出现不兼容升级时,可以用版本号过渡,版本号不同的服务相互间不引用
主要性能
消费者异步调用,提供者异步执行,从而快速响应
事件通知,在调用接口前,后,异常时进行通知
并发控制,服务器端接口下的每个方法并发执行不能超过10个线程