Dubbo服務入口和啟動過程(Version2.7.3)


 

1. Spring容器何時加載Dubbo組件?

根據官方說法

基於 dubbo.jar 內的 META-INF/spring.handlers 配置,Spring 在遇到 dubbo 名稱空間時,會回調 DubboNamespaceHandler。

所有 dubbo 的標簽,都統一用 DubboBeanDefinitionParser 進行解析,基於一對一屬性映射,將 XML 標簽解析為 Bean 對象。

在 ServiceConfig.export() 或 ReferenceConfig.get() 初始化時,將 Bean 對象轉換 URL 格式,所有 Bean 屬性轉成 URL 的參數。

然后將 URL 傳給 協議擴展點,基於擴展點的 擴展點自適應機制,根據 URL 的協議頭,進行不同協議的服務暴露或引用。

可以知道,Dubbo的啟動得益於Spring的擴展機制

1. 上面說的是基於XML的擴展機制,體現在

Handler注冊了一系列Bean定義解析器

2. 而目前Dubbo支持注解配置了,這里就是第二種擴展----基於Java配置的擴展

比如官方的示例配置:

@Configuration
@EnableDubbo(scanBasePackages = "org.apache.dubbo.samples.simple.annotation.impl")
@PropertySource("classpath:/spring/dubbo-provider.properties")
static public class ProviderConfiguration {
       
}

其中有個 EnableDubbo 注解

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@EnableDubboConfig
@DubboComponentScan
public @interface EnableDubbo {
    @AliasFor(
        annotation = DubboComponentScan.class,
        attribute = "basePackages"
    )
    String[] scanBasePackages() default {};

    @AliasFor(
        annotation = DubboComponentScan.class,
        attribute = "basePackageClasses"
    )
    Class<?>[] scanBasePackageClasses() default {};

    @AliasFor(
        annotation = EnableDubboConfig.class,
        attribute = "multiple"
    )
    boolean multipleConfig() default true;
}

里面有個 EnableDubboConfig 注解

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@Import({DubboConfigConfigurationRegistrar.class})
public @interface EnableDubboConfig {
    boolean multiple() default true;
}

看見 @Import 注解了嗎,它是支持Java配置擴展的關鍵點,使得Spring在處理 EnableDubboConfig 注解的時候能夠調用給定類中的相關方法。

public class DubboConfigConfigurationRegistrar implements ImportBeanDefinitionRegistrar {
    public DubboConfigConfigurationRegistrar() {
    }

    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        AnnotationAttributes attributes = AnnotationAttributes.fromMap(importingClassMetadata.getAnnotationAttributes(EnableDubboConfig.class.getName()));
        boolean multiple = attributes.getBoolean("multiple");
        AnnotatedBeanDefinitionRegistryUtils.registerBeans(registry, new Class[]{Single.class});
        if (multiple) {
            AnnotatedBeanDefinitionRegistryUtils.registerBeans(registry, new Class[]{Multiple.class});
        }

    }
}

接口 ImportBeanDefinitionRegistrar 里的 registerBeanDefinitions 方法允許Dubbo向Spring里注冊Bean。

到這里我們了解了

1. Dubbo啟動的入口(利用Spring的擴展機制)

2. Spring的擴展機制(這個網友講的很棒:https://www.tuicool.com/articles/ueeyYjI)實際上有好多擴展機制:

  • 基於XML配置
  • 基於Java配置
  • 基於BeanFactoryPostProcessor和BeanPostProcessor
  • 基於Aware
  • 基於ApplicationListener

2. 服務調用過程?

直接拿官方圖片,說的已經很明白了

 調用過程

  1. 服務容器負責啟動,加載,運行服務提供者。
  2. 服務提供者在啟動時,向注冊中心注冊自己提供的服務。
  3. 服務消費者在啟動時,向注冊中心訂閱自己所需的服務。
  4. 注冊中心返回服務提供者地址列表給消費者,如果有變更,注冊中心將基於長連接推送變更數據給消費者。
  5. 服務消費者,從緩存的提供者地址列表中,基於軟負載均衡算法,選一台提供者進行調用,如果調用失敗,再選另一台調用。
  6. 服務消費者和提供者,在內存中累計調用次數和調用時間,定時每分鍾發送一次統計數據到監控中心。

Dubbo一些概念

Dubbo 是一個分布式服務框架,致力於提供高性能和透明化的RPC遠程服務調用方案,以及SOA服務治理方案。

RPC(Remote Procedure Call)

遠程過程調用協議,通過網絡從遠程計算機上請求調用某種服務。

RMI(Remote Method Invocation)

遠程方法調用,能夠讓在客戶端Java虛擬機上的對象像調用本地對象一樣調用服務端Java虛擬機中對象的方法。RMI是RPC的java語言的細化版。

服務治理

服務治理(SOA governance),按照Anne Thomas Manes的定義是:企業為了確保事情順利完成而實施的過程,包括最佳實踐、架構原則、治理規程、規律以及其他決定性的因素。服務治理指的是用來管理SOA的采用和實現的過程。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM