前言
1. 直連提供者簡介
直連服務提供者意思就是我們可以不使用注冊中心獲取服務提供者列表,而是通過我們在消費端指定調用特定的服務。這種點對點直連方式,將以服務接口為單位,忽略注冊中心的提供者列表。同時我們在消費端配置點對點連接,不會影響其他服務消費端對此服務從注冊中心拉去服務的列表。
上圖展示了兩種方式:第一種是服務消費端從獲取到的服務列表中選擇調用的服務、第二種直連方式是通過在消費端指定特定服務進行調用,而不是從服務列表中選取服務。
2. Dubbo 直連的方式
Dubbo 中提供3種配置直接的方式:
-
XML 配置
<dubbo:reference id="bookFacade"
interface="com.muke.dubbocourse.common.api.BookFacade" url="dubbo://localhost:20890"> -
JVM 參數
java -Dcom.muke.dubbocourse.common.api.BookFacade=dubbo://localhost:20890
-
映射文件
使用
-Ddubbo.resolve.file
指定映射文件路徑。例如:指定dierect.properties
java -Ddubbo.resolve.file=dierect.properties
dierect.properties
文件配置內容:com.muke.dubbocourse.common.api.BookFacade=dubbo://localhost:20890
Tips:此配置優先級高於
<dubbo:reference>
中的配置。
在上面介紹的這3種直連方式中他們的加載是存在優先級,它們的加載順序:JVM 參數 > 映射文件 > XML 配置。
3. 使用場景
我們上面介紹了什么是直連服務以及3種使用直連服務的方式。那么直連服務到底有哪些使用場景呢?我們下面簡單介紹下我們工作中可以使用到的場景:
-
當我們在測試環境時候我們希望直接連接服務提供者進行測試,從而繞開了復雜的注冊中心環境切換。
-
假設我們的應用服務提供了一個檢查服務存活狀態的服務,假設我們部署多台機器我們希望對每一台服務進行存活檢查,那么我們需要循環調用所有服務的存活檢查接口。
4. 示例演示
下面我們同樣以獲取圖書列表服務為例,代碼結構如下:
這里主要介紹 XML 配置方式其他2種方式小伙伴可以自行拓展實驗。下面我們主要介紹服務消費端的配置文件dubbo-consumer-xml.xml
:
從上面的 XML 配置文件中可以看出,我們在配置<dubbo:reference>
標簽的時候指定url="dubbo://localhost:20890"
。它的意思是指定我們引用的服務所在機器IP、端口、使用協議,而不需要從注冊中心獲取此接口注冊的服務提供者列表中進行選擇服務。
5. 原理分析
其實原理非常簡單就是通過我們配置的url
參數加上接口名稱的組合,封裝為 URL 然后創建 Invoker 代理對象。 結合 Dubbo 源碼分析:org.apache.dubbo.config.ReferenceConfig#createProxy
private T createProxy(Map<String, String> map) {
if (shouldJvmRefer(map)) {
...
} else {
urls.clear();
//如果我們指定的url不為空
if (url != null && url.length() > 0) {
String[] us = SEMICOLON_SPLIT_PATTERN.split(url);
if (us != null && us.length > 0) {
for (String u : us) {
//dubbo://localhost:20890 轉換為 URL
URL url = URL.valueOf(u);
//判斷 URL Path是否為空
if (StringUtils.isEmpty(url.getPath())) {
//設置Path 后為:dubbo://localhost:20890/com.muke.dubbocourse.common.api.BookFacade
url = url.setPath(interfaceName);
}
if (UrlUtils.isRegistry(url)) {
urls.add(url.addParameterAndEncoded(REFER_KEY, StringUtils.toQueryString(map)));
} else {
urls.add(ClusterUtils.mergeUrl(url, map));
}
}
}
} else { // assemble URL from register center's configuration
...
}
if (urls.size() == 1) {
//獲取調用代理Invoker
invoker = REF_PROTOCOL.refer(interfaceClass, urls.get(0));
} else {
...
}
}
// create service proxy
return (T) PROXY_FACTORY.getProxy(invoker, ProtocolUtils.isGeneric(generic));
}
從上面主要核心源碼中文解析可以看出,在我們指定了url
后會被拼接上接口名稱(dubbo://localhost:20890/com.muke.dubbocourse.common.api.BookFacade
)來構建 Invoker 代理對象。
6. 小結
在本小節中我們主要學習了 Dubbo 中的直連服務提供者的原理和3種配置方式,分別是 XML 配置、映射文件、JVM 參數配置,這三種配置同時存在優先級。同時我們也學習了直連服務提供者場景的使用場景,可以在特定場景中簡化我們的開發和測試。
本節課程的重點如下:
-
理解 Dubbo 中直連服務提供者
-
了解直連服務提供者原理
-
了解直連服務提供者使用方式
-
了解直連服務提供者使用場景
作者
個人從事金融行業,就職過易極付、思建科技、某網約車平台等重慶一流技術團隊,目前就職於某銀行負責統一支付系統建設。自身對金融行業有強烈的愛好。同時也實踐大數據、數據存儲、自動化集成和部署、分布式微服務、響應式編程、人工智能等領域。同時也熱衷於技術分享創立公眾號和博客站點對知識體系進行分享。關注公眾號:青年IT男 獲取最新技術文章推送!
博客地址:
微信公眾號: