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();
本地偽裝
本地偽裝通常用于服務降級,例如某驗權服務,當服務提供方全部掛掉后,客戶端不拋出例外,而是通過 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"/>
呼叫原始碼:
/**
* @author afei
* @version 1.0.0
* @since 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"/>
轉載自:https://mp.weixin.qq.com/s/peBTzuAX5d1UtXc0sYkTtg
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/229137.html
標籤:其他
