<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Dubbo官網(wǎng)實(shí)戰(zhàn)使用技巧

          共 5421字,需瀏覽 11分鐘

           ·

          2021-02-06 08:57

          點(diǎn)擊上方藍(lán)色字體,選擇“標(biāo)星公眾號”

          優(yōu)質(zhì)文章,第一時間送達(dá)

          76套java從入門到精通實(shí)戰(zhàn)課程分享

          1、啟動時檢查:

          我們檢查依賴的服務(wù)是否啟動,可利用下面三個屬性,優(yōu)先級從左到右逐漸降低。
          如果服務(wù)不是強(qiáng)依賴,或者說服務(wù)之間可能存在死循環(huán)依賴,我們應(yīng)該將 check 置為 false。

          檢查判斷優(yōu)先級:
          dubbo.reference.check?>?dubbo.consumer.check?>?dubbo.registry.check

          2、只訂閱:

          一般在開發(fā)環(huán)境時,我們新開發(fā)的接口都還不能發(fā)布出去,所以我們本地的服務(wù)不能往注冊中心注冊;
          而且,如果我們將本地服務(wù)注冊上去,會影響別的服務(wù)的聯(lián)調(diào),所以我們會利用下面屬性,將服務(wù)設(shè)置為只訂閱,不往注冊中心注冊。

          dubbo.registry.register=false
          dubbo.registry.subscribe=true

          3、集群容錯:

          集群容錯模式可利用?dubbo.reference.clusterdubbo.consumer.cluster?和?dubbo.service.clusterdubbo.provider.cluster?等屬性配置。

          集群容錯中主要有幾個角色:

          Invoker:Provider 的一個可調(diào)用 Service 的抽象,Invoker 封裝了 Provider 地址以及 Service 接口信息。

          Directory:代表多個 Invoker ,可以把它看成是 List,但是與 List 不同的是,它的值可能是動態(tài)變化的,比如注冊中心推送變更。

          Cluster:將 Directory 中的多個 Invoker 偽裝成一個 Invoker,對上層透明,偽裝過程包含了容錯邏輯,調(diào)用失敗后,重試另一個。

          Router:負(fù)責(zé)從多個 Invoker 中按路由規(guī)則選出子集,比如讀寫分離,應(yīng)用隔離等。

          LoadBalance:負(fù)責(zé)從多個 Invoker 中選出具體的一個用于本次調(diào)用,選的過程包含了負(fù)載均衡算法,調(diào)用失敗后,需要重選

          dubbo 提供的集群容錯模式:

          Failover Cluster:失敗自動切換,當(dāng)出現(xiàn)失敗,重試其它服務(wù)器。通常用于讀操作,但重試會帶來更長延遲。可通過 retries=“2” 來設(shè)置重試次數(shù)(不含第一次)。

          Failfast Cluster:快速失敗,即只發(fā)起一次調(diào)用,失敗立即報(bào)錯。通常用于非冪等性的寫操作。

          Failsafe Cluster:失敗安全,出現(xiàn)異常時直接忽略掉。通常用于寫入審計(jì)日志等不重要的操作。

          Failback Cluster:失敗自動恢復(fù),后臺記錄失敗請求,定時重發(fā)。通常用于消息通知操作。

          Forking Cluster:并行調(diào)用多個服務(wù)器,只要一個成功就返回。通常用于實(shí)時性要求較高的讀操作,但需要浪費(fèi)更多服務(wù)資源。可通過 forks=“2” 來設(shè)置最大并行數(shù)。

          Broadcast Cluster:廣播調(diào)用所有提供者,逐個調(diào)用,任意一臺報(bào)錯則報(bào)錯。通常用于通知所有提供者更新緩存或日志等本地資源信息。

          4、負(fù)載均衡:

          在集群負(fù)載均衡時,Dubbo 提供了多種均衡策略,缺省為 random 隨機(jī)調(diào)用。

          Random LoadBalance:

          • 隨機(jī),按權(quán)重設(shè)置隨機(jī)概率。

          • 在一個截面上碰撞的概率高,但調(diào)用量越大分布越均勻,而且按概率使用權(quán)重后也比較均勻,有利于動態(tài)調(diào)整提供者權(quán)重。

          RoundRobin LoadBalance:

          • 輪詢,按公約后的權(quán)重設(shè)置輪詢比率。

          • 存在慢的提供者累積請求的問題,比如:第二臺機(jī)器很慢,但沒掛,當(dāng)請求調(diào)到第二臺時就卡在那,久而久之,所有請求都卡在調(diào)到第二臺上。

          LeastActive LoadBalance:

          • 最少活躍調(diào)用數(shù),相同活躍數(shù)的隨機(jī),活躍數(shù)指調(diào)用前后計(jì)數(shù)差。

          • 使慢的提供者收到更少請求,因?yàn)樵铰奶峁┱叩恼{(diào)用前后計(jì)數(shù)差會越大。

          ConsistentHash LoadBalance:

          • 一致性 Hash,相同參數(shù)的請求總是發(fā)到同一提供者。

          • 當(dāng)某一臺提供者掛時,原本發(fā)往該提供者的請求,基于虛擬節(jié)點(diǎn),平攤到其它提供者,不會引起劇烈變動。

          • 算法參見:http://en.wikipedia.org/wiki/Consistent_hashing

          • 缺省只對第一個參數(shù) Hash,如果要修改,請配置
            缺省用 160 份虛擬節(jié)點(diǎn),如果要修改,請配置

          可在服務(wù)端服務(wù)級別、客戶端服務(wù)級別、服務(wù)端方法級別和客戶端方法級別設(shè)置。

          服務(wù)端服務(wù)級別&客戶端服務(wù)級別配置:

          dubbo.provider.loadbalance=leastactive
          dubbo.consumer.loadbalance=leastactive

          服務(wù)端方法級別和客戶端方法級別配置:

          @DubboService(interfaceClass?=?DubboServiceOne.class,loadbalance?=?"random",
          ????????????????methods?=?{
          ????????????????????@Method(name="sayHello",loadbalance?=?"leastActive")
          ????????????????})
          public?class?DubboServiceOneImpl?implements?DubboServiceOne?{}

          @DubboReference(loadbalance?=?"random",
          ????????????????????methods?=?{
          ????????????????????????@Method(name="sayHello",loadbalance?=?"leastactive")
          ????????????????????})
          private?DubboServiceOne?DubboServiceOne;

          5、直連提供者

          在開發(fā)及測試環(huán)境下,經(jīng)常需要繞過注冊中心,只測試指定服務(wù)提供者,這時候可能需要點(diǎn)對點(diǎn)直連,點(diǎn)對點(diǎn)直連方式,將以服務(wù)接口為單位,忽略注冊中心的提供者列表,A 接口配置點(diǎn)對點(diǎn),不影響 B 接口從注冊中心獲取列表。

          在 JVM 啟動參數(shù)中加入 -D 參數(shù)映射服務(wù)地址:

          java?-D?com.alibaba.xxx.XxxService=dubbo://localhost:20890

          標(biāo)簽或者@DubboResource注解中增加 url 屬性。

          "dubbo://localhost:20890"?interfaceClass=""/>

          @DubboReference(url="dubbo://localhost:20890")
          private?DubboServiceOne?DubboServiceOne;

          6、本地調(diào)用

          本地調(diào)用使用了 injvm 協(xié)議,是一個偽協(xié)議,它不開啟端口,不發(fā)起遠(yuǎn)程調(diào)用,只在 JVM 內(nèi)直接關(guān)聯(lián),但執(zhí)行 Dubbo 的 Filter 鏈。

          protocol、provider、consumer、service、reference 都可以設(shè)置。

          7、本地存根

          遠(yuǎn)程服務(wù)后,客戶端通常只剩下接口,而實(shí)現(xiàn)全在服務(wù)器端,但提供方有些時候想在客戶端也執(zhí)行部分邏輯,比如:做 ThreadLocal 緩存,提前驗(yàn)證參數(shù),調(diào)用失敗后偽造容錯數(shù)據(jù)等等,此時就需要在 API 中帶上 Stub,客戶端生成 Proxy 實(shí)例,會把 Proxy 通過構(gòu)造函數(shù)傳給 Stub ,然后把 Stub 暴露給用戶,Stub 可以決定要不要去調(diào) Proxy。

          Sub 利用?dubbo.service.sub?屬性設(shè)置。

          例子:

          假設(shè)服務(wù)提供者提供了一個接口,DubboServiceOne,然后服務(wù)消費(fèi)者要做本地存根,只需要在自己的項(xiàng)目中,增加一個 DubboServiceOne 接口的實(shí)現(xiàn)類,然后在?@DubboReference?注解或者??標(biāo)簽增加 stub 屬性即可。

          實(shí)現(xiàn)類:

          /**
          ?*?DubboServiceOne?本地存根
          ?*?@author?winfun
          ?*?@date?2021/2/1?9:59?上午
          ?**/
          @Slf4j
          public?class?DubboServiceOneStub?implements?DubboServiceOne?{

          ????private?final?DubboServiceOne?dubboServiceOne;

          ????public?DubboServiceOneStub(DubboServiceOne?dubboServiceOne){
          ????????this.dubboServiceOne?=?dubboServiceOne;
          ????}

          ????/***
          ?????*??say?hello
          ?????*?@author?winfun
          ?????*?@param?name?name
          ?????*?@return?{@link?ApiResult??}
          ?????**/
          ????@Override
          ????public?ApiResult?sayHello(String?name)?{
          ????????try?{
          ????????????ApiResult?result?=?this.dubboServiceOne.sayHello(name);
          ????????????if?(ApiContants.SUCCESS.equals(result.getCode())){
          ????????????????return?ApiResult.fail(ApiContants.FAIL,"業(yè)務(wù)異常",result.getData());
          ????????????}
          ????????}catch?(Exception?e){
          ????????????log.error("call?DubboServiceOne?throw?exception!message?is?{}",e.getMessage());
          ????????????return?ApiResult.fail("調(diào)用失敗");
          ????????}
          ????????return?null;
          ????}
          }


          使用:

          /**
          ?*?測試本地存根
          ?*?@author?winfun
          ?*?@date?2021/2/1?10:26?上午
          ?**/
          @RestController
          public?class?TestStubController?{

          ????@DubboReference(lazy?=?true,check?=?false,stub?=?"com.winfun.demo.stub.DubboServiceOneStub")
          ????private?DubboServiceOne?dubboServiceOne;

          ????@GetMapping("/stub/{name}")
          ????public?ApiResult?testStub(@PathVariable("name")?String?name){
          ????????return?this.dubboServiceOne.sayHello(name);
          ????}
          }

          8、本地偽裝

          本地偽裝通常用于服務(wù)降級,比如某驗(yàn)權(quán)服務(wù),當(dāng)服務(wù)提供方全部掛掉后,客戶端不拋出異常,而是通過 mock 數(shù)據(jù)返回授權(quán)失敗。

          mock 是 sub 的一個子集,mock是發(fā)生了錯誤,也就是拋出 RpcException 異常時會觸發(fā);而使用 sub,那么就需要在程序捕獲異常,然后進(jìn)行處理。

          mock 機(jī)制可利用標(biāo)簽或者@DubboReference的mock屬性設(shè)置。

          詳細(xì)可看我自己寫的文章:https://blog.csdn.net/Howinfun/article/details/113439208

          9、服務(wù)延遲暴露

          Dubbo 2.6.5 之后,所有服務(wù)都將在 Spring 初始化完成后進(jìn)行暴露,如果你不需要延遲暴露服務(wù),無需配置 delay。

          可使用?dubbo.service.delay?屬性來設(shè)置延遲多少秒暴露服務(wù)。delay 的時間單位為毫秒。

          10、并發(fā)控制

          并發(fā)控制都是在服務(wù)提供者端設(shè)置的。

          首先,可通過?dubbo.service.executes?屬性限制服務(wù)端每個方法的并發(fā)量(占用線程池線程數(shù))、通過?dubbo.method.executes(服務(wù)端) 屬性直接將并發(fā)限制具體到接口的某個方法。

          還可以通過?dubbo.service.actives/dubbo.reference.actives?屬性控制接口每個方法每個客戶端的并發(fā)執(zhí)行數(shù);
          通過?
          dubbo.method.actives(兩端) 屬性直接將并發(fā)執(zhí)行控制到接口的某個方法。


          版權(quán)聲明:本文為博主原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接和本聲明。

          本文鏈接:

          https://blog.csdn.net/Howinfun/article/details/113584534





          鋒哥最新SpringCloud分布式電商秒殺課程發(fā)布

          ??????

          ??長按上方微信二維碼?2 秒






          感謝點(diǎn)贊支持下哈?

          瀏覽 90
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  开心情色站 | 日韩怡春院 | 91天堂| 性XXXX丰满孕妇XXXX另类 | 西西444WWW无码大胆 |