<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>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                [TOC] 概要: 一、Dubbo 調用非典型使用場景 二、調用內部實現源碼分析 ## 一、Dubbo 調用非典型使用場景 --- ### **泛化提供&引用** **泛化提供** 是指不通過接口的方式直接將服務暴露出去。通常用于Mock框架或服務降級框架實現。 #TODO 示例演示 ``` public static void doExportGenericService() { ??? ApplicationConfig applicationConfig = new ApplicationConfig(); ??? applicationConfig.setName("demo-provider"); ??? // 注冊中心 ??? RegistryConfig registryConfig = new RegistryConfig(); ??? registryConfig.setProtocol("zookeeper"); ??? registryConfig.setAddress("192.168.0.147:2181"); ??? ProtocolConfig protocol=new ProtocolConfig(); ??? protocol.setPort(-1); ??? protocol.setName("dubbo"); ??? GenericService demoService = new MyGenericService(); ??? ServiceConfig<GenericService> service = new ServiceConfig<GenericService>(); ??? // 弱類型接口名 ??? service.setInterface("com.tuling.teach.service.DemoService"); ??? // 指向一個通用服務實現 ??? service.setRef(demoService); ??? service.setApplication(applicationConfig); ??? service.setRegistry(registryConfig); ??? service.setProtocol(protocol); ??? // 暴露及注冊服務 ??? service.export(); } ``` **泛化引用** 是指不通過常規接口的方式去引用服務,通常用于測試框架。 ``` ApplicationConfig applicationConfig = new ApplicationConfig(); applicationConfig.setName("demo-provider"); // 注冊中心 RegistryConfig registryConfig = new RegistryConfig(); registryConfig.setProtocol("zookeeper"); registryConfig.setAddress("192.168.0.147:2181"); // 引用遠程服務 ReferenceConfig<GenericService> reference = new ReferenceConfig<GenericService>(); // 弱類型接口名 reference.setInterface("com.tuling.teach.service.DemoService"); // 聲明為泛化接口 reference.setGeneric(true); reference.setApplication(applicationConfig); reference.setRegistry(registryConfig); // 用com.alibaba.dubbo.rpc.service.GenericService可以替代所有接口引用 GenericService genericService = reference.get(); Object result = genericService.$invoke("sayHello", new String[]{"java.lang.String"}, new Object[]{"world"}); ``` ### **隱示傳參** 是指通過非常方法參數傳遞參數,類似于http 調用當中添加cookie值。通常用于分布式追蹤框架的實現。使用方式如下 : ``` //客戶端隱示設置值 RpcContext.getContext().setAttachment("index", "1"); // 隱式傳參,后面的遠程調用都會隱 //服務端隱示獲取值 String index = RpcContext.getContext().getAttachment("index");? ``` ### **令牌驗證** 通過令牌驗證在注冊中心控制權限,以決定要不要下發令牌給消費者,可以防止消費者繞過注冊中心訪問提供者,另外通過注冊中心可靈活改變授權方式,而不需修改或升級提供者 ![](https://img.kancloud.cn/93/18/9318b99fb74891459b49f2ffc1d17590_400x340.png) 使用: ``` <!--隨機token令牌,使用UUID生成--><dubbo:provider interface="com.foo.BarService" token="true" /> ``` ### **過濾器** 類似于 WEB 中的Filter ,Dubbo本身提供了Filter 功能用于攔截遠程方法的調用。其支持自定義過濾器與官方的過濾器使用**:** #TODO 演示添加日志訪問過濾: ``` <dubbo:provider? filter="accesslog" accesslog="logs/dubbo.log"/> ``` 以上配置 就是 為 服務提供者 添加 日志記錄過濾器, 所有訪問日志將會集中打印至 accesslog 當中 **自定義過濾器:** 1、編寫過濾器 ``` package com.tuling.dubbo; import org.apache.dubbo.common.constants.CommonConstants; import org.apache.dubbo.common.extension.Activate; import org.apache.dubbo.rpc.*; @Activate(group = {CommonConstants.PROVIDER}) public class ProviderHelloFilter implements Filter { ? ? @Override ? ? public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException { ? ? ? ? System.out.println("hello ok====================================>>>>>"); ? ? ? ? return invoker.invoke(invocation); ? ? } } ``` 添加擴展點: 創建文件路徑如下: ``` # 文件路徑 META-INF/dubbo/org.apache.dubbo.rpc.Filter #內容: helloFilter=com.tuling.dubbo.ProviderHelloFilter ``` ## 二 、調用內部實現源碼分析 --- **知識點** 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進行遠程調用。 ### 2.Dubbo調用流程: 基礎流程: ![](https://img.kancloud.cn/f0/0a/f00a65674f1ac7df915723cb410fdab4_838x413.png) 1. 客戶端調用 2. 透明代理 3. 負載均衡 4. 容錯 5. 異步轉同步 6. 獲取結果 7. 服務端響應 1. 分析類結構關系 * prxoy$: 代理類 * Invoker: 執行器 * Invocation: 執行參數與環境 * Result:返回結果 * Protocol:協議 ## ![](https://img.kancloud.cn/f7/48/f7483e2be7a275650e5397477ab73a33_1079x845.png)
                  <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>

                              哎呀哎呀视频在线观看