Dubbo学习之路(一):初识Dubbo-设计原理

                                                            初识Dubbo-设计原理

      接触背景:2017-11-31入职新公司之前,一直都是在中小型企业,大多都是使用单机模式,最多就是使用nginx做一层反向代理和负载均衡。入职新公司后,业务线比较广,公司主要采用分布式微服务架构。自身本来就对这方面比较欠缺,正好利用此次机会深入学习一下。

       Dubbo介绍:Dubbo是一个分布式服务框架,提供高性能和透明(调用远程方法犹如调用本地方法一样)的远程RPC调用方案,以及SOA服务治理方案。

       Dubbo特点:按照分层的方式来架构,使各层之间解耦合(做到最大程度的松耦合)。下面是总体架构图:


        Dubbo框架一共分为10个层,图中左边淡蓝色为服务消费者使用的接口,右边淡绿色为服务提供者使用的接口,位于中轴线上的是双方都可使用的接口。下面看一下10各层每层的作用。

        1.服务接口层(Service):主要是跟实际业务相关,是专门提供给想接入Dubbo的分布式服务项目实现业务逻辑的接口层,服务的提供方和消费方根据业务来设计接口和实现接口

       2.配置层(Config):对外提供配置接口,主要以ServiceConfigReferenceConfig为中心,可以直接生成配置类(New对象),或者跟Spring结合(通过spring解析来生成配置类)。

        3.服务代理层(Proxy):服务接口透明代理,生成服务的客户端Stub和服务端Skeleton,以ServiceProxy为中心,扩展接口为ProxyFactory

        4.服务注册层(Registey):主要是封装服务注册和发现,提供给消费者使用。以URL(Dubbo自己实现的URL)为总线扩展,扩展的接口有:RegistryRegistryFactoryRegistryService注册中心不是必须的,可以没有,如果没有相当于服务直接暴露给消费者。

        5.集群和负载均衡层(Cluster):封装多个提供者和负载均衡的实现,连接注册中心,以Invoker为中心,主要扩展接口有:ClusterDirectoryRouterLoadBalance。将多个服务提供者合并成一个提供者,实现透明化的给消费者提供服务,让服务端无感知,以为只有一个服务提供者。

        6.监控层(Monitor):主要是对服务的调用次数,调用时间进行监控统计,以Statistics为中心,扩展接口为MonitorFactoryMonitorMonitorService

      7.远程调用协议层(Protocol):封装RPC调用,InvocationResult为中心,扩展接口为ProtocolInvokerExporter。Protocol是服务域,它是Invoker暴露和引用的主功能入口,它负责Invoker的生命周期管理。Invoker是实体域,它是Dubbo的核心模型,其它模型都向它靠扰,或转换成它,它代表一个可执行体,可向它发起invoke调用,它有可能是一个本地的实现,也可能是一个远程的实现,也可能一个集群实现。

       8.信息交换层(Exchange):封装请求模式,以Request Response为中心,扩展接口为:ExchangerExchangeChannelExchangeClientExchangeServer

       9.网络传输层(Transport):封装mina和netty等,以消息为中心,扩展接口为:TransporterClientServerChannelCodec2

    10.数据序列化层(Serialize):公共的一些工具类,扩展接口为:SerializationObjectInputObjectOutputThreadPool

       对应的项目包结构如下:

        1.dubbo-common:公共模块,主要是工具类。

       2.dubbo-config:配置模块,是Dubbo的对外API,提供消费者(Consumer)和提供者(Provider)的配置以及spring相关的bean配置,达到隐藏Dubbo的所有细节。

        3.dubbo-registry:注册中心模块,基于注册中心下发地址的集群方式,以及对各种注册注册中心的抽象。

        4.dubbo-cluster:集群模块,奖多个服务提供方伪装成一个提供方,包括:负载均衡,容错,路由等。集群的地址列表可以是静态配置的,也可以由注册中心下发。

        5.dubbo-remoting:远程通讯模块,Dubbo协议的实现,如果RPC采用的是RMI协议则不需要使用此包。

        6.dubbo-rpc:远程调用模块,抽象各种协议,以及动态代理,只包含一对一的调用,不关心集群的管理。集群的实现主要在dubbo-cluster包中。

        7.dubbo-monitor:监控模块,统计调用次数和调用时间等的服务。

       8.dubbo-container:容器模块,是一个Standalone的容器,也简单的Main方法加载Spring启动,因为服务通常不需要Tomcat/JBoss等Web容器的特性,没必要用Web容器去加载和启动服务。

       Dubbo协议:

        1.Dubbo协议

        2.Hessian协议

        3.HTTP协议

        4.RMI协议

        5.WebService协议

        6.Thrift协议

        7.Memcached协议

        8.Redis协议

       服务的调用结构图:如下图

     

       上图蓝色部分代表的是与业务相关的交互,绿色部分相当于对于使用方是透明的,是Dubbo内部的调用。主要包含几个阶段。

        1.服务提供方(Provider)注册服务到注册中心。

        2.服务消费方(Consumer)从注册中心订阅服务。

        3.当服务提供方(Provider)有更改时,服务消费方(Consumer)会监听到注册中心发来的消息。

        4.服务消费方(Consumer)调用服务提供方(Provider)提供的服务。

        5.服务消费方(Consumer)和服务提供方(Provider)在使用过程中在内存中记录调用次数和调用时间,通过异步方式每分钟往监控中心发送调用信息。监控中心用于统计调用次数和调用时间等。

        将上图调用链展开的话就是下面这张详细调用链图:


猜你喜欢

转载自blog.csdn.net/jadebai/article/details/80684824