1 xml配置

1.1 provider.xml示例

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
  6. <dubbo:application name="hello-world-app" />
  7. <dubbo:registry address="multicast://224.5.6.7:1234" />
  8. <dubbo:protocol name="dubbo" port="20880" />
  9. <dubbo:service interface="com.alibaba.dubbo.demo.DemoService" ref="demoServiceLocal" />
  10. <dubbo:reference id="demoServiceRemote" interface="com.alibaba.dubbo.demo.DemoService" />
  11. </beans>

所有标签都支持自定义参数,用于不同扩展点实现的特殊配置,如:

  1. <dubbo:protocol name="jms">
  2. <dubbo:parameter key="queue" value="your_queue" />
  3. </dubbo:protocol>
  4. <dubbo:protocol name="jms" p:queue="your_queue" />

1.2 配置说明

标签 用途 解释
应用配置 用于配置当前应用信息,不管该应用是提供者还是消费者
模块配置 用于配置当前模块信息,可选
注册中心配置 用于配置连接注册中心相关信息
服务配置 用于暴露一个服务,定义服务的元信息,一个服务可以用多个协议暴露,一个服务也可以注册到多个注册中心
引用配置 用于创建一个远程服务代理,一个引用可以指向多个注册中心
提供方配置 当 ProtocolConfig 和 ServiceConfig 某属性没有配置时,采用此缺省值,可选
消费方配置 当 ReferenceConfig 某属性没有配置时,采用此缺省值,可选
协议配置 用于配置提供服务的协议信息,协议由提供方指定,消费方被动接受
监控中心配置 用于配置连接监控中心相关信息,可选
方法配置 用于 ServiceConfig 和 ReferenceConfig 指定方法级的配置信息
参数配置 用于指定方法参数配置

1.3 配置覆盖关系

  • 方法级优先,接口级次之,全局配置再次之。
  • 如果级别一样,则消费方优先,提供方次之。其中,服务提供方配置,通过 URL 经由注册中心传递给消费方。

Dubbo 配置 - 图1
建议由服务提供方设置超时,因为一个方法需要执行多长时间,服务提供方更清楚,如果一个消费方同时引用多个服务,就不需要关心每个服务的超时设置。

2 属性配置

如果公共配置很简单,没有多注册中心,多协议等情况,或者想多个 Spring 容器想共享配置,可以使用 dubbo.properties 作为缺省配置。Dubbo 将自动加载 classpath 根目录下的 dubbo.properties,可以通过JVM启动参数-Ddubbo.properties.file=xxx.properties改变缺省配置位置。

2.1 映射规则

将 XML 配置的标签名,加属性名,用点分隔,多个属性拆成多行,如下所示:

  1. dubbo.application.name=foo
  2. dubbo.application.owner=bar
  3. dubbo.registry.address=10.20.153.10:9090

2.2 覆盖策略

Dubbo 配置 - 图2

  1. JVM 启动 -D 参数优先,这样可以使用户在部署和启动时进行参数重写,比如在启动时需改变协议的端口。
  2. XML 次之,如果在 XML 中有配置,则 dubbo.properties 中的相应配置项无效。
  3. Properties 最后,相当于缺省值,只有 XML 没有配置时,dubbo.properties 的相应配置项才会生效,通常用于共享公共配置,比如应用名。
    • 如果 classpath 根目录下存在多个 dubbo.properties,比如多个 jar 包中有 dubbo.properties,Dubbo 会任意加载,并打印 Error 日志,后续可能改为抛异常。
    • 协议的 id 没配时,缺省使用协议名作为 id

3 API配置

API 属性与配置项一对一,各属性含义,比如:ApplicationConfig.setName("xxx")对应<dubbo:application name="xxx" />

3.1 服务提供者

  1. import com.alibaba.dubbo.rpc.config.ApplicationConfig;
  2. import com.alibaba.dubbo.rpc.config.RegistryConfig;
  3. import com.alibaba.dubbo.rpc.config.ProviderConfig;
  4. import com.alibaba.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();

3.2 服务消费者

  1. import com.alibaba.dubbo.rpc.config.ApplicationConfig;
  2. import com.alibaba.dubbo.rpc.config.RegistryConfig;
  3. import com.alibaba.dubbo.rpc.config.ConsumerConfig;
  4. import com.alibaba.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(); // 注意:此代理对象内部封装了所有通讯细节,对象较重,请缓存复用

