Dubbo 提供多种配置方式,并拥有不同的优先级

XML 配置

provider
  1. <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2. xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
  3. xmlns="http://www.springframework.org/schema/beans"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
  5. http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
  6. <dubbo:application name="demo-provider"/>
  7. <dubbo:registry address="zookeeper://127.0.0.1:2181"/>
  8. <dubbo:protocol name="dubbo" port="20890"/>
  9. <bean id="demoService" class="org.apache.dubbo.samples.basic.impl.DemoServiceImpl"/>
  10. <dubbo:service interface="org.apache.dubbo.samples.basic.api.DemoService" ref="demoService"/>
  11. </beans>

consumer
  1. <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2. xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
  3. xmlns="http://www.springframework.org/schema/beans"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
  5. http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
  6. <dubbo:application name="demo-consumer"/>
  7. <dubbo:registry group="aaa" address="zookeeper://127.0.0.1:2181"/>
  8. <dubbo:reference id="demoService" check="false" interface="org.apache.dubbo.samples.basic.api.DemoService"/>
  9. </beans>
  1. ![image.png](https://cdn.nlark.com/yuque/0/2021/png/191132/1609856142549-c1b16d27-c7a2-4357-a294-166257aedf3b.png#align=left&display=inline&height=456&margin=%5Bobject%20Object%5D&name=image.png&originHeight=456&originWidth=552&size=191179&status=done&style=none&width=552)
标签 用途 解释
服务配置 用于暴露一个服务,定义服务的元信息,一个服务可以用多个协议暴露,一个服务也可以注册到多个注册中心
引用配置 用于创建一个远程服务代理,一个引用可以指向多个注册中心
协议配置 用于配置提供服务的协议信息,协议由提供方指定,消费方被动接受
应用配置 用于配置当前应用信息,不管该应用是提供者还是消费者
模块配置 用于配置当前模块信息,可选
注册中心配置 用于配置连接注册中心相关信息
监控中心配置 用于配置连接监控中心相关信息,可选
提供方配置 当 ProtocolConfig 和 ServiceConfig 某属性没有配置时,采用此缺省值,可选
消费方配置 当 ReferenceConfig 某属性没有配置时,采用此缺省值,可选
方法配置 用于 ServiceConfig 和 ReferenceConfig 指定方法级的配置信息
参数配置 用于指定方法参数配置

不同粒度配置的覆盖关系

以 timeout 为例,下图显示了配置的查找顺序,其它 retries, loadbalance, actives 等类似:

  • 方法级优先,接口级次之,全局配置再次之。
  • 如果级别一样,则消费方优先,提供方次之。

其中,服务提供方配置,通过 URL 经由注册中心传递给消费方。
image.png

配置关联

  • dubbo:service ==> ServiceConfig
  • dubbo:reference ===> ReferenceConfig
  • dubbo:protocol ===> ProtocolConfig
  • dubbo:application ===> ApplicationConfig
  • dubbo:registry ===> RegistryConfig
  • dubbo:provider ===> providerConfig
  • dubbo:consumer ===> ConsumerConfig

这些配置的XML文件最终都会组成一个*Config文件配置. 然后按照上上图中的意图添加默认参数. 进行服务暴露即可/服务引用即可

API 配置

按照XML配置生成*Config的描述,可以直接使用Java Bean的格式来进行引用即可

服务提供者

  1. import org.apache.dubbo.rpc.config.ApplicationConfig;
  2. import org.apache.dubbo.rpc.config.RegistryConfig;
  3. import org.apache.dubbo.rpc.config.ProviderConfig;
  4. import org.apache.dubbo.rpc.config.ServiceConfig;
  5. import com.xxx.XxxService;
  6. import com.xxx.XxxServiceImpl;
  7. // 服务实现
  8. XxxService xxxService = new XxxServiceImpl();
  9. // 当前应用配置
  10. ApplicationConfig application = new ApplicationConfig();
  11. application.setName("xxx");
  12. // 连接注册中心配置
  13. RegistryConfig registry = new RegistryConfig();
  14. registry.setAddress("10.20.130.230:9090");
  15. registry.setUsername("aaa");
  16. registry.setPassword("bbb");
  17. // 服务提供者协议配置
  18. ProtocolConfig protocol = new ProtocolConfig();
  19. protocol.setName("dubbo");
  20. protocol.setPort(12345);
  21. protocol.setThreads(200);
  22. // 注意:ServiceConfig为重对象,内部封装了与注册中心的连接,以及开启服务端口
  23. // 服务提供者暴露服务配置
  24. ServiceConfig<XxxService> service = new ServiceConfig<XxxService>(); // 此实例很重,封装了与注册中心的连接,请自行缓存,否则可能造成内存和连接泄漏
  25. service.setApplication(application);
  26. service.setRegistry(registry); // 多个注册中心可以用setRegistries()
  27. service.setProtocol(protocol); // 多个协议可以用setProtocols()
  28. service.setInterface(XxxService.class);
  29. service.setRef(xxxService);
  30. service.setVersion("1.0.0");
  31. // 暴露及注册服务
  32. service.export();

服务消费者

  1. import org.apache.dubbo.rpc.config.ApplicationConfig;
  2. import org.apache.dubbo.rpc.config.RegistryConfig;
  3. import org.apache.dubbo.rpc.config.ConsumerConfig;
  4. import org.apache.dubbo.rpc.config.ReferenceConfig;
  5. import com.xxx.XxxService;
  6. // 当前应用配置
  7. ApplicationConfig application = new ApplicationConfig();
  8. application.setName("yyy");
  9. // 连接注册中心配置
  10. RegistryConfig registry = new RegistryConfig();
  11. registry.setAddress("10.20.130.230:9090");
  12. registry.setUsername("aaa");
  13. registry.setPassword("bbb");
  14. // 注意:ReferenceConfig为重对象,内部封装了与注册中心的连接,以及与服务提供方的连接
  15. // 引用远程服务
  16. ReferenceConfig<XxxService> reference = new ReferenceConfig<XxxService>(); // 此实例很重,封装了与注册中心的连接以及与提供者的连接,请自行缓存,否则可能造成内存和连接泄漏
  17. reference.setApplication(application);
  18. reference.setRegistry(registry); // 多个注册中心可以用setRegistries()
  19. reference.setInterface(XxxService.class);
  20. reference.setVersion("1.0.0");
  21. // 和本地bean一样使用xxxService
  22. XxxService xxxService = reference.get(); // 注意:此代理对象内部封装了所有通讯细节,对象较重,请缓存复用

点对点直连

  1. ...
  2. ReferenceConfig<XxxService> reference = new ReferenceConfig<XxxService>(); // 此实例很重,封装了与注册中心的连接以及与提供者的连接,请自行缓存,否则可能造成内存和连接泄漏
  3. // 如果点对点直连,可以用reference.setUrl()指定目标地址,设置url后将绕过注册中心,
  4. // 其中,协议对应provider.setProtocol()的值,端口对应provider.setPort()的值,
  5. // 路径对应service.setPath()的值,如果未设置path,缺省path为接口名
  6. reference.setUrl("dubbo://10.20.130.230:20880/com.xxx.XxxService");
  7. ...

注解配置

需要 2.6.3 及以上版本支持。 点此查看 https://github.com/apache/dubbo-samples/tree/master/java/dubbo-samples-annotation

服务提供方

Service 注解暴露服务
  1. @Service
  2. public class AnnotationServiceImpl implements AnnotationService {
  3. @Override
  4. public String sayHello(String name) {
  5. return "annotation: hello, " + name;
  6. }
  7. }

增加应用共享配置
  1. # dubbo-provider.properties
  2. dubbo.application.name=annotation-provider
  3. dubbo.registry.address=zookeeper://127.0.0.1:2181
  4. dubbo.protocol.name=dubbo
  5. dubbo.protocol.port=20880

指定Spring扫描路径
  1. @Configuration
  2. @EnableDubbo(scanBasePackages = "org.apache.dubbo.samples.simple.annotation.impl")
  3. @PropertySource("classpath:/spring/dubbo-provider.properties")
  4. static public class ProviderConfiguration {
  5. }

服务消费方

Reference注解引用服务
  1. @Component("annotationAction")
  2. public class AnnotationAction {
  3. @Reference
  4. private AnnotationService annotationService;
  5. public String doSayHello(String name) {
  6. return annotationService.sayHello(name);
  7. }
  8. }