大数跨境
0
0

剖析Dubbo框架的演进过程

剖析Dubbo框架的演进过程 二进制跳动
2022-07-31
0
导读:Dubbo框架演进过程之那几点说说。


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 {   @Adaptive({Constants.PROXY_KEY})   <T> T getProxy(Invoker<T> invoker) throws RpcException;      @Adaptive({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部分代表的是业务服务。


知其然,知其所以然!





【声明】内容源于网络
0
0
二进制跳动
15 年 + 技术老兵 架构师|技术总监|科技创业技术合伙人 曾任职苏宁科技、电讯盈科、联想云 专注架构设计与技术落地
内容 739
粉丝 0
二进制跳动 15 年 + 技术老兵 架构师|技术总监|科技创业技术合伙人 曾任职苏宁科技、电讯盈科、联想云 专注架构设计与技术落地
总阅读5
粉丝0
内容739