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)在使用過程中在內存中記錄調用次數和調用時間,通過異步方式每分鐘往監控中心發送調用信息。監控中心用於統計調用次數和調用時間等。

        將上圖調用鏈展開的話就是下面這張詳細調用鏈圖:


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章