3.3 方法级别配置

  1. ...
  2. // 方法级配置
  3. List<MethodConfig> methods = new ArrayList<MethodConfig>();
  4. MethodConfig method = new MethodConfig();
  5. method.setName("createXxx");
  6. method.setTimeout(10000);
  7. method.setRetries(0);
  8. methods.add(method);
  9. // 引用远程服务
  10. ReferenceConfig<XxxService> reference = new ReferenceConfig<XxxService>(); // 此实例很重,封装了与注册中心的连接以及与提供者的连接,请自行缓存,否则可能造成内存和连接泄漏
  11. ...
  12. reference.setMethods(methods); // 设置方法级配置
  13. ...

3.4 点对点直连

  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. ...

3.5 API配置参考手册

  1. // 配置 API
  2. com.alibaba.dubbo.config.ServiceConfig
  3. com.alibaba.dubbo.config.ReferenceConfig
  4. com.alibaba.dubbo.config.ProtocolConfig
  5. com.alibaba.dubbo.config.RegistryConfig
  6. com.alibaba.dubbo.config.MonitorConfig
  7. com.alibaba.dubbo.config.ApplicationConfig
  8. com.alibaba.dubbo.config.ModuleConfig
  9. com.alibaba.dubbo.config.ProviderConfig
  10. com.alibaba.dubbo.config.ConsumerConfig
  11. com.alibaba.dubbo.config.MethodConfig
  12. com.alibaba.dubbo.config.ArgumentConfig
  13. // 注解 API
  14. com.alibaba.dubbo.config.annotation.Service
  15. com.alibaba.dubbo.config.annotation.Reference
  16. // 模型 API
  17. com.alibaba.dubbo.common.URL
  18. com.alibaba.dubbo.rpc.RpcException
  19. // 上下文 API
  20. com.alibaba.dubbo.rpc.RpcContext
  21. // 服务API
  22. com.alibaba.dubbo.rpc.service.GenericService
  23. com.alibaba.dubbo.rpc.service.GenericException
  24. alibaba.dubbo.rpc.service.EchoService

API使用范围说明:API 仅用于 OpenAPI, ESB, Test, Mock 等系统集成,普通服务提供方或消费方,请采用XML 配置方式使用 Dubbo

4 注解配置

4.1 服务提供者

4.1.1 Service注解暴露服务

  1. @Service(timeout = 5000)
  2. public class AnnotateServiceImpl implements AnnotateService {
  3. // ...
  4. }

4.1.2 javaConfig形式配置公共模块

  1. @Configuration
  2. public class DubboConfiguration {
  3. @Bean
  4. public ApplicationConfig applicationConfig() {
  5. ApplicationConfig applicationConfig = new ApplicationConfig();
  6. applicationConfig.setName("provider-test");
  7. return applicationConfig;
  8. }
  9. @Bean
  10. public RegistryConfig registryConfig() {
  11. RegistryConfig registryConfig = new RegistryConfig();
  12. registryConfig.setAddress("zookeeper://127.0.0.1:2181");
  13. registryConfig.setClient("curator");
  14. return registryConfig;
  15. }
  16. }

4.1.3 指定dubbo扫描路径

  1. @SpringBootApplication
  2. @DubboComponentScan(basePackages = "com.alibaba.dubbo.test.service.impl")
  3. public class ProviderTestApp {
  4. // ...
  5. }

4.2 服务消费者

4.2.1 Reference注解引用服务

  1. public class AnnotationConsumeService {
  2. @com.alibaba.dubbo.config.annotation.Reference
  3. public AnnotateService annotateService;
  4. // ...
  5. }

4.2.2 javaConfig形式配置公共模块

  1. @Configuration
  2. public class DubboConfiguration {
  3. @Bean
  4. public ApplicationConfig applicationConfig() {
  5. ApplicationConfig applicationConfig = new ApplicationConfig();
  6. applicationConfig.setName("consumer-test");
  7. return applicationConfig;
  8. }
  9. @Bean
  10. public ConsumerConfig consumerConfig() {
  11. ConsumerConfig consumerConfig = new ConsumerConfig();
  12. consumerConfig.setTimeout(3000);
  13. return consumerConfig;
  14. }
  15. @Bean
  16. public RegistryConfig registryConfig() {
  17. RegistryConfig registryConfig = new RegistryConfig();
  18. registryConfig.setAddress("zookeeper://127.0.0.1:2181");
  19. registryConfig.setClient("curator");
  20. return registryConfig;
  21. }
  22. }

4.2.3 指定dubbo扫描路径

  1. @SpringBootApplication
  2. @DubboComponentScan(basePackages = "com.alibaba.dubbo.test.service")
  3. public class ConsumerTestApp {
  4. // ...
  5. }