日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

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

發(fā)布時(shí)間:2025/3/17 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Dubbo 新编程模型之外部化配置 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Dubbo 外部化配置(Externalized Configuration)

原文地址

外部化配置(Externalized Configuration)

在Dubbo 注解驅(qū)動(dòng)例子中,無論是服務(wù)提供方,還是服務(wù)消費(fèi)方,均需要轉(zhuǎn)配相關(guān)配置Bean:

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

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

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

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

下列表格記錄了 Dubbo 內(nèi)置配置類:

配置類標(biāo)簽用途解釋
ProtocolConfig<dubbo:protocol/>協(xié)議配置用于配置提供服務(wù)的協(xié)議信息,協(xié)議由提供方指定,消費(fèi)方被動(dòng)接受
ApplicationConfig<dubbo:application/>應(yīng)用配置用于配置當(dāng)前應(yīng)用信息,不管該應(yīng)用是提供者還是消費(fèi)者
ModuleConfig<dubbo:module/>模塊配置用于配置當(dāng)前模塊信息,可選
RegistryConfig<dubbo:registry/>注冊(cè)中心配置用于配置連接注冊(cè)中心相關(guān)信息
MonitorConfig<dubbo:monitor/>監(jiān)控中心配置用于配置連接監(jiān)控中心相關(guān)信息,可選
ProviderConfig<dubbo:provider/>提供方配置當(dāng) ProtocolConfig 和 ServiceConfig 某屬性沒有配置時(shí),采用此缺省值,可選
ConsumerConfig<dubbo:consumer/>消費(fèi)方配置當(dāng) ReferenceConfig 某屬性沒有配置時(shí),采用此缺省值,可選
MethodConfig<dubbo:method/>方法配置用于 ServiceConfig 和 ReferenceConfig 指定方法級(jí)的配置信息
ArgumentConfig<dubbo:argument/>參數(shù)配置用于指定方法參數(shù)配置

通過申明對(duì)應(yīng)的 Spring 擴(kuò)展標(biāo)簽,在 Spring 應(yīng)用上下文中將自動(dòng)生成相應(yīng)的配置 Bean。

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

其中,引用“映射規(guī)則”的內(nèi)容:

映射規(guī)則

將 XML 配置的標(biāo)簽名,加屬性名,用點(diǎn)分隔,多個(gè)屬性拆成多行

  • 比如:dubbo.application.name=foo等價(jià)于<dubbo:application name="foo" />
  • 比如:dubbo.registry.address=10.20.153.10:9090等價(jià)于<dubbo:registryaddress="10.20.153.10:9090" />

如果 XML 有多行同名標(biāo)簽配置,可用 id 號(hào)區(qū)分,如果沒有 id 號(hào)將對(duì)所有同名標(biāo)簽生效

  • 比如:dubbo.protocol.rmi.port=1234等價(jià)于<dubbo:protocol id="rmi" name="rmi" port="1099" />2
  • 比如:dubbo.registry.china.address=10.20.153.10:9090等價(jià)于<dubbo:registry id="china"address="10.20.153.10:9090" />

下面是 dubbo.properties 的一個(gè)典型配置:

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

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

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

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 <code>false</code>* @revised 2.5.9*/boolean multiple() default false;}
  • multiple : 表示是否支持多Dubbo 配置 Bean 綁定。默認(rèn)值為 false ,即單 Dubbo 配置 Bean 綁定
單 Dubbo 配置 Bean 綁定

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

配置類外部化配置屬性前綴用途
ProtocolConfigdubbo.protocol協(xié)議配置
ApplicationConfigdubbo.application應(yīng)用配置
ModuleConfigdubbo.module模塊配置
RegistryConfigdubbo.registry注冊(cè)中心配置
MonitorConfigdubbo.monitor監(jiān)控中心配置
ProviderConfigdubbo.provider提供方配置
ConsumerConfigdubbo.consumer消費(fèi)方配置

當(dāng)標(biāo)注 @EnableDubboConfig 的類被掃描注冊(cè)后,同時(shí) Spring(Spring Boot)應(yīng)用配置(PropertySources)中存在dubbo.application.* 時(shí),ApplicationConfig Bean 將被注冊(cè)到在 Spring 上下文。否則,不會(huì)被注冊(cè)。如果出現(xiàn)dubbo.registry.*的配置,那么,RegistryConfig Bean 將會(huì)創(chuàng)建,以此類推。即按需裝配 Dubbo 配置 Bean。

如果需要指定配置 Bean的 id,可通過**.id 屬性設(shè)置,以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 中的字段。

注:當(dāng)配置屬性名稱無法在配置類中找到字段時(shí),將會(huì)忽略綁定
多 Dubbo 配置 Bean 綁定

