<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                [TOC] 概要: 一、Dubbo 調用模塊基本組成 二、調用內部實現源碼分析 ## 一、Dubbo 調用模塊基本組成 --- ### **Dubbo調用模塊概述:** dubbo調用模塊核心功能是發起一個遠程方法的調用并順利拿到返回結果,其體系組成如下: 1. **透明代理:**通過動態代理技術,屏蔽遠程調用細節以提高編程友好性。 2. **負載均衡:**當有多個提供者是,如何選擇哪個進行調用的負載算法。 3. **容錯機制:**當服務調用失敗時采取的策略 4. **調用方式:**支持同步調用、異步調用 ![](https://img.kancloud.cn/e9/ba/e9ba4ecd4f9cebfa04bcf9b43190a8ce_866x586.png) ### 透明代理: 參見源碼: com.alibaba.dubbo.config.ReferenceConfig#createProxy com.alibaba.dubbo.common.bytecode.ClassGenerator com.alibaba.dubbo.rpc.proxy.javassist.JavassistProxyFactory ### **負載均衡** Dubbo 目前官方支持以下負載均衡策略: 1. **隨機**(random):按權重設置隨機概率。此為默認算法. 2. **輪循?**(roundrobin):按公約后的權重設置輪循比率。 3. **最少活躍調用數**(leastactive):相同活躍數的隨機,活躍數指調用前后計數差。 4. **一致性Hash**(consistenthash ):相同的參數總是發到同一臺機器 設置方式支持如下四種方式設置,優先級由低至高 ``` <!-- 服務端級別--> <dubbo:service interface="..." loadbalance="roundrobin" /> <!-- 客戶端級別--> <dubbo:reference interface="..." loadbalance="roundrobin" /> <!-- 服務端方法級別--> <dubbo:service interface="..."> ??? <dubbo:method name="..." loadbalance="roundrobin"/> </dubbo:service> <!-- 客戶端方法級別--> <dubbo:reference interface="..."> ??? <dubbo:method name="..." loadbalance="roundrobin"/> </dubbo:reference> ``` #TODO 一至性hash 演示 - [ ] 配置loadbalance - [ ] 配置需要hash 的參數與虛擬節點數 - [ ] 發起遠程調用 一至性hash 算法詳解: ![](https://img.kancloud.cn/13/bc/13bc29e17da55e57f6410b758afce8fc_805x795.png) ### **容錯** Dubbo 官方目前支持以下容錯策略: 1. **失敗自動切換:**調用失敗后基于retries=“2”?屬性重試其它服務器 2. **快速失敗:**快速失敗,只發起一次調用,失敗立即報錯。 3. **勿略失敗:**失敗后勿略,不拋出異常給客戶端。 4. **失敗重試:**失敗自動恢復,后臺記錄失敗請求,定時重發。通常用于消息通知操作 5. **并行調用:?**只要一個成功即返回,并行調用指定數量機器,可通過 forks="2"?來設置最大并行數。 6. **廣播調用:**廣播調用所有提供者,逐個調用,任意一臺報錯則報錯? 設置方式支持如下兩種方式設置,優先級由低至高 ``` <!--? Failover 失敗自動切換 retries="1" 切換次數 Failfast 快速失敗 Failsafe 勿略失敗 Failback 失敗重試,5秒后僅重試一次 Forking 并行調用? forks="2" 最大并行數 Broadcast 廣播調用 --> <dubbo:service interface="..." cluster="broadcast" /> <dubbo:reference interface="..." cluster="broadcast"/ > ``` 注:容錯機制 在基于 API設置時無效 如 ? referenceConfig.setCluster("failback"); 經測試不啟作用 ### **異步調用** 異步調用是指發起遠程調用之后獲取結果的方式。 1. 同步等待結果返回(默認) 2. 異步等待結果返回 3. 不需要返回結果 Dubbo 中關于異步等待結果返回的實現流程如下圖: ![](https://img.kancloud.cn/6e/88/6e8852fd5f9c8c7b189ad7ed22cafe92_759x224.png) 異步調用配置: ``` <dubbo:reference id="asyncDemoService" ???????????????? interface="com.tuling.teach.service.async.AsyncDemoService"> ???????????????? <!-- 異步調async:true 異步調用 false 同步調用--> ??? <dubbo:method name="sayHello1" async="false"/> ??? <dubbo:method name="sayHello2" async="false"/> ?????<dubbo:method name="notReturn" return="false"/> </dubbo:reference> ``` 注:在進行異步調用時 容錯機制不能為 cluster="forking" 或 cluster="broadcast" **異步獲取結果演示:** - [ ] 編寫異步調用代碼 - [ ] 編寫同步調用代碼 - [ ] 分別演示同步調用與異步調用耗時 *異步調用結果獲取Demo* ``` demoService.sayHello1("han"); Future<Object> future1 = RpcContext.getContext().getFuture(); demoService.sayHello2("han2"); Future<Object> future2 = RpcContext.getContext().getFuture(); Object r1 = null, r2 = null; // wait 直到拿到結果 獲超時 r1 = future1.get(); // wait 直到拿到結果 獲超時 r2 = future2.get(); ``` ### **過濾器** **?類似于 WEB 中的Filter ,Dubbo本身提供了Filter 功能用于攔截遠程方法的調用。其支持自定義過濾器與官方的過濾器使用:** #TODO 演示添加日志訪問過濾: ``` <dubbo:provider? filter="accesslog" accesslog="logs/dubbo.log"/> ``` 以上配置 就是 為 服務提供者 添加 日志記錄過濾器, 所有訪問日志將會集中打印至 accesslog 當中 ## 二 、調用內部實現源碼分析 --- **知識點** 1. 分析代理類 2. 分析類結構 3. 初始化過程 1. 分析代理類 在調用服務端時,是接口的形式進行調用,該接口是Duboo 動態代理之后的實現,通過反編譯工具可以查看到其具體實現: 因為類是代理生成,所以采用[arthas](https://github.com/alibaba/arthas)工具來反編譯,具體操作如下: ``` #運行 arthas java -jar arthas-boot.jar #掃描類 sc *.proxy0 #反編譯代理類 jad com.alibaba.dubbo.common.bytecode.proxy0 ``` 反編譯的代碼如下: ``` /* ?* Decompiled with CFR. ?* ?* Could not load the following classes: ?*? com.tuling.client.User ?*? com.tuling.client.UserService ?*/ package org.apache.dubbo.common.bytecode; import com.alibaba.dubbo.rpc.service.EchoService; import com.tuling.client.User; import com.tuling.client.UserService; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.util.List; import org.apache.dubbo.common.bytecode.ClassGenerator; public class proxy0 implements ClassGenerator.DC, EchoService, UserService { ? ? public static Method[] methods; ? ? private InvocationHandler handler; ? ? public List findUser(String string, String string2) { ? ? ? ? Object[] arrobject = new Object[]{string, string2}; ? ? ? ? Object object = this.handler.invoke(this, methods[0], arrobject); ? ? ? ? return (List)object; ? ? } ? ? public User getUser(Integer n) { ? ? ? ? Object[] arrobject = new Object[]{n}; ? ? ? ? Object object = this.handler.invoke(this, methods[1], arrobject); ? ? ? ? return (User)object; ? ? } ? ? @Override ? ? public Object $echo(Object object) { ? ? ? ? Object[] arrobject = new Object[]{object}; ? ? ? ? Object object2 = this.handler.invoke(this, methods[2], arrobject); ? ? ? ? return object2; ? ? } ? ? public proxy0() { ? ? } ? ? public proxy0(InvocationHandler invocationHandler) { ? ? ? ? this.handler = invocationHandler; ? ? } } ``` 可看出其代理實現了 UserService 接口。并且基于InvocationHandler 進行代理。實際類是 InvokerInvocationHandler 并且其中之屬性為Invoker.。也就是說最終會調用Invoker進行遠程調用。 1. 分析類結構關系 * prxoy$: 代理類 * Invoker: 執行器 * Invocation: 執行參數與環境 * Result:返回結果 * Protocol:協議
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看