Dubbo消費者

建立代理對象

com.alibaba.dubbo.config.ReferenceConfig#createProxy

經過消費者get()方法能夠找到以上方法,消費者須要根據配置的接口生成代理對象。 ###協議生成Invoker ####DubboProtocoljava

public <T> Invoker<T> refer(Class<T> serviceType, URL url) throws RpcException {
        // create rpc invoker.
        DubboInvoker<T> invoker = new DubboInvoker<T>(serviceType, url, getClients(url), invokers);
        invokers.add(invoker);
        return invoker;
    }

以上經過Url獲取客戶端信息。 輸入圖片說明this

以上紅框中是rpc層與remote層的轉換。requestHandler是一個抽象類。

####Invoker生成代理對象 dubbo使用代理工廠來生成代理對象,dubbo默認使用的JavassistProxyFactory來生成代理對象。url

com.alibaba.dubbo.rpc.proxy.javassist.JavassistProxyFactory

代理工廠類結構 生成具體代理對象 上圖爲代理工廠生成的代理對象的方法,此方法生成代理比較隱晦,由於dubbo經過字符串的拼接,生成java類,最後由javasist加載字節碼,如下代碼大概給出一個生成的代理class,可能細節不太同樣,這裏只是給出重要信息而已。代理

public class com.alibaba.dubbo.common.bytecode.Proxyid extend Proxy {
    public Object newInstance(InvocationHandler h) {
        return new className.proxyid(h); }
    }
}

public class className.proxyid implements interface1, interface2 {
    public static java.lang.reflect.Method[] methods = new Method[2];
    private InvocationHandler handler;
    public className.proxyid () {

    }
    public className.proxyid (InvocationHandler arg0) {
        handler=arg0;
    }
    public Boolean method1(String arg0, Integer arg1)  throws Exception {
        Object[] args = new Object[2];
        args[0] = arg0;
        args[1] = arg1;
        Object ret = handler.invoke(this, methods[0], args);
        return ret ==null?false:((Boolean) ret).booleanValue();
    }
    public Byte method2(String arg0, Integer arg1) {
        Object[] args = new Object[2];
        args[0] = arg0;
        args[1] = arg1;
        Object ret = handler.invoke(this, methods[1], args);
        return ret ==null?(byte)0:((Byte) ret).byteValue();
    }
}

以上產生了一個代理對象,代理對象根據相應的方法會動態生成上述代碼中method1和method2等,對應接口的方法,而method1方法會調用com.alibaba.dubbo.rpc.proxy.InvokerInvocationHandler#invoke方法,InvokerInvocationHandler類中封裝了Invoker(DubboInvoker),經過Invoker把相應的方法及參數值傳遞,獲取對應的返回結果。至此消費者生成代理及調用過程完成了。code

相關文章
相關標籤/搜索