Dubbo這些很好用的功能你一定不知道!

      網友投稿 1000 2022-05-29

      前言

      Dubbo功能非常完善,很多時候我們不需要重復造輪子,下面列舉一些你不一定知道,但是很好用的功能;

      總結了一份dubbo資料文檔分享給大家。

      直連Provider

      在開發及測試環境下,可能需要繞過注冊中心,只測試指定服務提供者,這時候可能需要點對點直連,點對點直連模式,將以服務接口為單位,忽略注冊中心的提供者列表,A 接口配置點對點,不影響 B 接口從注冊中心獲取列表(說明:官方只建議開發&測試環境使用該功能),用法如下,url指定的地址就是直連地址:

      多版本

      當一個接口實現,出現不兼容升級時,可以用版本號過渡,版本號不同的服務相互間不引用,用法如下:

      利用dubbo該特性,我們能夠實現一些功能的灰度發布,實現步驟如下:

      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)

      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異常才執行),取代遠程返回結果:

      DemoServiceMock實現源碼:

      public class DemoServiceMock implements DemoService { public String sayHello(String name) { return "mock-value"; } }

      泛化調用

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

      調用源碼:

      /** * @author afei * @version 1.0.0 * @since 2017年11月22日 */ public class Main { public static void main(String[] args) { // 引?遠程服務, 該實例??封裝了所有與注冊中?及服務提供?連接,請緩存 ReferenceConfig reference = new ReferenceConfig(); // 弱類型接?名 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 teacher = new HashMap(); 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); } }

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      25

      26

      Dubbo這些很好用的功能你一定不知道!

      27

      28

      29

      30

      31

      32

      33

      34

      訪問日志

      如果想記錄每次請求信息,可開啟訪問日志,類似于Ngnix的訪問日志。注意:此日志量比較大,請注意磁盤容量。使用方式(如果配置局部,全局訪問日志就會失效):

      配置全局:

      配置局部:

      `

      `

      日志格式樣式:

      [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資料文檔Java的系統化資料:(包括Java核心知識點、Spring系列全家桶、面試專題和21年最新的互聯網真題、電子書等)有需要的朋友可以關注公眾號【程序媛小琬】即可獲取。

      Dubbo Spring

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:TL1808-EVM開發板介紹
      下一篇:技術團隊如何培養新人
      相關文章
      亚洲国产一区二区三区青草影视| 久久亚洲色WWW成人欧美| 亚洲精品无码专区2| 亚洲av日韩综合一区二区三区| 亚洲一区二区三区国产精华液| 亚洲fuli在线观看| 日本亚洲精品色婷婷在线影院| 亚洲一区二区三区四区视频 | 亚洲人成色4444在线观看| 亚洲国产精品免费在线观看| 亚洲视频一区二区在线观看| 夜夜亚洲天天久久| 亚洲白嫩在线观看| 亚洲成人动漫在线观看| 亚洲一级毛片免费看| 亚洲六月丁香婷婷综合| ASS亚洲熟妇毛茸茸PICS| 亚洲AV男人的天堂在线观看| 亚洲一区二区三区在线| 一本色道久久88—综合亚洲精品| 亚洲三级高清免费| 亚洲老熟女五十路老熟女bbw | 亚洲精品无码久久久久秋霞 | 国产av无码专区亚洲av桃花庵| 亚洲人成无码网站| 亚洲第一成年男人的天堂| 亚洲美女视频一区二区三区| 亚洲色偷偷偷网站色偷一区| 亚洲视频精品在线观看| 亚洲午夜精品一区二区公牛电影院| 亚洲乱码中文论理电影| 亚洲日韩国产二区无码| 亚洲Av无码国产一区二区| 一本久到久久亚洲综合| 久久久久久亚洲精品无码| 亚洲伊人久久综合影院| 国产成A人亚洲精V品无码性色| 亚洲电影中文字幕| 亚洲欧洲日产国码二区首页| 亚洲一区二区三区成人网站| 在线观看亚洲免费|