配置不是研究Dubbo代码的重点,多协议、RPC、容错等才是Dubbo的重要内容,但是配置是基础,是将这些内容串起来的线,如果不梳理一下,不易形成完整的体系。而且很多配置的内容也是我们在实际工作中经常要用到的,所以就简单捋一捋配置吧。
1.配置的种类
根据驱动方式的不同(比如Spring或裸API编程)配置形式上肯定会有所差异,具体包括XML配置、Annotation配置、API配置三种。除了外围驱动方式上的差异,Dubbo的配置读取总体上遵循了以下几个原则:
- Dubbo 支持了多层级的配置,并按预定优先级自动实现配置间的覆盖,最终所有配置汇总到URL后驱动后续的服务暴露、引用等流程。
- ApplicationConfig、ServiceConfig、ReferenceConfig 可以被理解成配置来源的一种,是直接面向用户编程的配置采集方式。分别表示什么
- 配置格式以 Properties 为主,在配置内容上遵循约定的 path-based 的命名规范。
看例子:
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"/>
注解格式:
@DubboService
public class AnnotationServiceImpl implements AnnotationService {
@Override
public String sayHello(String name) {
System.out.println("async provider received: " + name);
return "annotation: hello, " + name;
}
}
properties格式,这个本质上和xml是一样的:
dubbo.application.name=annotation-provider
dubbo.registry.address=zookeeper://127.0.0.1:2181
dubbo.protocol.name=dubbo
dubbo.protocol.port=20880
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();
}
2配置的来源和优先顺序
配置的来源,默认有四种配置来源:
- JVM System Properties,也就是执行的时候通过"-D" 参数添加的
- Externalized Configuration,外部化配置,也就是放在配置中心的配置
- ServiceConfig、ReferenceConfig 等编程接口采集的配置,ServiceConfig主要针对服务提供者,ReferenceConfig主要针对服务消费者
- 本地配置文件 dubbo.properties
如果上述几种都存在,该选择谁呢?上述四种Dubbo的优先级别是依次递减的,官网的图关系为:
3 配置的格式
这个是官网的名字,就是配置文件类型的意思。
目前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-provider
dubbo.registry.address=zookeeper://127.0.0.1:2181
dubbo.protocol.port=-1
服务级别:
dubbo.service.org.apache.dubbo.samples.api.DemoService.timeout=5000
dubbo.reference.org.apache.dubbo.samples.api.DemoService.timeout=6000
dubbo.reference.org.apache.dubbo.samples.api.DemoService.sayHello.timeout=7000
多配置项(同时配置多个注册中心)
dubbo.registries.unit1.address=zookeeper://127.0.0.1:2181
dubbo.registries.unit2.address=zookeeper://127.0.0.1:2182
dubbo.protocols.dubbo.name=dubbo
dubbo.protocols.dubbo.port=20880
dubbo.protocols.hessian.name=hessian
dubbo.protocols.hessian.port=8089
4 外部配置
外部化配置目的之一是实现配置的集中式管理,这部分业界已经有很多成熟的专业配置系统如 Apollo, Nacos 等,Dubbo 所做的主要是保证能配合这些系统正常工作。 下面以zookeeper为例进行说明:
配置方法为;
<dubbo:config-center address="zookeeper://127.0.0.1:2181"/>
或者:
dubbo.config-center.address=zookeeper://127.0.0.1:2181
或者
ConfigCenterConfig configCenter = new ConfigCenterConfig();
configCenter.setAddress("zookeeper://127.0.0.1:2181");
外部化配置和其他本地配置在内容和格式上并无区别,可以简单理解为 dubbo.properties 的外部化存储,配置中心更适合将一些公共配置如注册中心、元数据中心配置等抽取以便做集中管理。
需要注意的不是,不是什么都可以放在配置中心的,dubbo协议和端口号等信息最好放在本地文件里,否则会导致服务无法启动
dubbo.registry.address=zookeeper://127.0.0.1:2181
dubbo.registry.simplified=true
dubbo.metadata-report.address=zookeeper://127.0.0.1:2181
dubbo.protocol.name=dubbo
dubbo.protocol.port=20880
dubbo.application.qos.port=33333
其他更配置的详细信息:
https://dubbo.apache.org/zh/docs/v2.7/user/references/xml/dubbo-config-center/