API 配置

以API 配置的方式来配置你的 Dubbo 应用

通过API编码方式组装配置,启动Dubbo,发布及订阅服务。此方式可以支持动态创建ReferenceConfig/ServiceConfig,结合泛化调用可以满足API Gateway或测试平台的需要。

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

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

参考API示例

服务提供者

通过ServiceConfig暴露服务接口,发布服务接口到注册中心。

注意:为了更好支持Dubbo3的应用级服务发现,推荐使用新的DubboBootstrap API。

  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.DemoService;
  6. import com.xxx.DemoServiceImpl;
  7. public class DemoProvider {
  8. public static void main(String[] args) {
  9. // 服务实现
  10. DemoService demoService = new DemoServiceImpl();
  11. // 当前应用配置
  12. ApplicationConfig application = new ApplicationConfig();
  13. application.setName("demo-provider");
  14. // 连接注册中心配置
  15. RegistryConfig registry = new RegistryConfig();
  16. registry.setAddress("zookeeper://10.20.130.230:2181");
  17. // 服务提供者协议配置
  18. ProtocolConfig protocol = new ProtocolConfig();
  19. protocol.setName("dubbo");
  20. protocol.setPort(12345);
  21. protocol.setThreads(200);
  22. // 注意:ServiceConfig为重对象,内部封装了与注册中心的连接,以及开启服务端口
  23. // 服务提供者暴露服务配置
  24. ServiceConfig<DemoService> service = new ServiceConfig<DemoService>(); // 此实例很重,封装了与注册中心的连接,请自行缓存,否则可能造成内存和连接泄漏
  25. service.setApplication(application);
  26. service.setRegistry(registry); // 多个注册中心可以用setRegistries()
  27. service.setProtocol(protocol); // 多个协议可以用setProtocols()
  28. service.setInterface(DemoService.class);
  29. service.setRef(demoService);
  30. service.setVersion("1.0.0");
  31. // 暴露及注册服务
  32. service.export();
  33. // 挂起等待(防止进程退出)
  34. System.in.read();
  35. }
  36. }

服务消费者

通过ReferenceConfig引用远程服务,从注册中心订阅服务接口。

注意:为了更好支持Dubbo3的应用级服务发现,推荐使用新的DubboBootstrap API。

  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.DemoService;
  6. public class DemoConsumer {
  7. public static void main(String[] args) {
  8. // 当前应用配置
  9. ApplicationConfig application = new ApplicationConfig();
  10. application.setName("demo-consumer");
  11. // 连接注册中心配置
  12. RegistryConfig registry = new RegistryConfig();
  13. registry.setAddress("zookeeper://10.20.130.230:2181");
  14. // 注意:ReferenceConfig为重对象,内部封装了与注册中心的连接,以及与服务提供方的连接
  15. // 引用远程服务
  16. ReferenceConfig<DemoService> reference = new ReferenceConfig<DemoService>(); // 此实例很重,封装了与注册中心的连接以及与提供者的连接,请自行缓存,否则可能造成内存和连接泄漏
  17. reference.setApplication(application);
  18. reference.setRegistry(registry); // 多个注册中心可以用setRegistries()
  19. reference.setInterface(DemoService.class);
  20. reference.setVersion("1.0.0");
  21. // 和本地bean一样使用demoService
  22. // 注意:此代理对象内部封装了所有通讯细节,对象较重,请缓存复用
  23. DemoService demoService = reference.get();
  24. demoService.sayHello("Dubbo");
  25. }
  26. }

Bootstrap API

