dubbo整体架构
- 其中Service 和 Config 层为 API,对应服务提供方来说是使用ServiceConfig来代表一个要发布的服务配置对象,对应服务消费方来说ReferenceConfig代表了一个要消费的服务的配置对象。可以直接初始化配置类,也可以通过 spring 解析配置生成配置类。
- proxy 服务代理层:扩展接口为 ProxyFactory,dubbo实现的SPI主要JavassistProxyFactory(默认使用)和JdkProxyFactory,用来对服务提供方和服务消费方的服务进行代理。
- registry 注册中心层:封装服务地址的注册与发现,扩展接口为 Registry , RegistryService,Dubbo提供的扩展接口实现为ZookeeperRegistry,RedisRegistry,MulticastRegistry,DubboRegistry。
- 扩展接口RegistryFactory,dubbo提供的扩展接口实现DubboRegistryFactory,DubboRegistryFactory,RedisRegistryFactory,ZookeeperRegistryFactory。
- cluster 路由层:封装多个提供者的路由及负载均衡,并桥接注册中心,
- 扩展接口为 Cluster , Directory , Router ,LoadBalance。
- monitor 监控层:RPC 调用次数和调用时间监控,扩展接口为 MonitorFactory , Monitor , MonitorService。
- protocol 远程调用层:封将 RPC 调用,扩展接口为 Protocol , Invoker , Exporter。
- exchange 信息交换层:封装请求响应模式,同步转异步,扩展接口为 Exchanger , ExchangeChannel ,ExchangeClient , ExchangeServer
- transport 网络传输层:抽象 mina 和 netty 为统一接口扩展接口为 Channel , Transporter , Client , Server , Codec
- serialize 数据序列化层:可复用的一些工具,扩展接口为 Serialization ,ObjectInput , ObjectOutput , ThreadPool
dubbo服务发布流程
首先 ServiceConfig 类拿到对外提供服务的实际类 ref(如:UserServiceImpl),然后通过 ProxyFactory 类(默认加载JavassistProxyFactory)的 getInvoker 方法使用 ref 生成一个AbstractProxyInvoker 实例(匿名内部类AbstractProxyInvoker重写了doInvoke方法,doInvoke方法由Wrapper的doInvoke实现,匿名内部类AbstractProxyInvoker调用匿名内部类Wrapper$1中的InvokeMethod方法),到这一步就完成具体服务到 Invoker 的转化。
invoker=Proxy_Factory.getInvoker(ref, interfaceclass,url)
- ref:具体服务实际类 UserServiceImpl
- interfaceclass:UserService
- url:包含调用服务的所有参数信息,IP地址等
接下来就是 Invoker 转换到 Exporter 的过程。Dubbo 处理服务暴露的关键就在 Invoker 转换到 Exporter 的过程,上图中的红色部分。
Dubbo 协议的 Invoker 转为 Exporter 发生在 DubboProtocol 类的 export 方法,它主要是打开创建一个Netty Server 侦听服务,并接收客户端发来的各种请求,通讯细节由 Dubbo 自己实现,然后注册服务到服务注册中心。
dubbo消费流程
首先 ReferenceConfig 类的 init 方法调用 Protocol 的 refer 方法生成 Invoker 实例(如上图中的红色部分),这是服务消费的关键。
invoker=REF_PROTOCOL.refer(interfaceClass,url)
接下来把Invoker 转换为客户端需要的接口。
ref=PROXY_FACTORY.getProxy(invoker, xxxx);
dubbo协议的invoker转换为客户端需要的接口是发生在DubboProtocol的refer方法,他主要是创建一个netty client 链接服务提供者,通讯细节由 Dubbo 自己实现。