dubbo原理解析


dubbo 調用時,接口會產生一個代理類,com.alibaba.dubbo.common.bytecode.proxy0
在這裏插入圖片描述

問題一: dubbo框架是如何跟spring進行整合的?

  1. 定義dubbo xml標籤
    • com\alibaba\dubbo\2.6.2\dubbo-2.6.2.jar!\META-INF\dubbo.xsd
    • com\alibaba\dubbo\2.6.2\dubbo-2.6.2.jar!\META-INF\spring.handlers
    • com\alibaba\dubbo\2.6.2\dubbo-2.6.2.jar!\META-INF\spring.schemas
  2. 定義 xml 標籤解析類
    • com.alibaba.dubbo.config.spring.schema.DubboNamespaceHandler

      標籤解析類將標籤變爲 RootBeanDefinition 對象,調用 beanDefinition.getPropertyValues().addPropertyValue("id", id);
      就可以將id在標籤中的值設置給相應對象的屬性上,
      調用 parserContext.getRegistry().registerBeanDefinition("Reference" + id, beanDefinition); 註冊方法
      RootBeanDefinition 對象中的bean名字加入到 beanDefinitionNames 容器中。

      RootBeanDefinition beanDefinition = new RootBeanDefinition();
      // spring 會把 beanClass 進行實例化
      beanDefinition.setBeanClass(beanClass);
      beanDefinition.setLazyInit(false);
      String id = element.getAttribute("id");
      //註冊 beanDefinition
      parserContext.getRegistry().registerBeanDefinition("Reference" + id, beanDefinition);
      

問題二:消費者獲取的代理實例是如何創建?

<dubbo:reference id="userService" interface="com.myke.consumer.api.UserService" protocol="dubbo"/>

見類com.alibaba.dubbo.config.spring.ReferenceBean 這個類實現了 FactoryBean 類,

public interface FactoryBean<T> {
    // 這個方法是spring 調用的,spring 初始化時候調用,
    // ApplicationContext.getBean("beanId")時,就會調用這個方法,
    // 這個方法的返回值,會交給spring 容器進行管理
    // 這裏其實返回的是 interface 配置的接口代理類
    T getObject() throws Exception;

    Class<?> getObjectType();

    boolean isSingleton();
}

見類 com.alibaba.dubbo.rpc.proxy.InvokerInvocationHandlerinvoke 方法中進行了 rpc 遠程調用,
rpc 協議有:http、rmi、dubbo、netty,所以就會有相應的調用實現,實現都是基於接口的,所以見類com.alibaba.dubbo.rpc.Invoker 的實現類,其中com.alibaba.dubbo.rpc.protocol.dubbo.DubboInvoker就是dubbo的實現

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章