《Dubbo系列一些好用的功能》不看後悔系列
dubbo功能非常完善,很多時候我們不需要重複造輪子,下面列舉一些 你不一定知道,但是很好用 的功能;
直連Provider
在開發及測試環境下,可能需要繞過註冊中心,只測試指定服務提供者,這時候可能需要點對點直連,點對點直連模式,將以服務介面為單位,忽略註冊中心的提供者列表,A 介面配置點對點,不影響 B 介面從註冊中心獲取列表(說明:官方只建議開發&測試環境使用該功能),用法如下,url指定的地址就是直連地址:
<dubbo:reference id="demoService" interface="com.alibaba.dubbo.demo.DemoService" version="1.0.0" url="dubbo://172.18.1.205:20888/" />複製程式碼
多版本
當一個介面實現,出現不相容升級時,可以用版本號過渡,版本號不同的服務相互間不引用,用法如下:
<dubbo:service interface="com.alibaba.dubbo.demo.DemoService" ref="demoService" version="1.0.0" />複製程式碼
利用dubbo該特性,我們能夠實現一些功能的灰度釋出,實現步驟如下:
- 介面舊的實現定義version="1.0.0",介面新的實現version="2.0.0"
- Consumer端定義version="*"
這樣定義Provider和Consumer後,新舊介面實現各承擔
50%
的流量;
利用dubbo該特性,還能完成不相容版本遷移:
- 在低壓力時間段,先升級一半Provider為新版本;
- 再將所有消費者升級為新版本;
- 然後將剩下的一半提供者升級為新版本。
回聲測試
回聲測試用於檢測服務是否可用,回聲測試按照正常請求流程執行,能夠測試整個呼叫是否通暢,可用於監控。
所有服務自動實現
EchoService
介面,只需將任意服務引用強制轉型為
EchoService
即可使用,使用方式(demoService是spring管理的bean)
複製程式碼
-
EchoService echoService = (EchoService) demoService;
-
System.out.println(echoService.$echo("hello"));
隱式引數
可以透過
RpcContext
的
setAttachment()
和
getAttachment()
在Consumer和Provider之間進行引數的隱式傳遞,例如Controller層攔截登入token,把根據token得到的memberId傳給dubbo服務就能使用隱式引數傳遞的方式,
setAttachment()
設定的 KV 對,在完成一次遠端呼叫會被清空,即多次遠端呼叫要多次設定。使用方式:
1.服務端set:
RpcContext.getContext().setAttachment("CRT_MEMBER_ID", "13828886888");複製程式碼
2.客戶端get:
RpcContext.getContext().getAttachment("CRT_MEMBER_ID")複製程式碼
上下文
上下文中存放的是當前呼叫過程中所需的環境資訊。所有配置資訊都將轉換為 URL 的引數
RpcContext 是一個 ThreadLocal 的臨時狀態記錄器,當接收到 RPC 請求,或發起 RPC 請求時,RpcContext 的狀態
都會變化。例如:A 調 B,B 再調 C,則 B 機器上,在 B 調 C 之前,RpcContext 記錄的是 A 調 B 的資訊,在 B 調 C
之後,RpcContext 記錄的是 B 調 C 的資訊。使用方式:
boolean isConsumerSide = RpcContext.getContext().isConsumerSide();複製程式碼
這裡推薦一下我的Java高階交流群:606187239,群裡有(分散式架構、高可擴充套件、高效能、高併發、效能最佳化、Spring boot、Redis、ActiveMQ、等學習資源)進群免費送給每一位Java小夥伴,不管你是轉行,還是工作中想提升自己能力都可以,歡迎進群一起深入交流學習!
本地偽裝
本地偽裝通常用於服務降級,例如某驗權服務,當服務提供方全部掛掉後,客戶端不丟擲異常,而是透過 Mock 資料
返回授權失敗。使用方式如下,mock指定的實現類在Provider丟擲RpcException異常時執行(
一定要丟擲RpcException異常才執行
),取代遠端返回結果:
<dubbo:reference id="demoService" interface="com.alibaba.dubbo.demo.DemoService" version="1.0.0" mock="com.alibaba.dubbo.demo.consumer.mock.DemoServiceMock"/>複製程式碼
DemoServiceMock實現原始碼:
複製程式碼
-
public class DemoServiceMock implements DemoService {
-
public String sayHello(String name) {
-
return "mock-value";
-
}
-
}
泛化呼叫
泛化介面呼叫方式主要用於客戶端沒有 API 介面及模型類元的情況,引數及返回值中的所有 POJO 均用Map表示,通常用於框架整合,例如:實現一個通用的服務測試框架,可透過GenericService呼叫所有服務實現。使用方式:
<dubbo:reference id="demoService" interface="com.alibaba.dubbo.demo.DemoService" generic="true"/>複製程式碼
呼叫原始碼:
複製程式碼
-
/**
-
* afei
-
* 1.0.0
-
* 2017年11月22日
-
*/
-
public class Main {
-
public static void main(String[] args) {
-
// 引⽤遠端服務, 該例項⾥⾯封裝了所有與註冊中⼼及服務提供⽅連線,請快取
-
ReferenceConfig<GenericService> reference = new ReferenceConfig<GenericService>();
-
// 弱型別接⼝名
-
reference.setInterface("com.alibaba.dubbo.demo.DemoService");
-
reference.setVersion("1.0.0");
-
// 宣告為泛化接⼝
-
reference.setGeneric(true);
-
// ⽤com.alibaba.dubbo.rpc.service.GenericService可以替代所有介面引用⽤
-
GenericService genericService = reference.get();
-
// 基本型別以及Date,List,Map等不需要轉換,直接調⽤
-
Object result = genericService.$invoke("sayYes", new String[] {"java.lang.String"}, new Object[] {"afei"});
-
System.out.println("result --> "+result);
-
// ⽤Map表示POJO引數,如果返回值為POJO也將自動轉成Map
-
Map<String, Object> teacher = new HashMap<String, Object>();
-
teacher.put("id", "1");
-
teacher.put("name", "admin");
-
teacher.put("age", "18");
-
teacher.put("level", "3");
-
teacher.put("remark", "測試");
-
// 如果返回POJO將自動轉成Map
-
result = genericService.$invoke("justTest", new String[]
-
{"com.alibaba.dubbo.demo.bean.HighTeacher"}, new Object[]{teacher});
-
System.out.println("result --> "+result);
-
}
-
}
訪問日誌
如果想記錄每次請求資訊,可開啟訪問日誌,類似於Ngnix的訪問日誌。注意:此日誌量比較大,請注意磁碟容量。使用方式(如果配置區域性,全域性訪問日誌就會失效):
配置全域性:
<dubbo:provider accesslog="/app/dubbo-demo.log"/>複製程式碼
配置區域性:
複製程式碼
-
<dubbo:service interface="com.alibaba.dubbo.demo.DemoService" ref="demoService" accesslog="/app/demo.log"/>
-
<dubbo:service interface="com.alibaba.dubbo.demo.TestService" ref="testService" accesslog="/app/test.log"/>
日誌格式樣式:
[2017-11-22 10:23:20] 172.18.1.205:56144 -> 172.18.1.205:20886 - com.alibaba.dubbo.demo.DemoService:1.0.0 sayHello(java.lang.String) ["afei"]複製程式碼
延遲暴露
如果服務需要預熱時間,比如初始化本地快取,等待相關資源就位等,可以使用delay進行延遲暴露。使Dubbo在Spring容器初始化完後延遲多少毫秒再暴露服務。使用方式:
<dubbo:provider delay="5000"/>複製程式碼
或者:
<dubbo:service delay="5000" interface="com.alibaba.dubbo.demo.DemoService" ref="demoService" version="1.0.0"/>複製程式碼
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31545684/viewspace-2647453/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 不看後悔的Vue系列Vue
- 不看後悔系列 | 秒做BI報表,告別低效分析
- 最牛的debug技巧,不看後悔!
- 騰訊面試:一條SQL語句執行得很慢的原因有哪些?---不看後悔系列面試SQL
- 全網最牛的debug技巧,不看後悔!
- 面試”作弊“,不看絕對會後悔!面試
- 關於三次握手與四次揮手面試官想考我們什麼?--- 不看後悔系列面試
- 號外!號外!超全的陣列方法,不看後悔啊!!陣列
- 兩萬字的資料庫面試題,不看絕對後悔資料庫面試題
- ★★ 入坑嵌入式 不看你絕對後悔的內容剖析
- U盤裡的檔案刪除了還能恢復嗎?不看別後悔
- 不看後悔!2019年人工智慧行業的25大趨勢人工智慧行業
- 《Vue不看原始碼懂原理》系列——Vue模板編譯Vue原始碼編譯
- 這是面試專題系列第四篇,Dubbo系列面試
- 【Dubbo原始碼閱讀系列】之 Dubbo XML 配置載入原始碼XML
- dubbo系列(一):linux安裝dubbo與zookeeper(單節點)Linux
- Dubbo系列之 (一)SPI擴充套件套件
- 超詳細的程式設計師Java學習路線指南 ,從入門到精通 不看後悔程式設計師Java
- git上的後悔藥Git
- SpringCloud系列之Nacos+Dubbo應用篇SpringGCCloud
- Dubbo系列之 (四)服務訂閱(1)
- Dubbo系列之 (六)服務訂閱(3)
- Dubbo系列之 (五)服務訂閱(2)
- Dubbo 入門系列之基於 Dubbo API 開發微服務應用API微服務
- Dubbo系列之 (七)鏈路層那些事(1)
- SpringCloud系列之Nacos+Dubbo+Seata應用篇SpringGCCloud
- Dubbo系列之 (七)網路層那些事(2)
- 一位考研黨親自整理的大學計算機網路基礎知識總結(不看後悔版)計算機網路
- 2019年阿里必問面試題集錦(收藏不看系列),你懂得!阿里面試題
- Dubbo系列之 (二)Registry註冊中心-註冊(1)
- Dubbo系列之 (二)Registry註冊中心-註冊(2)
- Dubbo學習系列之十八(Skywalking服務跟蹤)
- Spring Cloud Alibaba系列之分散式服務元件DubboSpringCloud分散式元件
- Dubbo 實現原理與原始碼解析系列 —— 精品合集原始碼
- 【Git 系列】一個超好用的命令你會用嗎?Git
- Elasticsearch系列---幾個高階功能Elasticsearch
- cnode系列之登陸註冊功能
- Dubbo 入門系列之快速部署一個微服務應用微服務