国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Dubbo 新編程模型之外部化配置

baihe / 3525人閱讀

摘要:同時,所標注的需要被應用上下文注冊配置引導類創建配置上下文注冊當前配置獲取和獲取獲取運行結果運行后控制臺輸出輸出的內容與綁定的內容一致,符合期望。

Dubbo 外部化配置(Externalized Configuration) 原文地址 外部化配置(Externalized Configuration)

在Dubbo 注解驅動例子中,無論是服務提供方,還是服務消費方,均需要轉配相關配置Bean:

    @Bean
    public ApplicationConfig applicationConfig() {
        ApplicationConfig applicationConfig = new ApplicationConfig();
        applicationConfig.setName("dubbo-annotation-consumer");
        return applicationConfig;
    }

雖然實現類似于ProviderConfigurationConsumerConfiguration 這樣的 Spring @Configuration Bean 成本并不高,不過通過 Java Code 的方式定義配置 Bean,或多或少是一種 Hard Code(硬編碼)的行為,缺少彈性。

盡管在 Spring 應用中,可以通過 @Value 或者 Environment 的方式獲取外部配置,其代碼簡潔性以及類型轉換靈活性存在明顯的不足。因此,Spring Boot 提出了外部化配置(External Configuration)的感念,即通過程序以外的配置源,動態地綁定指定類型。

隨著 Spring Boot / Spring Cloud 應用的流行,開發人員逐漸地接受并且使用 Spring Boot 外部化配置(External Configuration),即通過 application.properties 或者 bootstrap.properties 裝配配置 Bean。

下列表格記錄了 Dubbo 內置配置類:

配置類 標簽 用途 解釋
ProtocolConfig 協議配置 用于配置提供服務的協議信息,協議由提供方指定,消費方被動接受
ApplicationConfig 應用配置 用于配置當前應用信息,不管該應用是提供者還是消費者
ModuleConfig 模塊配置 用于配置當前模塊信息,可選
RegistryConfig 注冊中心配置 用于配置連接注冊中心相關信息
MonitorConfig 監控中心配置 用于配置連接監控中心相關信息,可選
ProviderConfig 提供方配置 當 ProtocolConfig 和 ServiceConfig 某屬性沒有配置時,采用此缺省值,可選
ConsumerConfig 消費方配置 當 ReferenceConfig 某屬性沒有配置時,采用此缺省值,可選
MethodConfig 方法配置 用于 ServiceConfig 和 ReferenceConfig 指定方法級的配置信息
ArgumentConfig 參數配置 用于指定方法參數配置

通過申明對應的 Spring 擴展標簽,在 Spring 應用上下文中將自動生成相應的配置 Bean。

在 Dubbo 官方用戶手冊的“屬性配置”章節中,dubbo.properties 配置屬性能夠映射到 ApplicationConfigProtocolConfig 以及 RegistryConfig 的字段。從某種意義上來說,dubbo.properties 也是 Dubbo 的外部化配置。

其中,引用“映射規則”的內容:

映射規則

將 XML 配置的標簽名,加屬性名,用點分隔,多個屬性拆成多行

比如:dubbo.application.name=foo等價于

比如:dubbo.registry.address=10.20.153.10:9090等價于

如果 XML 有多行同名標簽配置,可用 id 號區分,如果沒有 id 號將對所有同名標簽生效

比如:dubbo.protocol.rmi.port=1234等價于2

比如:dubbo.registry.china.address=10.20.153.10:9090等價于

下面是 dubbo.properties 的一個典型配置:

dubbo.application.name=foo
dubbo.application.owner=bar
dubbo.registry.address=10.20.153.10:9090

根據“映射規則”,Dubbo 即支持單配置 Bean 映射,也支持多 Bean 映射。綜合以上需求,既要兼容 Dubbo 已有的一個或多個 Bean 字段映射綁定,也支持外部化配置。

特別提醒:外部化配置(External Configuration)并非 Spring Boot 特有,即使在 Spring Framework 場景下亦能支持。也就是說 Dubbo 外部化配置即可在 Spring Framework 中工作,也能在 Spring Boot 中運行。

