Dubbo 框架是一个非常流行的 RPC 框架,虽然这一框架目前已经得到了广泛的应用,源码是比较困难的,所以我们需要从易到难度框架进行拆解。
Dubbo在代码结构上一共有八个核心包,如下图所示:

RPC 架构的整体设计思路
设计和实现一个RPC的基本思路和步骤如下:

服务提供者和消费者之间的远程访问(一对一),是 RPC 架构最基础的组成部分。
通过代理使远程调用本地化,即实现透明化远程调用
对远程访问过程添加集群访问模式,集群能够为我们提供负载均衡、集群容错等机制。
添加服务治理机制,实现服务的自动发现和注册,以及一定的服务监控措施。
Dubbo架构的演进过程:

Protocol层组件是Dubbo的核心层,为开发人员提供了偏技术底层的RPC功能。
在Protocol层的基础上,Dubbo通过Proxy层提供了动态代理机制,使远程直接本地化使用了。
调用功能具备后,Dubbo通过Cluster层组件实现了分布式环境下的的负载均衡和集群容错机制
Dubbo协议是Remoting层的一个创新
最后就是一些闭环的功能例如监控、服务注册。
Protocol:rpc的基础组件
接口定义如下:
public interface Protocol {int getDefaultPort();<T> Exporter<T> export(Invoker<T> invoker) throws RpcException;<T> Invoker<T> refer(Class<T> type, URL url) throws RpcException;void destroy();}
Protocol的核心接口是export()和refer()接口,前者用于暴露服务,后者用于对远程服务的引用。在Dubbo中存在一大批的实现类。

Proxy:透明化远程调用
Protocol接口,在export()中会传入一个Invoker,代表的是一个调用器,负责方法的执行。在远程调用中,为了做到调用的本地化,一般都是用代理对象,该代理对象充当了服务接口的真实实现,代理对象的处理过程就是位于ProxyFactory中,
ProxyFactory 接口的实现类只有两种,即基于动态字节码实现动态代理的 JavassistProxyFactory,以及基于 JDK 自带代理机制的 JdkProxyFactory
:
public interface ProxyFactory {({Constants.PROXY_KEY})<T> T getProxy(Invoker<T> invoker) throws RpcException;({Constants.PROXY_KEY})<T> Invoker<T> getInvoker(T proxy, Class<T> type, URL url) throws RpcException;}
Cluster:负载均衡和集群容错机制
cluster在Dubbo中完成两个部分工作:一个是负载均衡,一个是集群容错。
在Dubbo中,负载均衡则是由LoadBalance接口定义:
public interface LoadBalance {<T> Invoker<T> select(List<Invoker<T>> invokers, URL url, Invocation invocation) throws RpcException;}
LoadBalance接口只有一个方法,即在一组Invoker列表选择其中一个Invoker进行返回。这里主要有四种策略:

上面是负载均衡,再说说集群容错,Dubbo中的Cluster类的定义如下:
public interface Cluster {<T> Invoker<T> join(Directory<T> directory) throws RpcException;}
通过 Directory 获取多个远程调用中的 Invoker,基于多个中按照策略选中一个返回。而一旦 Invoker 获取失败,通过集群实现访问容错的问题。默认采用的是失败转移的 FailoverCluster。

Remoting:自定义网络通信协议
Dubbo 的 remoting 模块是远程通讯模块,实现了 Dubbo 这一自定义协议。从架构演进这一角度来看,这是一个具有较大扩展性的组件,是对现有TCP的封装,Dubbo 提供了一个 Codec 接口来完成这一目标。这里列出了新版的 Codec2 接口的代码定义。
public interface Codec2 {void encode(Channel channel, ChannelBuffer buffer, Object message) throws IOException;Object decode(Channel channel, ChannelBuffer buffer) throws IOException;enum DecodeResult {NEED_MORE_INPUT, SKIP_SOME_INPUT}}
code2接口的实现类,是在不同层次上处理消息的编解码。
Transport 层负责网络传输,而 Exchange 层则处理具体的消息交换过程

Registry 和 Monitor:服务治理和监控辅助功能
在 Dubbo 中,注册中心是通过 RegistryService 接口来实现的,该接口包含了一组常用的服务注册和订阅方法。
public interface RegistryService {void register(URL url);void unregister(URL url);void subscribe(URL url, NotifyListener listener);void unsubscribe(URL url, NotifyListener listener);List<URL> lookup(URL url);}
Dubbo 中的注册中心实现方式有多种,分别借助于 Dubbo、Multicast、Redis 和 ZooKeeper 等协议和工具,其中 ZooKeeper 是 Dubbo 内置的默认注册中心实现工具。
结合以上五点,Dubbo框架的演进过程大概如下图所示:

Dubbo中的各个核心组件分成三个部分。最底部的是remoting部分主要完成网络通信,包含Exchange、Transport和Serialize组件, 中间的部分是核心部分,
包含了 Protocal、Proxy、Cluster、Registry、Monitor 等组件。最上面的Business部分代表的是业务服务。
知其然,知其所以然!