Dubbo @Service 和 @Reference 允許 Dubbo 應(yīng)用關(guān)聯(lián)ApplicationConfig Bean 或者指定多個(gè)RegistryConfig Bean 等能力。換句話說,Dubbo 應(yīng)用上下文中可能存在多個(gè)ApplicationConfig 等 Bean定義。

為了適應(yīng)以上需要,因此從Dubbo 2.5.9 開始,@EnableDubboConfig 支持多 Dubbo 配置 Bean 綁定,同時(shí)按照業(yè)界規(guī)約標(biāo)準(zhǔn),與單 Dubbo 配置 Bean 綁定約定不同,配置屬性前綴均為英文復(fù)數(shù)形式:

詳情請(qǐng)參考 :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}

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

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

如下配置:

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

該配置內(nèi)容中,綁定了三個(gè)ApplicationConfig Bean,分別是applicationBean、applicationBean2以及applicationBean3

示例說明

@EnableDubboConfig 的使用方法很簡(jiǎn)答, 再次強(qiáng)調(diào)一點(diǎn),當(dāng)規(guī)約的外部配置存在時(shí),相應(yīng)的 Dubbo 配置類 才會(huì)提升為 Spring Bean。簡(jiǎn)言之,按需裝配。

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

將以下內(nèi)容的外部化配置文件物理路徑為: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 <a href="mailto:mercyblitz@gmail.com">Mercy</a>*/ @EnableDubboConfig @PropertySource("META-INF/config.properties") @Configuration public class DubboConfiguration {}
實(shí)現(xiàn)引導(dǎo)類
/*** Dubbo 配置引導(dǎo)類** @author <a href="mailto:mercyblitz@gmail.com">Mercy</a>*/ public class DubboConfigurationBootstrap {public static void main(String[] args) {// 創(chuàng)建配置上下文AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();// 注冊(cè)當(dāng)前配置 Beancontext.register(DubboConfiguration.class);context.refresh();// applicationApplicationConfig applicationConfig = context.getBean("applicationBean", ApplicationConfig.class);System.out.printf("applicationBean.name = %s \n", applicationConfig.getName());// moduleModuleConfig moduleConfig = context.getBean("moduleBean", ModuleConfig.class);System.out.printf("moduleBean.name = %s \n", moduleConfig.getName());// registryRegistryConfig registryConfig = context.getBean(RegistryConfig.class);System.out.printf("registryConfig.name = %s \n", registryConfig.getAddress());// protocolProtocolConfig protocolConfig = context.getBean(ProtocolConfig.class);System.out.printf("protocolConfig.name = %s \n", protocolConfig.getName());System.out.printf("protocolConfig.port = %s \n", protocolConfig.getPort());// monitorMonitorConfig monitorConfig = context.getBean(MonitorConfig.class);System.out.printf("monitorConfig.name = %s \n", monitorConfig.getAddress());// providerProviderConfig providerConfig = context.getBean(ProviderConfig.class);System.out.printf("providerConfig.name = %s \n", providerConfig.getHost());// consumerConsumerConfig consumerConfig = context.getBean(ConsumerConfig.class);System.out.printf("consumerConfig.name = %s \n", consumerConfig.getClient());} }
執(zhí)行結(jié)果
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

不難發(fā)現(xiàn),@EnableDubboConfig 配置 Bean 配合外部化文件 classpath:/META-INF/config.properties,與執(zhí)行輸出內(nèi)容相同。

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

將以下內(nèi)容的外部化配置文件物理路徑為: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 {}
實(shí)現(xiàn)引導(dǎo)類
/*** Dubbo 配置引導(dǎo)類** @author <a href="mailto:mercyblitz@gmail.com">Mercy</a>*/ public class DubboConfigurationBootstrap {public static void main(String[] args) {// 創(chuàng)建配置上下文AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();// 注冊(cè)當(dāng)前配置 Beancontext.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 \n", applicationBean.getName());System.out.printf("applicationBean2.name = %s \n", applicationBean2.getName());System.out.printf("applicationBean3.name = %s \n", applicationBean3.getName());} }
執(zhí)行結(jié)果
applicationBean.name = dubbo-demo-application applicationBean2.name = dubbo-demo-application2 applicationBean3.name = dubbo-demo-application3

@EnableDubboConfig(multiple = true) 執(zhí)行后,運(yùn)行結(jié)果說明ApplicationConfig Bean 以及 ID 的定義方式。

@EnableDubboConfigBinding & @EnableDubboConfigBindings

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

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

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

@EnableDubboConfigBinding 在支持外部化配置屬性與 Dubbo 配置類綁定時(shí),與 Dubbo 過去的映射行為不同,被綁定的 Dubbo 配置類將會(huì)提升為 Spring Bean,無需提前裝配 Dubbo 配置類。同時(shí),支持多 Dubbo 配置Bean 裝配。其 Bean 的綁定規(guī)則與@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<? extends AbstractConfig> type();/*** It indicates whether {@link #prefix()} binding to multiple Spring Beans.** @return the default value is <code>false</code>*/boolean multiple() default false;}
  • prefix() : 指定待綁定 Dubbo 配置類的外部化配置屬性的前綴,比如dubbo.application 為 ApplicationConfig 的外部化配置屬性的前綴。prefix() 支持占位符(Placeholder), 并且其關(guān)聯(lián)前綴值是否以"." 作為結(jié)尾字符是可選的,即prefix() = "dubbo.application" 與 prefix() = "dubbo.application." 效果相同
  • type() : 指定 Dubbo 配置類,所有 AbstractConfig 的實(shí)現(xiàn)子類即可,如ApplicationConfig 、RegistryConfig 以及 ProtocolConfig 等
  • multiple() : 表明是否需要將prefix() 作為多個(gè) type() 類型的 Spring Bean 外部化配置屬性。默認(rèn)值為false,即默認(rèn)支持單個(gè)類型的 Spring 配置 Bean

假設(shè)標(biāo)注 @EnableDubboConfigBinding 的實(shí)現(xiàn)類被 Spring 應(yīng)用上下文掃描并且注冊(cè)后,其中prefix() = dubbo.app 、 type() = ApplicationConfig.class ,且外部配置內(nèi)容為:

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

Spring 應(yīng)用上下文啟動(dòng)后,一個(gè) ID 為 "applicationBean" 的 ApplicationConfig Bean 被初始化,其 name 字段被設(shè)置為 "dubbo-demo-application"。

EnableDubboConfigBindings 定義
public @interface EnableDubboConfigBindings {/*** The value of {@link EnableDubboConfigBindings}** @return non-null*/EnableDubboConfigBinding[] value();}
  • value : 指定多個(gè)EnableDubboConfigBinding,用于實(shí)現(xiàn)外部化配置屬性前綴(prefix) 與 Dubbo 配置 Bean 類型(AbstractConfig 子類)綁定。

示例說明

外部化配置文件

將以下內(nèi)容的外部化配置文件物理路徑為: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 <a href="mailto:mercyblitz@gmail.com">Mercy</a>*/ @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 {}
實(shí)現(xiàn)引導(dǎo)類

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

/*** Dubbo 配置引導(dǎo)類** @author <a href="mailto:mercyblitz@gmail.com">Mercy</a>*/ public class DubboConfigurationBootstrap {public static void main(String[] args) {// 創(chuàng)建配置上下文AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();// 注冊(cè)當(dāng)前配置 Beancontext.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 \n", applicationBean.getName());System.out.printf("applicationBean2.name = %s \n", applicationBean2.getName());System.out.printf("applicationBean3.name = %s \n", applicationBean3.getName());// 獲取 ModuleConfig Bean:"moduleBean"ModuleConfig moduleBean = context.getBean("moduleBean", ModuleConfig.class);System.out.printf("moduleBean.name = %s \n", moduleBean.getName());// 獲取 RegistryConfig BeanRegistryConfig registry = context.getBean(RegistryConfig.class);System.out.printf("registry.address = %s \n", registry.getAddress());} }
運(yùn)行結(jié)果

DubboConfigurationBootstrap 運(yùn)行后控制臺(tái)輸出:

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

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

下篇預(yù)告

《Dubbo 微服務(wù)編程模型》

更多 Dubbo 以及 微服務(wù)相關(guān)內(nèi)容,請(qǐng)關(guān)注小馬哥公眾號(hào):

關(guān)于作者

小馬哥,十余年Java EE 從業(yè)經(jīng)驗(yàn),架構(gòu)師、微服務(wù)布道師、Dubbo 維護(hù)者。目前主要負(fù)責(zé)阿里巴巴集團(tuán)微服務(wù)技術(shù)實(shí)施、架構(gòu)衍進(jìn)、基礎(chǔ)設(shè)施構(gòu)建等。重點(diǎn)關(guān)注云計(jì)算、微服務(wù)以及軟件架構(gòu)等領(lǐng)域。通過SUN Java(SCJP、SCWCD、SCBCD)以及Oracle OCA 等的認(rèn)證。

github:https://github.com/mercyblitz

sf.gg : https://segmentfault.com/u/me...

微信/微博:mercyblitz

總結(jié)

以上是生活随笔為你收集整理的Dubbo 新编程模型之外部化配置的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。