通过DubboBootstrap API可以减少重复配置,更好控制启动过程,支持批量发布/订阅服务接口,还可以更好支持Dubbo3的应用级服务发现。

  1. import org.apache.dubbo.config.bootstrap.DubboBootstrap;
  2. import org.apache.dubbo.rpc.config.ApplicationConfig;
  3. import org.apache.dubbo.rpc.config.RegistryConfig;
  4. import org.apache.dubbo.rpc.config.ProviderConfig;
  5. import org.apache.dubbo.rpc.config.ServiceConfig;
  6. import com.xxx.DemoService;
  7. import com.xxx.DemoServiceImpl;
  8. public class DemoProvider {
  9. public static void main(String[] args) {
  10. ConfigCenterConfig configCenter = new ConfigCenterConfig();
  11. configCenter.setAddress("zookeeper://127.0.0.1:2181");
  12. // 服务提供者协议配置
  13. ProtocolConfig protocol = new ProtocolConfig();
  14. protocol.setName("dubbo");
  15. protocol.setPort(12345);
  16. protocol.setThreads(200);
  17. // 注意:ServiceConfig为重对象,内部封装了与注册中心的连接,以及开启服务端口
  18. // 服务提供者暴露服务配置
  19. ServiceConfig<DemoService> demoServiceConfig = new ServiceConfig<>();
  20. demoServiceConfig.setInterface(DemoService.class);
  21. demoServiceConfig.setRef(new DemoServiceImpl());
  22. demoServiceConfig.setVersion("1.0.0");
  23. // 第二个服务配置
  24. ServiceConfig<FooService> fooServiceConfig = new ServiceConfig<>();
  25. fooServiceConfig.setInterface(FooService.class);
  26. fooServiceConfig.setRef(new FooServiceImpl());
  27. fooServiceConfig.setVersion("1.0.0");
  28. ...
  29. // 通过DubboBootstrap简化配置组装,控制启动过程
  30. DubboBootstrap.getInstance()
  31. .application("demo-provider") // 应用配置
  32. .registry(new RegistryConfig("zookeeper://127.0.0.1:2181")) // 注册中心配置
  33. .protocol(protocol) // 全局默认协议配置
  34. .service(demoServiceConfig) // 添加ServiceConfig
  35. .service(fooServiceConfig)
  36. .start() // 启动Dubbo
  37. .await(); // 挂起等待(防止进程退出)
  38. }
  39. }
  1. import org.apache.dubbo.config.bootstrap.DubboBootstrap;
  2. import org.apache.dubbo.rpc.config.ApplicationConfig;
  3. import org.apache.dubbo.rpc.config.RegistryConfig;
  4. import org.apache.dubbo.rpc.config.ProviderConfig;
  5. import org.apache.dubbo.rpc.config.ServiceConfig;
  6. import com.xxx.DemoService;
  7. import com.xxx.DemoServiceImpl;
  8. public class DemoConsumer {
  9. public static void main(String[] args) {
  10. // 引用远程服务
  11. ReferenceConfig<DemoService> demoServiceReference = new ReferenceConfig<DemoService>();
  12. demoServiceReference.setInterface(DemoService.class);
  13. demoServiceReference.setVersion("1.0.0");
  14. ReferenceConfig<FooService> fooServiceReference = new ReferenceConfig<FooService>();
  15. fooServiceReference.setInterface(FooService.class);
  16. fooServiceReference.setVersion("1.0.0");
  17. // 通过DubboBootstrap简化配置组装,控制启动过程
  18. DubboBootstrap bootstrap = DubboBootstrap.getInstance();
  19. bootstrap.application("demo-consumer") // 应用配置
  20. .registry(new RegistryConfig("zookeeper://127.0.0.1:2181")) // 注册中心配置
  21. .reference(demoServiceReference) // 添加ReferenceConfig
  22. .service(fooServiceReference)
  23. .start(); // 启动Dubbo
  24. ...
  25. // 和本地bean一样使用demoService
  26. // 通过Interface获取远程服务接口代理,不需要依赖ReferenceConfig对象
  27. DemoService demoService = DubboBootstrap.getInstance().getCache().get(DemoService.class);
  28. demoService.sayHello("Dubbo");
  29. FooService fooService = DubboBootstrap.getInstance().getCache().get(FooService.class);
  30. fooService.greeting("Dubbo");
  31. }
  32. }

其它配置

API配置能力与XML配置是等价的,其它的各种配置都可以用API设置。

下面只列出不同的地方,其它参见上面的写法。

基本配置

可以在DubboBootstrap中设置全局基本配置,包括应用配置、协议配置、注册中心、配置中心、元数据中心、模块、监控、SSL、provider配置、consumer配置等。

  1. // 注册中心
  2. RegistryConfig registry = new RegistryConfig();
  3. registry.setAddress("zookeeper://192.168.10.1:2181");
  4. ...
  5. // 服务提供者协议配置
  6. ProtocolConfig protocol = new ProtocolConfig();
  7. protocol.setName("dubbo");
  8. protocol.setPort(12345);
  9. protocol.setThreads(200);
  10. ...
  11. // 配置中心
  12. ConfigCenterConfig configCenter = new ConfigCenterConfig();
  13. configCenter.setAddress("zookeeper://192.168.10.2:2181");
  14. ...
  15. // 元数据中心
  16. MetadataReportConfig metadataReport = new MetadataReportConfig();
  17. metadataReport.setAddress("zookeeper://192.168.10.3:2181");
  18. ...
  19. // Metrics
  20. MetricsConfig metrics = new MetricsConfig();
  21. metrics.setProtocol("dubbo");
  22. ...
  23. // SSL
  24. SslConfig ssl = new SslConfig();
  25. ssl.setServerKeyCertChainPath("/path/ssl/server-key-cert-chain");
  26. ssl.setServerPrivateKeyPath("/path/ssl/server-private-key");
  27. ...
  28. // Provider配置(ServiceConfig默认配置)
  29. ProviderConfig provider = new ProviderConfig();
  30. provider.setGroup("demo");
  31. provider.setVersion("1.0.0");
  32. ...
  33. // Consumer配置(ReferenceConfig默认配置)
  34. ConsumerConfig consumer = new ConsumerConfig();
  35. consumer.setGroup("demo");
  36. consumer.setVersion("1.0.0");
  37. consumer.setTimeout(2000);
  38. ...
  39. DubboBootstrap.getInstance()
  40. .application("demo-app")
  41. .registry(registry)
  42. .protocol(protocol)
  43. .configCenter(configCenter)
  44. .metadataReport(metadataReport)
  45. .module(new ModuleConfig("module"))
  46. .metrics(metrics)
  47. .ssl(ssl)
  48. .provider(provider)
  49. .consumer(consumer)
  50. ...
  51. .start();

方法级设置

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

点对点直连

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

最后修改 September 21, 2021: Bug fix miss mialbox (#953) (57cf51b)