Dubbo 外部化配置(External Configuration) 支持起始版本為:2.5.8

@EnableDubboConfig 起始版本:2.5.8 使用說明
@EnableDubboConfig 定義
public @interface EnableDubboConfig {

    /**
     * It indicates whether binding to multiple Spring Beans.
     *
     * @return the default value is false
     * @revised 2.5.9
     */
    boolean multiple() default false;

}

multiple : 表示是否支持多Dubbo 配置 Bean 綁定。默認值為 false ,即單 Dubbo 配置 Bean 綁定

單 Dubbo 配置 Bean 綁定

為了更好地向下兼容,@EnableDubboConfig 提供外部化配置屬性與 Dubbo 配置類之間的綁定,其中映射關系如下:

配置類 外部化配置屬性前綴 用途
ProtocolConfig dubbo.protocol 協議配置
ApplicationConfig dubbo.application 應用配置
ModuleConfig dubbo.module 模塊配置
RegistryConfig dubbo.registry 注冊中心配置
MonitorConfig dubbo.monitor 監控中心配置
ProviderConfig dubbo.provider 提供方配置
ConsumerConfig dubbo.consumer 消費方配置

當標注 @EnableDubboConfig 的類被掃描注冊后,同時 Spring(Spring Boot)應用配置(PropertySources)中存在dubbo.application.* 時,ApplicationConfig Bean 將被注冊到在 Spring 上下文。否則,不會被注冊。如果出現dubbo.registry.*的配置,那么,RegistryConfig Bean 將會創建,以此類推。即按需裝配 Dubbo 配置 Bean。

如果需要指定配置 Bean的 id,可通過**.id 屬性設置,以dubbo.application 為例:

## application
dubbo.application.id = applicationBean
dubbo.application.name = dubbo-demo-application

以上配置等同于以下 Java Config Bean:

    @Bean("applicationBean")
    public ApplicationConfig applicationBean() {
        ApplicationConfig applicationConfig = new ApplicationConfig();
        applicationConfig.setName("dubbo-demo-application");
        return applicationConfig;
    }

大致上配置屬性與配置類綁定模式 - dubbo.application.* 映射到 ApplicationConfig 中的字段。

注:當配置屬性名稱無法在配置類中找到字段時,將會忽略綁定
多 Dubbo 配置 Bean 綁定

Dubbo @Service@Reference 允許 Dubbo 應用關聯ApplicationConfig Bean 或者指定多個RegistryConfig Bean 等能力。換句話說,Dubbo 應用上下文中可能存在多個ApplicationConfig 等 Bean定義。

為了適應以上需要,因此從Dubbo 2.5.9 開始,@EnableDubboConfig 支持多 Dubbo 配置 Bean 綁定,同時按照業界規約標準,與單 Dubbo 配置 Bean 綁定約定不同,配置屬性前綴均為英文復數形式:

詳情請參考 :https://github.com/alibaba/du...

dubbo.applications

dubbo.modules

dubbo.registries

dubbo.protocols

dubbo.monitors

dubbo.providers

dubbo.consumers

dubbo.applications 為例,基本的模式如下:

dubbo.applications.${bean-name}.property-name = ${property-value}

請讀者注意,在單 Dubbo 配置 Bean 綁定時,可以通過指定id 屬性的方式,定義ApplicationConfig Bean 的ID,即dubbo.application.id

而在多 Dubbo 配置 Bean 綁定時,Bean ID 則由dubbo.applications.與屬性字段名稱(.property-name)之間的字符來表達。

如下配置:

# multiple Bean definition
dubbo.applications.applicationBean.name = dubbo-demo-application
dubbo.applications.applicationBean2.name = dubbo-demo-application2
dubbo.applications.applicationBean3.name = dubbo-demo-application3

該配置內容中,綁定了三個ApplicationConfig Bean,分別是applicationBeanapplicationBean2以及applicationBean3

示例說明

@EnableDubboConfig 的使用方法很簡答, 再次強調一點,當規約的外部配置存在時,相應的 Dubbo 配置類 才會提升為 Spring Bean。簡言之,按需裝配。

單 Dubbo 配置 Bean 綁定
外部化配置文件

