以下是Dubbo属性配置示例dubbo-spring-boot-samples##application.properties#Springbootapplicationspring.application.name=dubbo-externalized-configuration-provider-sample#扫描Dubbo组件的基础包:@com.alibaba.dubbo.config.annotation.Servicedubbo.scan.base-packages=com.alibaba.boot.dubbo.demo.provider.service#Dubbo应用##dubbo.application.name默认值为${spring.application.name}##dubbo.application.name=${spring.application.name}#DubboProtocoldubbo.protocol.name=dubbodubbo.protocol.port=12345##DubboRegistrydubbo.registry.address=N/A##servicedefaultversiondubbo.provider.version=1.0.0接下来我们将重点关注这个例子,从三个方面对Dubbo进行配置:配置格式,配置源,和loadingprocess的原理进行了分析。1配置格式目前Dubbo支持的所有配置都是.properties格式,包括-D、ExternalizedConfiguration等。.properties中的所有配置项都遵循基于路径的配置格式。在Spring应用中,属性配置也可以放在application.yml中,树状层次结构更具可读性。#应用级配置(无id)dubbo.{config-type}.{config-item}={config-item-value}#实例级配置(指定id或名称)dubbo.{config-type}s.{config-id}.{config-item}={config-item-value}dubbo.{config-type}s.{config-name}.{config-item}={config-item-value}#服务接口配置dubbo.service.{interface-name}.{config-item}={config-item-value}dubbo.reference.{interface-name}.{config-item}={config-item-value}#配置dubbo的方法.service.{interface-name}.{method-name}.{config-item}={config-item-value}dubbo.reference.{interface-name}.{method-name}.{config-item}={config-item-value}#方法参数配置dubbo.reference.{interface-name}.{method-name}.{argument-index}.{config-item}={config-item-value}1.1应用级配置(无id)应用级配置的格式为:配置类型单数前缀,无id/name。#应用级配置(无id)dubbo.{config-type}.{config-item}={config-item-value}和application类似,monitor,metrics等都是应用级组件,所以只需要一个允许配置单实例;协议、注册表等允许配置多个组件。当只需要单例配置时,可以使用本节描述的格式。一个常见的例子如下:dubbo.application.name=demo-providerdubbo.application.qos-enable=falsedubbo.registry.address=zookeeper://127.0.0.1:2181dubbo.protocol.name=dubbodubbo.protocol.port=-11.2实例级配置(指定id或name)实例的属性配置,需要指定id或name,前缀格式为:配置类型复数前缀+id/name。适用于协议、注册中心等支持多实例配置的组件。#实例级配置(指定id或name)dubbo.{config-type}s.{config-id}.{config-item}={config-item-value}dubbo.{config-type}s.{config-name}.{config-item}={config-item-value}如果没有id或name的实例,框架将根据此处列出的属性创建一个配置组件实例。如果已经存在同id或同名的实例,框架会使用这里列出的属性作为对已有实例配置的补充。详情请参考属性覆盖。具体配置复数形式请参考单复数配置对照表的配置示例:dubbo.registries.unit1.address=zookeeper://127.0.0.1:2181dubbo.registries.unit2.address=zookeeper://127.0。0.1:2182dubbo.protocols.dubbo.name=dubbodubbo.protocols.dubbo.port=20880dubbo.protocols.hessian.name=hessiandubbo.protocols.hessian.port=80891.3服务接口配置dubbo.service.org.apache.dubbo.samples。api.DemoService.timeout=5000dubbo.reference.org.apache.dubbo.samples.api.DemoService.timeout=6000方法配置方法配置格式:#方法配置dubbo.service.{interface-name}.{method-name}。{config-item}={config-item-value}dubbo.reference.{interface-name}.{method-name}.{config-item}={config-item-value}#方法参数配置dubbo.reference.{interface-name}.{method-name}.{argument-index}.{config-item}={config-item-value}方法配置示例:dubbo.reference.org.apache.dubbo.samples.api.DemoService.sayHello.timeout=7000dubbo.reference.org.apache.dubbo.samples.api.DemoService.sayHello.oninvoke=notifyService.onInvokedubbo.reference.org.apache.dubbo.samples.api.DemoService.sayHello.onreturn=notifyService.onReturndubbo.reference.org.apache.dubbo.samples.api.DemoService.sayHello.onthrow=notifyService.onThrowdubbo.reference.org.apache.dubbo.samples.api.DemoService.sayHello.0.callback=true等同于XML配置:
dubbo.applications.{name}.xxx=xxxprotocoldubbo.protocol.xxx=xxxdubbo.protocols.{id}.xxx=xxx
dubbo.protocols.{name}.xxx=xxxmoduledubbo.module.xxx=xxxdubbo.modules.{id}.xxx=xxx
/>dubbo.modules.{name}.xxx=xxxregistrydubbo.registry.xxx=xxxdubbo.registries.{id}.xxx=xxxmonitordubbo.monitor.xxx=xxxdubbo.monitors.{id}.xxx=xxxconfig-centerdubbo.config-center.xxx=xxxdubbo。配置中心。{id}.xxx=xxxmetadata-reportdubbo.metadata-report.xxx=xxxdubbo.metadata-reports.{id}.xxx=xxxsldubbo.ssl.xxx=xxxdubbo.ssls.{id}.xxx=xxxmetricsdubbo.metrics.xxx=xxxdubbo.metrics.{id}.xxx=xxxproviderdubbo.provider.xxx=xxxdubbo.providers.{id}.xxx=xxxconsumerdubbo.consumer.xxx=xxxdubbo.consumers.{id}.xxx=servicedubbo.service.{interfaceName}.xxx=xxx无引用{methodName}.xxx=xxxnoargumentdubbo.service.{interfaceName}.{methodName}.{arg-index}.xxx=xxxno2个配置源Dubbo默认支持6个配置源:JVMSystemProperties,JVM-DparameterSystemenvironment,JVM进程的环境变量ExternalizedConfiguration,外部化配置,从配置中心读取ApplicationConfiguration,应用属性配置,从Spring应用环境中提取dubbo开头的属性集,收集API/XML/注解和其他编程接口Configuration可以理解为一类配置源,是一种直接面向用户编程的配置获取方式。配置文件dubbo.properties是从类路径中读取的。关于dubbo.properties属性:如果classpath下有多个dubbo.properties文件,比如有两个,每个jar包都包含dubbo.properties,dubbo会随机选择一个加载,并打印错误日志Dubbo可以自动加载classpath根目录下的dubbo.properties,也可以使用JVM参数指定路径:-Ddubbo.properties.file=xxx.properties。2.1覆盖关系如果通过多个配置源指定同一个配置项,配置项之间会相互重叠。具体承保关系和优先级见下一节。3配置加载过程3.1处理过程Dubbo配置加载大致分为两个阶段:第一阶段在DubboBootstrap初始化之前,在Spring上下文启动或执行API配置代码创建时解析处理XML配置/注解配置/Java-config配置bean并添加到ConfigManager。第二阶段是DubboBootstrap的初始化过程,从配置中心读取外部配置,依次进行实例级属性配置和应用级属性配置,最后刷新所有配置实例的属性,即属性覆盖.3.2属性覆盖属性覆盖可能有两种情况,两种可能同时发生:不同的配置源配置了相同的配置项,配置了相同的配置源,但是指定了相同的配置项不同级别3.2.1不同配置源3.2.1同源配置属性覆盖是指用配置的属性值覆盖configbean实例的属性,类似于SpringPropertyOverrideConfigurer的作用。在应用程序上下文定义中覆盖bean属性值的属性资源配置器。它将属性文件中的值推送到bean定义中。配置行应该是这样的形式:beanName.property=value但是和PropertyOverrideConfigurer不同的是,Dubbo的属性覆盖有多种匹配格式,优先级从高到低是:#1。指定id的实例级配置dubbo.{config-type}s.{config-id}.{config-item}={config-item-value}#2。指定名称的实例级配置dubbo.{config-type}s.{config-name}.{config-item}={config-item-value}#3.应用级配置(单数配置)dubbo.{config-type}.{config-item}={config-item-value}属性覆盖处理流程:按照优先级从高到低的顺序查找,如果找到一个属性开始有这个前缀的,选择Usethisprefixtoextractproperties,忽略后面的配置。3.3外化配置外化配置的目的之一是实现集中的配置管理。这部分行业已经有很多成熟的专业配置系统,比如Apollo、Nacos等,Dubbo做的主要是保证这些系统能够正常工作。外部配置和其他本地配置在内容和格式上没有区别。可以简单理解为dubbo.properties的外部存储。配置中心更适合抽取一些公共的配置,比如注册中心、元数据中心的配置进行集中管理。#注册中心地址、元数据中心地址等配置集中管理,实现环境统一,减少开发端感知。dubbo.registry.address=zookeeper://127.0.0.1:2181dubbo.registry.simplified=truedubbo.metadata-report.address=zookeeper://127.0.0.1:2181dubbo.protocol.name=dubbodubbo.protocol.port=20880dubbo。application.qos.port=33333Priority外部配置默认优先于本地配置,所以这里配置的内容会覆盖本地配置值。各配置形式之间的覆盖关系单独一章。范围外部化配置有两个级别:全局和应用程序。全局配置为所有应用共享,应用级配置由各个应用维护,仅对自身可见。目前支持的扩展包括Zookeeper、Apollo和Nacos。3.3.1外部配置使用添加config-center配置
