此文档已经不再维护。您当前查看的是快照版本。如果想要查看最新版本的文档,请参阅最新版本。
本文主要介绍Dubbo配置概况,包括配置组件、配置来源、配置方式及配置加载流程。
Dubbo框架的配置项比较繁多,为了更好地管理各种配置,将其按照用途划分为不同的组件,最终所有配置项都会汇聚到URL中,传递给后续处理模块。
常用配置组件如下:
reference可以指定具体的consumer,如果没有指定consumer则会自动使用全局默认的consumer配置。
consumer的属性是reference属性的默认值,可以体现在两个地方:
可以将consumer组件理解为reference组件的虚拟分组,根据需要可以定义多个不同的consumer,不同的consumer设置特定的默认值, 然后在reference中指定consumer或者将<dubbo:reference /> 标签嵌套在<dubbo:consumer />标签之中。
service可以指定具体的provider,如果没有指定则会自动使用全局默认的provider配置。 provider的属性是service属性的默认值,覆盖规则类似上面的consumer与reference,也可以将provider理解为service的虚拟分组。
从Dubbo支持的配置来源说起,默认有6种配置来源:
下图展示了配置覆盖关系的优先级,从上到下优先级依次降低:
请参考相关内容:属性覆盖。
按照驱动方式可以分为以下四种方式:
以Java编码的方式组织配置,包括Raw API和Bootstrap API,具体请参考API配置。
以XML方式配置各种组件,支持与Spring无缝集成,具体请参考XML配置。
以注解方式暴露服务和引用服务接口,支持与Spring无缝集成,具体请参考Annotation配置。
根据属性Key-value生成配置组件,类似SpringBoot的ConfigurationProperties,具体请参考属性配置。
属性配置的另外一个重要的功能特性是属性覆盖,使用外部属性的值覆盖已创建的配置组件属性。
如果要将属性配置放到外部的配置中心,请参考外部化配置。
除了外围驱动方式上的差异,Dubbo的配置读取总体上遵循了以下几个原则:
path-based
的命名规范从上图可以看出,配置加载大概分为两个阶段:
接下来,我们看一下选择不同的开发方式时,对应到 ServiceConfig、ReferenceConfig 等编程接口采集的配置的变化。
参见示例
<!-- dubbo-provier.xml -->
<dubbo:application name="demo-provider"/>
<dubbo:config-center address="zookeeper://127.0.0.1:2181"/>
<dubbo:registry address="zookeeper://127.0.0.1:2181" simplified="true"/>
<dubbo:metadata-report address="redis://127.0.0.1:6379"/>
<dubbo:protocol name="dubbo" port="20880"/>
<bean id="demoService" class="org.apache.dubbo.samples.basic.impl.DemoServiceImpl"/>
<dubbo:service interface="org.apache.dubbo.samples.basic.api.DemoService" ref="demoService"/>
参见示例
// AnnotationService服务实现
@Service
public class AnnotationServiceImpl implements AnnotationService {
@Override
public String sayHello(String name) {
System.out.println("async provider received: " + name);
return "annotation: hello, " + name;
}
}
## dubbo.properties
dubbo.application.name=annotation-provider
dubbo.registry.address=zookeeper://127.0.0.1:2181
dubbo.protocol.name=dubbo
dubbo.protocol.port=20880
参见示例
## application.properties
# Spring boot application
spring.application.name=dubbo-externalized-configuration-provider-sample
# Base packages to scan Dubbo Component: @com.alibaba.dubbo.config.annotation.Service
dubbo.scan.base-packages=com.alibaba.boot.dubbo.demo.provider.service
# Dubbo Application
## The default value of dubbo.application.name is ${spring.application.name}
## dubbo.application.name=${spring.application.name}
# Dubbo Protocol
dubbo.protocol.name=dubbo
dubbo.protocol.port=12345
## Dubbo Registry
dubbo.registry.address=N/A
## DemoService version
demo.service.version=1.0.0
参考示例
public static void main(String[] args) throws IOException {
ServiceConfig<GreetingsService> service = new ServiceConfig<>();
service.setApplication(new ApplicationConfig("first-dubbo-provider"));
service.setRegistry(new RegistryConfig("multicast://224.5.6.7:1234"));
service.setInterface(GreetingsService.class);
service.setRef(new GreetingsServiceImpl());
service.export();
System.out.println("first-dubbo-provider is running.");
System.in.read();
}