dubbo 載入Bean和遠端呼叫分析(1)

2021-06-28 21:31:26 字數 3100 閱讀 5043

這裡只講解dubbo註冊的bean

1. dubbo consumer 載入bean  

dubbonamespacehandler 是dubbo命名空間自定義配置檔案的解析處理器

public class dubbonamespacehandler extends namespacehandlersupport 

public void init()

}

spring會根據xml的命名空間呼叫響應的parser進行處理,進入 dubbobeandefinitionparser的解析parse

private static beandefinition parse(element element, parsercontext parsercontext, class<?> beanclass, boolean required) 

parsercontext.getregistry().registerbeandefinition(id, beandefinition);//這裡呼叫了bean的註冊

beandefinition.getpropertyvalues().addpropertyvalue("id", id);

}省略....

}

這一步注意,雖然註冊的bean id(如 demoservice) 是與privider端的service的id相同的,但是這裡beandefinition的beanclass卻不是自己定義的某個介面了。

在spring解析配置beans時先生成bean的定義,然後getbean時,是通過classname獲取class,然後設定bd.setbeanclass(class)

org.springframework.beans.factory.support.abstractbeanfactory

private class<?> doresolvebeanclass(rootbeandefinition mbd, class<?>... typestomatch) throws classnotfoundexception 

}string classname = mbd.getbeanclassname();

return (classname != null ? classutils.forname(classname, tempclassloader) : null);

}} return mbd.resolvebeanclass(getbeanclassloader());

}

在執行

registerbeandefinitionparser("reference", new dubbobeandefinitionparser(referencebean.class, false));

時已經將 dubbobeandefinitionparser.beanclass  = referencebean.class

故在解析時實際是如下形式

rootbeandefinition beandefinition = new rootbeandefinition();

beandefinition.setbeanclass(beanclass);

beandefinition.setlazyinit(false);

即將id=demoservice 與 類

referencebean

繫結,放入map, 即使用的是factorybean來建立bean

當spring使用getbean(『demoservice「) 會呼叫工廠bean的getobject  :  referencebean.getobject

在看看referencebean.getobject

public object getobject() throws exception
public synchronized t get() 

if (ref == null)

return ref;

}

private void init() 

initialized = true;

省略....

ref = createproxy(map);//在這裡使用了動態**生成物件

}

ref = createproxy(map);//在這裡使用了動態**生成了**物件(這裡也可以成為遠端**,因為在這個**中進行了遠端呼叫),ref 即getbean返回的物件,這樣在action呼叫demoservice是就會使用**處理器com.alibaba.dubbo.rpc.proxy.invokerinvocationhandler

public class invokerinvocationhandler implements invocationhandler 

public object invoke(object proxy, method method, object args) throws throwable

if ("tostring".equals(methodname) && parametertypes.length == 0)

if ("hashcode".equals(methodname) && parametertypes.length == 0)

if ("equals".equals(methodname) && parametertypes.length == 1)

return invoker.invoke(new rpcinvocation(method, args)).recreate();

}}

看最後一句  invoker.invoke(new rpcinvocation(method, args)).recreate(); 這裡就開始進入呼叫遠端的服務

遠端呼叫框架dubbo

alibaba有好幾個分布式框架,主要有 進行遠端呼叫 類似於rmi的這種遠端呼叫 的 dubbo hsf jms訊息服務 napoli notify kv資料庫 tair 等。這個框架 工具 產品在實現的時候,都考慮到了容災,擴充套件,負載均衡,於是出現乙個配置中心 configserver 的東...

dubbo原始碼分析20 遠端呼叫概述

在之前的文章我們分析了 dubbo 的服務治理,也就是在 consumer 端在進行服務引用的時候。consumer 首先會根據配置 protocol 協議 建立 invoke 呼叫物件,它代表乙個可執行體,可向它發起 invoke 呼叫,它有可能是乙個本地的實現,也可能是乙個遠端的實現,也可能乙個...

dubbo服務的 遠端呼叫

首先dubbo 和spring 是無縫整合的,先看下配置檔案 提供端的,id testservice class com.dubbo.provider.impl.tetsserviceimpl dubbo name xixi provider dubbo registry address zooke...