Dubbo
官方文档 link
是什么
- 一款分布式服务框架
- 高性能和透明化的RPC远程服务调用方案
- SOA服务治理方案
RPC
- Remote Procedure Call Protocol 远程过程调用
- A B两台服务器分别部署不同的应用。当A服务器需要调用B服务器上的方法,只能通过网络来调用。所以就叫远程服务调用。
SOA - 面向服务框架
- 是一个组件模型,将不同应用程序的不同功能单元通过服务之间定义良好的接口和契约联系起来。
能干什么
- 透明化的远程方法调用。
- 就像调用本地方法一样,简单配置,没有任何api侵入
- 软负载均衡及容错机制
- 服务自动注册和发现
- 不需要写死服务提供方地址。注册中心基于接口名查询服务提供者的ip地址,并且平滑的添加和删除服务提供者。
架构
- Provider 暴露服务的 服务提供方
- Consumer 调用远程服务的 服务消费方
- Registry 服务注册与发现的 注册中心
- Monitor 统计服务的调用次数和调用时间的 监控中心
调用流程
- 服务容易启动、加载,运行服务提供者
- 服务提供者启动时,向注册中心注册自己要提供的服务
- 服务消费者启动时,向注册中心订阅自己所需的服务
- 注册中心返回提供者地址列表给消费者。如果有变更,注册中心将基于长连接推送变更数据给消费者
- 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果失败,再选择另一台
- 消费者和提供者,定时每分钟发送调用次数和时间到监控中心
底层实现
协议支持
- dubbo协议
- Hessian
- Http
- Rmi
- webservice
- Thrift
- Memcached
- redis
默认使用dubbo协议
采用单一长连接和NIO异步通讯,适合于小数据量大并发的服务调用。以及服务消费者机器数远大于提供者机器数的情况
使用基于 mina 1.1.7 和 hessian 3.2.1 的 tbremoting 交互。
支持的注册中心
- Multicast
- Zookeeper
- Redis
- Simple
zookeeper注册中心
Zookeeper是一个树型的目录服务,支持变更推送
流程说明:
- 服务提供者启动时:
- 向/dubbo/com.foo.BarService/providers 目录下写入自己的 URL 地址
- 服务消费者启动时:
- 订阅../../providers下的url地址
- 并向../../consumers目录写入自己的url地址
- 监控中心启动时:
- 订阅/dubbo/com.foo.BarService/目录下所有的提供者和消费者url地址
支持以下功能
- 当提供者出现异常停机时,注册中心能自动删除提供者信息
- 当注册中心重启以及会员过期时,能自动恢复注册数据以及订阅请求
- 记录失败注册和请求,后台定时重试
- ***等等
服务暴露的详细过程
服务提供者暴露一个服务的详细过程:
- 首先ServiceConfig类拿到对外提供服务的实际类ref
- 然后将ProxyFactory类的getInvoker方法使用ref生成一个AbstractProxyInvoker。到这一步就完成具体服务到invoker(调用者)的转化
- 接下来就是Invoker转换成Exporer,Dubbo协议实现:
- DubboProtocol类的export方法,主要是打开socket侦听服务,并接收客户端发来的各种请求。
服务消费者详细过程
- ReferenceConfig类的init方法调用Protocol的refer方法生成Invoker实例
- 把Invoker转为客户端需要的接口
核心概念总结
- ProxyFactory
- 实现了所有服务接口的透明化代理,有两个方法
- getInvoker 服务端使用 将实现类封装成一个Invoker
- getProxy 客户端使用 创建接口的代理对象
- Invoker
- 封装了一个服务的相关信息,是一个服务的可执行体
- Invocation
- 会话域 它持有调用过程中的变量。比如方法名,参数等
- Protocol
- 服务域 他是Invoker引用和暴露的主要入口,负责Invoker的生命周期管理
- Exporter
- 具体执行Invoker的生命周期
- Exchange
- 封装请求响应模式,同步转异步
- Transport
- 网络传输层 抽象mine netty的统一接口