dubbo一些你不一定知道但是很好用的功能

dubbo功能非常完善,很多時候我們不需要重復(fù)造輪子跋理,下面列舉一些你不一定知道择克,但是很好用的功能;

直連Provider

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

<dubbo:reference id="demoService" interface="com.alibaba.dubbo.demo.DemoService" version="1.0.0" url="dubbo://172.18.1.205:20888/" />

多版本

當一個接口實現(xiàn)浦夷,出現(xiàn)不兼容升級時辖试,可以用版本號過渡,版本號不同的服務(wù)相互間不引用军拟,用法如下:

<dubbo:service interface="com.alibaba.dubbo.demo.DemoService" ref="demoService" version="1.0.0" />

利用dubbo該特性剃执,我們能夠?qū)崿F(xiàn)一些功能的灰度發(fā)布,實現(xiàn)步驟如下:

  1. 接口舊的實現(xiàn)定義version="1.0.0"懈息,接口新的實現(xiàn)version="2.0.0"
  2. Consumer端定義version="*"

這樣定義Provider和Consumer后肾档,新舊接口實現(xiàn)各承擔50%的流量;

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

  1. 在低壓力時間段怒见,先升級一半Provider為新版本;
  2. 再將所有消費者升級為新版本姑宽;
  3. 然后將剩下的一半提供者升級為新版本遣耍。

回聲測試

回聲測試用于檢測服務(wù)是否可用,回聲測試按照正常請求流程執(zhí)行炮车,能夠測試整個調(diào)用是否通暢舵变,可用于監(jiān)控。
所有服務(wù)自動實現(xiàn)EchoService接口瘦穆,只需將任意服務(wù)引用強制轉(zhuǎn)型為EchoService 即可使用纪隙,使用方式(demoService是spring管理的bean)

EchoService echoService = (EchoService) demoService;
System.out.println(echoService.$echo("hello"));

隱式參數(shù)

可以通過 RpcContextsetAttachment()getAttachment() 在Consumer和Provider之間進行參數(shù)的隱式傳遞,例如Controller層攔截登錄token扛或,把根據(jù)token得到的memberId傳給dubbo服務(wù)就能使用隱式參數(shù)傳遞的方式绵咱,setAttachment()設(shè)置的 KV 對,在完成一次遠程調(diào)用會被清空熙兔,即多次遠程調(diào)用要多次設(shè)置悲伶。使用方式:

  1. 服務(wù)端set:
RpcContext.getContext().setAttachment("CRT_MEMBER_ID", "13828886888");
  1. 客戶端get:
RpcContext.getContext().getAttachment("CRT_MEMBER_ID")

上下文

上下文中存放的是當前調(diào)用過程中所需的環(huán)境信息。所有配置信息都將轉(zhuǎn)換為 URL 的參數(shù)
RpcContext 是一個 ThreadLocal 的臨時狀態(tài)記錄器住涉,當接收到 RPC 請求麸锉,或發(fā)起 RPC 請求時,RpcContext 的狀態(tài)
都會變化舆声。例如:A 調(diào) B花沉,B 再調(diào) C,則 B 機器上,在 B 調(diào) C 之前主穗,RpcContext 記錄的是 A 調(diào) B 的信息泻拦,在 B 調(diào) C
之后,RpcContext 記錄的是 B 調(diào) C 的信息忽媒。使用方式:

boolean isConsumerSide = RpcContext.getContext().isConsumerSide();

本地偽裝

本地偽裝通常用于服務(wù)降級争拐,例如某驗權(quán)服務(wù),當服務(wù)提供方全部掛掉后晦雨,客戶端不拋出異常架曹,而是通過 Mock 數(shù)據(jù)
返回授權(quán)失敗。使用方式如下闹瞧,mock指定的實現(xiàn)類在Provider拋出RpcException異常時執(zhí)行(一定要拋出RpcException異常才執(zhí)行)绑雄,取代遠程返回結(jié)果:

<dubbo:reference id="demoService" interface="com.alibaba.dubbo.demo.DemoService" version="1.0.0" mock="com.alibaba.dubbo.demo.consumer.mock.DemoServiceMock"/>

DemoServiceMock實現(xiàn)源碼:

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

泛化調(diào)用

泛化接口調(diào)用方式主要用于客戶端沒有 API 接口及模型類元的情況,參數(shù)及返回值中的所有 POJO 均用Map表示奥邮,通常用于框架集成万牺,例如:實現(xiàn)一個通用的服務(wù)測試框架,可通過GenericService調(diào)用所有服務(wù)實現(xiàn)洽腺。使用方式:

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

調(diào)用源碼:

/**
 * @author afei
 * @version 1.0.0
 * @since 2017年11月22日
 */
public class Main {

    public static void main(String[] args) {
        // 引?遠程服務(wù), 該實例??封裝了所有與注冊中?及服務(wù)提供?連接脚粟,請緩存
        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等不需要轉(zhuǎn)換,直接調(diào)?
        Object result = genericService.$invoke("sayYes", new String[] {"java.lang.String"}, new Object[] {"afei"});
        System.out.println("result --> "+result);

        // ?Map表示POJO參數(shù)蘸朋,如果返回值為POJO也將自動轉(zhuǎn)成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將自動轉(zhuǎn)成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"]

延遲暴露

如果服務(wù)需要預(yù)熱時間吐根,比如初始化本地緩存,等待相關(guān)資源就位等霹购,可以使用delay進行延遲暴露佑惠。使Dubbo在Spring容器初始化完后延遲多少毫秒再暴露服務(wù)朋腋。使用方式:

<dubbo:provider delay="5000"/>

或者:

<dubbo:service delay="5000" interface="com.alibaba.dubbo.demo.DemoService" ref="demoService" version="1.0.0"/>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末齐疙,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子旭咽,更是在濱河造成了極大的恐慌贞奋,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件穷绵,死亡現(xiàn)場離奇詭異轿塔,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進店門勾缭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來揍障,“玉大人,你說我怎么就攤上這事俩由《镜眨” “怎么了?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵幻梯,是天一觀的道長兜畸。 經(jīng)常有香客問我,道長碘梢,這世上最難降的妖魔是什么咬摇? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮煞躬,結(jié)果婚禮上肛鹏,老公的妹妹穿的比我還像新娘。我一直安慰自己恩沛,他們只是感情好龄坪,可當我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著复唤,像睡著了一般健田。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上佛纫,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天妓局,我揣著相機與錄音,去河邊找鬼呈宇。 笑死好爬,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的甥啄。 我是一名探鬼主播存炮,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蜈漓!你這毒婦竟也來了穆桂?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤融虽,失蹤者是張志新(化名)和其女友劉穎享完,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體有额,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡般又,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年彼绷,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片茴迁。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡寄悯,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出堕义,到底是詐尸還是另有隱情热某,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布胳螟,位于F島的核電站昔馋,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏糖耸。R本人自食惡果不足惜秘遏,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望嘉竟。 院中可真熱鬧邦危,春花似錦、人聲如沸舍扰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽边苹。三九已至陵且,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間个束,已是汗流浹背慕购。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留茬底,地道東北人沪悲。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓阱表,卻偏偏與公主長得像殿如,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子最爬,可洞房花燭夜當晚...
    茶點故事閱讀 43,543評論 2 349

推薦閱讀更多精彩內(nèi)容