將以下內容的外部化配置文件物理路徑為:classpath:/META-INF/config.properties:

# 單 Dubbo 配置 Bean 綁定
## application
dubbo.application.id = applicationBean
dubbo.application.name = dubbo-demo-application

## module
dubbo.module.id = moduleBean
dubbo.module.name = dubbo-demo-module

## registry
dubbo.registry.address = zookeeper://192.168.99.100:32770

## protocol
dubbo.protocol.name = dubbo
dubbo.protocol.port = 20880

## monitor
dubbo.monitor.address = zookeeper://127.0.0.1:32770

## provider
dubbo.provider.host = 127.0.0.1

## consumer
dubbo.consumer.client = netty
@EnableDubboConfig 配置 Bean
/**
 * Dubbo 配置 Bean
 *
 * @author Mercy
 */
@EnableDubboConfig
@PropertySource("META-INF/config.properties")
@Configuration
public class DubboConfiguration {

}
實現引導類
/**
 * Dubbo 配置引導類
 *
 * @author Mercy
 */
public class DubboConfigurationBootstrap {

    public static void main(String[] args) {
        // 創建配置上下文
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
        // 注冊當前配置 Bean
        context.register(DubboConfiguration.class);
        context.refresh();
         // application
        ApplicationConfig applicationConfig = context.getBean("applicationBean", ApplicationConfig.class);
        System.out.printf("applicationBean.name = %s 
", applicationConfig.getName());

        // module
        ModuleConfig moduleConfig = context.getBean("moduleBean", ModuleConfig.class);
        System.out.printf("moduleBean.name = %s 
", moduleConfig.getName());

        // registry
        RegistryConfig registryConfig = context.getBean(RegistryConfig.class);
        System.out.printf("registryConfig.name = %s 
", registryConfig.getAddress());

        // protocol
        ProtocolConfig protocolConfig = context.getBean(ProtocolConfig.class);
        System.out.printf("protocolConfig.name = %s 
", protocolConfig.getName());
        System.out.printf("protocolConfig.port = %s 
", protocolConfig.getPort());

        // monitor
        MonitorConfig monitorConfig = context.getBean(MonitorConfig.class);
        System.out.printf("monitorConfig.name = %s 
", monitorConfig.getAddress());

        // provider
        ProviderConfig providerConfig = context.getBean(ProviderConfig.class);
        System.out.printf("providerConfig.name = %s 
", providerConfig.getHost());

        // consumer
        ConsumerConfig consumerConfig = context.getBean(ConsumerConfig.class);
        System.out.printf("consumerConfig.name = %s 
", consumerConfig.getClient());
    }
}
執行結果
applicationBean.name = dubbo-demo-application 
moduleBean.name = dubbo-demo-module 
registryConfig.name = zookeeper://192.168.99.100:32770 
protocolConfig.name = dubbo 
protocolConfig.port = 20880 
monitorConfig.name = zookeeper://127.0.0.1:32770 
providerConfig.name = 127.0.0.1 
consumerConfig.name = netty 

不難發現,@EnableDubboConfig 配置 Bean 配合外部化文件 classpath:/META-INF/config.properties,與執行輸出內容相同。

多 Dubbo 配置 Bean 綁定
外部化配置文件

將以下內容的外部化配置文件物理路徑為:classpath:/META-INF/multiple-config.properties:

# 多 Dubbo 配置 Bean 綁定
## dubbo.applications
dubbo.applications.applicationBean.name = dubbo-demo-application
dubbo.applications.applicationBean2.name = dubbo-demo-application2
dubbo.applications.applicationBean3.name = dubbo-demo-application3
@EnableDubboConfig 配置 Bean(多)
@EnableDubboConfig(multiple = true)
@PropertySource("META-INF/multiple-config.properties")
private static class DubboMultipleConfiguration {

}    
實現引導類
/**
 * Dubbo 配置引導類
 *
 * @author Mercy
 */
public class DubboConfigurationBootstrap {
    public static void main(String[] args) {
        // 創建配置上下文
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
        // 注冊當前配置 Bean
        context.register(DubboMultipleConfiguration.class);
        context.refresh();

        // 獲取 ApplicationConfig Bean:"applicationBean"、"applicationBean2" 和 "applicationBean3"
        ApplicationConfig applicationBean = context.getBean("applicationBean", ApplicationConfig.class);
        ApplicationConfig applicationBean2 = context.getBean("applicationBean2", ApplicationConfig.class);
        ApplicationConfig applicationBean3 = context.getBean("applicationBean3", ApplicationConfig.class);

        System.out.printf("applicationBean.name = %s 
", applicationBean.getName());
        System.out.printf("applicationBean2.name = %s 
", applicationBean2.getName());
        System.out.printf("applicationBean3.name = %s 
", applicationBean3.getName());
    }
}
執行結果
applicationBean.name = dubbo-demo-application 
applicationBean2.name = dubbo-demo-application2 
applicationBean3.name = dubbo-demo-application3 

@EnableDubboConfig(multiple = true) 執行后,運行結果說明ApplicationConfig Bean 以及 ID 的定義方式。

@EnableDubboConfigBinding & @EnableDubboConfigBindings

@EnableDubboConfig適合絕大多數外部化配置場景,然而無論是單 Bean 綁定,還是多 Bean 綁定,其外部化配置屬性前綴是固化的,如dubbo.application 以及 dubbo.applications

當應用需要自定義外部化配置屬性前綴@EnableDubboConfigBinding能提供更大的彈性,支持單個外部化配置屬性前綴(prefix) 與 Dubbo 配置 Bean 類型(AbstractConfig 子類)綁定,如果需要多次綁定時,可使用@EnableDubboConfigBindings

盡管 Dubbo 推薦使用 Java 8 ,然而實際的情況,運行時的 JDK 的版本可能從 6到8 均有。因此,@EnableDubboConfigBinding 沒有實現java.lang.annotation.Repeatable,即允許實現類不支持重復標注@EnableDubboConfigBinding

@EnableDubboConfigBinding 在支持外部化配置屬性與 Dubbo 配置類綁定時,與 Dubbo 過去的映射行為不同,被綁定的 Dubbo 配置類將會提升為 Spring Bean,無需提前裝配 Dubbo 配置類。同時,支持多 Dubbo 配置Bean 裝配。其 Bean 的綁定規則與@EnableDubboConfig一致。

起始版本: 2.5.8 使用說明
@EnableDubboConfigBinding 定義
public @interface EnableDubboConfigBinding {

    /**
     * The name prefix of the properties that are valid to bind to {@link AbstractConfig Dubbo Config}.
     *
     * @return the name prefix of the properties to bind
     */
    String prefix();

    /**
     * @return The binding type of {@link AbstractConfig Dubbo Config}.
     * @see AbstractConfig
     * @see ApplicationConfig
     * @see ModuleConfig
     * @see RegistryConfig
     */
    Class type();

    /**
     * It indicates whether {@link #prefix()} binding to multiple Spring Beans.
     *
     * @return the default value is false
     */
    boolean multiple() default false;

}

prefix() : 指定待綁定 Dubbo 配置類的外部化配置屬性的前綴,比如dubbo.applicationApplicationConfig 的外部化配置屬性的前綴。prefix() 支持占位符(Placeholder), 并且其關聯前綴值是否以"." 作為結尾字符是可選的,即prefix() = "dubbo.application"prefix() = "dubbo.application." 效果相同

type() : 指定 Dubbo 配置類,所有 AbstractConfig 的實現子類即可,如ApplicationConfigRegistryConfig 以及 ProtocolConfig

multiple() : 表明是否需要將prefix() 作為多個 type() 類型的 Spring Bean 外部化配置屬性。默認值為false,即默認支持單個類型的 Spring 配置 Bean

假設標注 @EnableDubboConfigBinding 的實現類被 Spring 應用上下文掃描并且注冊后,其中prefix() = dubbo.apptype() = ApplicationConfig.class ,且外部配置內容為:

dubbo.app.id = applicationBean
dubbo.app.name = dubbo-demo-application

Spring 應用上下文啟動后,一個 ID 為 "applicationBean" 的 ApplicationConfig Bean 被初始化,其 name 字段被設置為 "dubbo-demo-application"。

EnableDubboConfigBindings 定義
public @interface EnableDubboConfigBindings {

    /**
     * The value of {@link EnableDubboConfigBindings}
     *
     * @return non-null
     */
    EnableDubboConfigBinding[] value();

}

value : 指定多個EnableDubboConfigBinding,用于實現外部化配置屬性前綴(prefix) 與 Dubbo 配置 Bean 類型(AbstractConfig 子類)綁定。

示例說明
外部化配置文件

將以下內容的外部化配置文件物理路徑為:classpath:/META-INF/bindings.properties

# classpath:/META-INF/bindings.properties
## 占位符值 : ApplicationConfig 外部配置屬性前綴
applications.prefix = dubbo.apps.

## 多 ApplicationConfig Bean 綁定
dubbo.apps.applicationBean.name = dubbo-demo-application
dubbo.apps.applicationBean2.name = dubbo-demo-application2
dubbo.apps.applicationBean3.name = dubbo-demo-application3

## 單 ModuleConfig Bean 綁定
dubbo.module.id = moduleBean
dubbo.module.name = dubbo-demo-module

## 單 RegistryConfig Bean 綁定
dubbo.registry.address = zookeeper://192.168.99.100:32770
EnableDubboConfigBindings 配置 Bean

DubboConfiguration 作為 Dubbo 配置 Bean,除通過 @EnableDubboConfigBinding 綁定之外,還需要 @PropertySource 指定外部化配置文件(classpath:/META-INF/bindings.properties):

/**
 * Dubbo 配置 Bean
 *
 * @author Mercy
 */
@EnableDubboConfigBindings({
        @EnableDubboConfigBinding(prefix = "${applications.prefix}",
                type = ApplicationConfig.class, multiple = true), // 多 ApplicationConfig Bean 綁定
        @EnableDubboConfigBinding(prefix = "dubbo.module", // 不帶 "." 后綴
                type = ModuleConfig.class), // 單 ModuleConfig Bean 綁定
        @EnableDubboConfigBinding(prefix = "dubbo.registry.", // 帶 "." 后綴
                type = RegistryConfig.class) // 單 RegistryConfig Bean 綁定
})
@PropertySource("META-INF/bindings.properties")
@Configuration
public class DubboConfiguration {
  
}
實現引導類

通過之前的使用說明,當 EnableDubboConfigBinding 將外部配置化文件classpath:/META-INF/dubbo.properties 綁定到 ApplicationConfig后,其中 Spring Bean "applicationBean" 的 name 字段被設置成 "dubbo-demo-application"。同時, EnableDubboConfigBinding 所標注的 DubboConfiguration 需要被 Sring 應用上下文注冊:

/**
 * Dubbo 配置引導類
 *
 * @author Mercy
 */
public class DubboConfigurationBootstrap {

    public static void main(String[] args) {
        // 創建配置上下文
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
        // 注冊當前配置 Bean
        context.register(DubboConfiguration.class);
        context.refresh();
         // 獲取 ApplicationConfig Bean:"applicationBean"、"applicationBean2" 和 "applicationBean3"
        ApplicationConfig applicationBean = context.getBean("applicationBean", ApplicationConfig.class);
        ApplicationConfig applicationBean2 = context.getBean("applicationBean2", ApplicationConfig.class);
        ApplicationConfig applicationBean3 = context.getBean("applicationBean3", ApplicationConfig.class);

        System.out.printf("applicationBean.name = %s 
", applicationBean.getName());
        System.out.printf("applicationBean2.name = %s 
", applicationBean2.getName());
        System.out.printf("applicationBean3.name = %s 
", applicationBean3.getName());

        // 獲取 ModuleConfig Bean:"moduleBean"
        ModuleConfig moduleBean = context.getBean("moduleBean", ModuleConfig.class);

        System.out.printf("moduleBean.name = %s 
", moduleBean.getName());

        // 獲取 RegistryConfig Bean
        RegistryConfig registry = context.getBean(RegistryConfig.class);

        System.out.printf("registry.address = %s 
", registry.getAddress());
    }
}
運行結果

DubboConfigurationBootstrap 運行后控制臺輸出:

applicationBean.name = dubbo-demo-application 
applicationBean2.name = dubbo-demo-application2 
applicationBean3.name = dubbo-demo-application3 
moduleBean.name = dubbo-demo-module 
registry.address = zookeeper://192.168.99.100:32770 

輸出的內容與classpath:/META-INF/bindings.properties 綁定的內容一致,符合期望。

下篇預告 《Dubbo 微服務編程模型》
更多 Dubbo 以及 微服務相關內容,請關注小馬哥公眾號:
關于作者

小馬哥,十余年Java EE 從業經驗,架構師、微服務布道師、Dubbo 維護者。目前主要負責阿里巴巴集團微服務技術實施、架構衍進、基礎設施構建等。重點關注云計算、微服務以及軟件架構等領域。通過SUN Java(SCJP、SCWCD、SCBCD)以及Oracle OCA 等的認證。

github:https://github.com/mercyblitz sf.gg : https://segmentfault.com/u/me... 微信/微博:mercyblitz

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/68121.html

相關文章

  • Dubbo 新編模型注解驅動

    摘要:在生態系統中,以和為代表的微服務框架,引入了全新的編程模型,包括注解驅動外部化配置以及自動裝配等。新的編程模型無需配置簡化部署提升開發效率。同時,新的編程模型也是即將發布的的基礎設施。 原文地址 整體愿景 隨著微服務架構的廣泛地推廣和實施。在 Java 生態系統中,以 Spring Boot 和 Spring Cloud 為代表的微服務框架,引入了全新的編程模型,包括注解驅動(Anno...

    chavesgu 評論0 收藏0
  • 官方 Dubbo Spring Boot Starter 1.0.0 公測版

    摘要:公告今天小馬哥非常高興地向各位小伙伴宣布,官方公測版已開發完畢,即將發布至公有倉庫,目前正在內部測試中。為了收集更多的用戶反饋,小馬哥誠邀大家一同參與使用測試以及共同維護,項目工程地址如果您喜愛并想了解工程的動態,不妨點擊按鈕加以關注。 公告 今天小馬哥非常高興地向各位小伙伴宣布,官方 Dubbo Spring Boot Starter 1.0.0 公測版已開發完畢,即將發布至 Mav...

    MrZONT 評論0 收藏0
  • Dubbo Spring Cloud 重塑微服務治理

    摘要:在服務治理方面,相較于而言,并不成熟。遺憾的是,往往被部分開發者片面地視作服務治理的框架,而非微服務基礎設施。因此,建議開發人員將或者遷移為服務。因此,下一步需要將其配置服務遠程。當服務提供方啟動后,下一步實現一個服務消費方。 原文鏈接:Dubbo Spring Cloud 重塑微服務治理,來自于微信公眾號:次靈均閣 摘要 在 Java 微服務生態中,Spring Cloud1 成為...

    wh469012917 評論0 收藏0
  • dubbo源碼解析(四十三)2.7新特性

    摘要:大揭秘目標了解的新特性,以及版本升級的引導。四元數據改造我們知道以前的版本只有注冊中心,注冊中心的有數十個的鍵值對,包含了一個服務所有的元數據。 DUBBO——2.7大揭秘 目標:了解2.7的新特性,以及版本升級的引導。 前言 我們知道Dubbo在2011年開源,停止更新了一段時間。在2017 年 9 月 7 日,Dubbo 悄悄的在 GitHub 發布了 2.5.4 版本。隨后,版本...

    qqlcbb 評論0 收藏0
  • Dubbo Cloud Native 實踐與思考

    摘要:可簡單地認為它是的擴展,負載均衡自然成為不可或缺的特性。類似的特性在項目也有體現,它是另一種高性能代理的方案,提供服務發現健康和負載均衡。 Dubbo Cloud Native 實踐與思考 分享簡介 Cloud Native 應用架構隨著云技術的發展受到業界特別重視和關注,尤其是 CNCF(Cloud Native Computing Foundation)項目蓬勃發展之際。Dubbo...

    邱勇 評論0 收藏0

發表評論

0條評論

baihe

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<