应用启动阶段,Dubbo框架如何将所需要的配置采集起来(包括应用配置、注册中心配置、服务配置等),以完成服务的暴露和引用流程。
根据驱动方式的不同(比如Spring或裸API编程)配置形式上肯定会有所差异,具体请参考XML配置、Annotation配置、API配置三篇文档。除了外围驱动方式上的差异,Dubbo的配置读取总体上遵循了以下几个原则:
- 支持多层级配置,按照预定的优先级进行层层覆盖,最终将采集的配置汇总到总线URL中,供后续服务暴露和服务引用所使用
- ApplicationConfig、ServiceConfig、ReferenceConfig 可以被理解成配置来源的一种,是直接面向用户编程的配置采集方式。
- 配置格式以 Properties 为主,在配置内容上遵循约定的
path-based的命名规范
配置来源
首先,从Dubbo支持的配置来源说起,默认有四种配置来源:
- JVM System Properties,-D 参数
- Externalized Configuration,外部化配置
- ServiceConfig、ReferenceConfig 等编程接口采集的配置
- 本地配置文件 dubbo.properties
JVM >> Externalized Configuration >> 用户编程 >> 本地配置文件
配置格式
目前Dubbo支持的所有格式都是 .properties 形式的,包括-D、Externalized Configuration等,.properties中的所有配置项遵循一种path-based的配置格式
# 应用级别dubbo.{config-type}[.{config-id}].{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.{config-type}s.{config-id}.{config-item}={config-item-value}
应用级别
dubbo.application.name=demo-providerdubbo.registry.address=zookeeper://127.0.0.1:2181dubbo.protocol.port=-1
服务级别
dubbo.service.org.apache.dubbo.samples.api.DemoService.timeout=5000dubbo.reference.org.apache.dubbo.samples.api.DemoService.timeout=6000dubbo.reference.org.apache.dubbo.samples.api.DemoService.sayHello.timeout=7000dubbo.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=8089
多配置项
dubbo.application.parameters.item1=value1dubbo.application.parameters.item2=value2dubbo.registry.parameters.item3=value3dubbo.reference.org.apache.dubbo.samples.api.DemoService.parameters.item4=value4
启动应用
XML
<!-- 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"/>
注解
## dubbo.propertiesdubbo.application.name=annotation-providerdubbo.registry.address=zookeeper://127.0.0.1:2181dubbo.protocol.name=dubbodubbo.protocol.port=20880
// AnnotationService服务实现@Servicepublic class AnnotationServiceImpl implements AnnotationService {@Overridepublic String sayHello(String name) {System.out.println("async provider received: " + name);return "annotation: hello, " + name;}}
SpringBoot
## application.properties# Spring boot applicationspring.application.name=dubbo-externalized-configuration-provider-sample# Base packages to scan Dubbo Component: @com.alibaba.dubbo.config.annotation.Servicedubbo.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 Protocoldubbo.protocol.name=dubbodubbo.protocol.port=12345## Dubbo Registrydubbo.registry.address=N/A## DemoService versiondemo.service.version=1.0.0
API
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();}
