《Dubbo系列一些好用的功能》不看後悔系列

原文:mp.weixin.qq.com/s/peBTzuAX5…java

dubbo功能很是完善,不少時候咱們不須要重複造輪子,下面列舉一些你不必定知道,可是很好用的功能;spring

直連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該特性,咱們可以實現一些功能的灰度發佈,實現步驟以下:bash

  1. 接口舊的實現定義version="1.0.0",接口新的實現version="2.0.0"
  2. Consumer端定義version="*"

這樣定義Provider和Consumer後,新舊接口實現各承擔50%的流量;架構

利用dubbo該特性,還能完成不兼容版本遷移:併發

  1. 在低壓力時間段,先升級一半Provider爲新版本;
  2. 再將全部消費者升級爲新版本;
  3. 而後將剩下的一半提供者升級爲新版本。

回聲測試

回聲測試用於檢測服務是否可用,回聲測試按照正常請求流程執行,可以測試整個調用是否通暢,可用於監控。
全部服務自動實現EchoService接口,只需將任意服務引用強制轉型爲EchoService 便可使用,使用方式(demoService是spring管理的bean)app

複製代碼
  1. EchoService echoService = (EchoService) demoService;框架

  2. System.out.println(echoService.$echo("hello"));分佈式

隱式參數

能夠經過 RpcContextsetAttachment()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實現源碼:

複製代碼
  1. public class DemoServiceMock implements DemoService {

  2. public String sayHello(String name) {

  3. return "mock-value";

  4. }

  5. }

泛化調用

泛化接口調用方式主要用於客戶端沒有 API 接口及模型類元的狀況,參數及返回值中的全部 POJO 均用Map表示,一般用於框架集成,例如:實現一個通用的服務測試框架,可經過GenericService調用全部服務實現。使用方式:

<dubbo:reference id="demoService" interface="com.alibaba.dubbo.demo.DemoService" generic="true"/>複製代碼

調用源碼:

複製代碼
  1. /**

  2. * @author afei

  3. * @version 1.0.0

  4. * @since 2017年11月22日

  5. */

  6. public class Main {

  7. public static void main(String[] args) {

  8. // 引⽤遠程服務, 該實例⾥⾯封裝了全部與註冊中⼼及服務提供⽅鏈接,請緩存

  9. ReferenceConfig<GenericService> reference = new ReferenceConfig<GenericService>();

  10. // 弱類型接⼝名

  11. reference.setInterface("com.alibaba.dubbo.demo.DemoService");

  12. reference.setVersion("1.0.0");

  13. // 聲明爲泛化接⼝

  14. reference.setGeneric(true);

  15. // ⽤com.alibaba.dubbo.rpc.service.GenericService能夠替代全部接口引用⽤

  16. GenericService genericService = reference.get();

  17. // 基本類型以及Date,List,Map等不須要轉換,直接調⽤

  18. Object result = genericService.$invoke("sayYes", new String[] {"java.lang.String"}, new Object[] {"afei"});

  19. System.out.println("result --> "+result);

  20. // ⽤Map表示POJO參數,若是返回值爲POJO也將自動轉成Map

  21. Map<String, Object> teacher = new HashMap<String, Object>();

  22. teacher.put("id", "1");

  23. teacher.put("name", "admin");

  24. teacher.put("age", "18");

  25. teacher.put("level", "3");

  26. teacher.put("remark", "測試");

  27. // 若是返回POJO將自動轉成Map

  28. result = genericService.$invoke("justTest", new String[]

  29. {"com.alibaba.dubbo.demo.bean.HighTeacher"}, new Object[]{teacher});

  30. System.out.println("result --> "+result);

  31. }

  32. }

訪問日誌

若是想記錄每次請求信息,可開啓訪問日誌,相似於Ngnix的訪問日誌。注意:此日誌量比較大,請注意磁盤容量。使用方式(若是配置局部,全局訪問日誌就會失效):
配置全局:

<dubbo:provider accesslog="/app/dubbo-demo.log"/>複製代碼

配置局部:

複製代碼
  1. <dubbo:service interface="com.alibaba.dubbo.demo.DemoService" ref="demoService" accesslog="/app/demo.log"/>

  2. <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"/>複製代碼
相關文章
相關標籤/搜索