dubbo 自定义路由_Dubbo分层架构概述
本節(jié)我們從整體上來看看 Dubbo 的分層架構設計,架構分層是一個比較經典的模式,比如網絡中的7層協(xié)議,每層執(zhí)行固定的功能,上層依賴下層提供的功能,下層對上層提供功能,下層的改變對上層不可見,并且每層都是一個可被替換的組件。
如下圖是 Dubbo 官方提供的Dubbo的整體架構圖:
圖2.1.1
Dubbo 官方提供的該架構圖很復雜,一開始我們沒必要深入細節(jié),下面我們簡單講解下其中的主要模塊:
其中 Service 和 Config 層為 API接口層,是為了方便的讓Dubbo使用方發(fā)布服務和引用服務;對于服務提供方來說需要實現服務接口,然后使用 ServiceConfig API 來發(fā)布該服務;對于服務消費方來說需要使用ReferenceConfig 對服務接口進行代理。Dubbo服務發(fā)布與引用方可以直接初始化配置類,也可以通過 Spring 配置自動生成配置類。
其它各層均為 SPI層,SPI 意味著下面各層都是組件化可以被替換的,這也是 Dubbo 設計的比較好的一點。Dubbo 增強了 JDK 中提供的標準 SPI 功能,在 Dubbo 中除了 Service 和 Config 層外,其它各層都是通過實現擴展點接口來提供服務的;Dubbo 增強的 SPI 增加了對擴展點 IoC 和 AOP 的支持,一個擴展點可以直接 setter 注入其它擴展點;并且不會一次性實例化擴展點的所有實現類,這避免了當擴展點實現類初始化很耗時,但當前還沒用上它的功能時仍進行加載實例化,浪費資源的情況;增強的 SPI 是在具體用某一個實現類的時候才對具體實現類進行實例化。后續(xù)會具體講解 Dubbo 增強的 SPI 的實現原理。
Proxy 服務代理層:該層主要是對服務消費端使用的接口進行代理,把本地調用透明的轉換為遠程調用;另外對服務提供方的服務實現類進行代理,把服務實現類轉換為 Wrapper 類,這是為了減少反射的調用,后面會具體講解到。Proxy層的SPI擴展接口為 ProxyFactory,Dubbo 提供的實現主要有 JavassistProxyFactory(默認使用)和 JdkProxyFactory,用戶可以實現ProxyFactory SPI接口,自定義代理服務層的實現。
Registry 服務注冊中心層:服務提供者啟動時候會把服務注冊到服務注冊中心,消費者啟動時候會去服務注冊中心獲取服務提供者的地址列表,Registry層主要功能是封裝服務地址的注冊與發(fā)現邏輯,擴展接口 Registry 對應的擴展實現為 ZookeeperRegistry、RedisRegistry、MulticastRegistry、DubboRegistry等。擴展接口 RegistryFactory 對應的擴展接口實現為 DubboRegistryFactory、DubboRegistryFactory、RedisRegistryFactory、ZookeeperRegistryFactory。另外該層擴展接口Directory實現類有RegistryDirectory、StaticDirectory用來透明的把invoker列表轉換為一個invoker;用戶可以實現該層的一系列擴展接口,自定義該層的服務實現。
Cluster 路由層:封裝多個服務提供者的路由規(guī)則、負載均衡、集群容錯的實現,并橋接服務注冊中心;擴展接口 Cluster 對應的實現類有 FailoverCluster(失敗重試)、FailbackCluster(失敗自動恢復)、FailfastCluster(快速失敗)、FailsafeCluster(失敗安全)、ForkingCluster(并行調用)等;負載均衡擴展接口 LoadBalance 對應的實現類為 RandomLoadBalance(隨機)、RoundRobinLoadBalance(輪詢)、LeastActiveLoadBalance(最小活躍數)、ConsistentHashLoadBalance(一致性hash)等。用戶可以實現該層的一系列擴展接口,自定義集群容錯和負載均衡策略。
Monitor 監(jiān)控層:用來統(tǒng)計RPC 調用次數和調用耗時時間,擴展接口為 MonitorFactory,對應的實現類為 DubboMonitorFactroy。用戶可以實現該層的MonitorFactory擴展接口,實現自定義監(jiān)控統(tǒng)計策略。
Protocol 遠程調用層:封裝 RPC 調用邏輯,擴展接口為 Protocol, 對應實現有 RegistryProtocol、DubboProtocol、InjvmProtocol 等。
Exchange 信息交換層:封裝請求響應模式,同步轉異步,擴展接口 Exchanger,對應擴展實現有 HeaderExchanger 等。
Transport 網絡傳輸層:抽象 mina 和 netty 為統(tǒng)一接口。擴展接口為 Channel,對應實現有 NettyChannel(默認)、MinaChannel 等;擴展接口Transporter對應的實現類有GrizzlyTransporter、MinaTransporter、NettyTransporter(默認實現);擴展接口Codec2對應實現類有DubboCodec、ThriftCodec等
Serialize 數據序列化層:提供可以復用的一些工具,擴展接口為 Serialization,對應擴展實現有 DubboSerialization、FastJsonSerialization、Hessian2Serialization、JavaSerialization等,擴展接口ThreadPool對應擴展實現有 FixedThreadPool、CachedThreadPool、LimitedThreadPool 等。
綜上可知Dubbo的分層架構使得Dubbo的每層的功能都是可被替換的,這使得Dubbo的擴展性極強,上面說了那么多關于擴展點的東西,那么具體什么是擴展點呢,下面看下 Dubbo 擴展點一個簡單例子。以擴展點 Protocol 為例:
@SPI("dubbo")
public interface Protocol {
...
}
擴展點接口的類上面都含有@SPI注解,這里注解里面的"dubbo"說明Protocol擴展接口SPI的默認實現是DubboProtocol。
如果我們想自己寫一個 Protocol 擴展接口的實現類,那么我們需要在實現類所在的 Jar 包內的 META-INF/dubbo/?目錄下創(chuàng)建一個名字為 org.apache.dubbo.rpc.Protocol 的文本文件,然后配置它的內容為:
myprotocol=com.alibaba.user.MyProtocol
假設該實現類 MyProtocol 的內容如下:
package com.alibaba.user;
public class MyProtocol implemenets Protocol {
// ...
}
那么如何使用我們自定義的擴展實現呢?Dubbo 配置模塊中,擴展點均有對應配置屬性或標簽,如下代碼通過配置標簽方式指定使用哪個擴展實現:
name="myprotocol" />
注意這里的 name 必須與 jar 包內 META-INF/dubbo/?目錄下 org.apache.dubbo.rpc.Protocol 文件中的等號左側的key的名字一致。
如上內容摘自《。
總結
以上是生活随笔為你收集整理的dubbo 自定义路由_Dubbo分层架构概述的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在python语言中语句的续行符是_Py
- 下一篇: python数据拟合固定参数_如何将数据