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