Annotation 配置

以 Annotation、Spring Boot 开发 Dubbo 应用

本文以 Spring Boot + Annotation 模式描述 Dubbo 应用开发,在此查看无 Spring Boot 的 Spring 注解开发模式 完整示例

在 Dubbo Spring Boot 开发中,你只需要增加几个注解,并配置 application.propertiesapplication.yml 文件即可完成 Dubbo 服务定义:

  • 注解有 @DubboService@DubboReferenceEnableDubbo。其中 @DubboService@DubboReference 用于标记 Dubbo 服务,EnableDubbo 启动 Dubbo 相关配置并指定 Spring Boot 扫描包路径。
  • 配置文件 application.propertiesapplication.yml

以下内容的完整示例请参考 dubbo-samples

增加 Maven 依赖

使用 Dubbo Spring Boot Starter 首先引入以下 Maven 依赖

  1. <dependencyManagement>
  2. <dependencies>
  3. <!-- Spring Boot -->
  4. <dependency>
  5. <groupId>org.springframework.boot</groupId>
  6. <artifactId>spring-boot-dependencies</artifactId>
  7. <version>${spring-boot.version}</version>
  8. <type>pom</type>
  9. <scope>import</scope>
  10. </dependency>
  11. <!-- Dubbo -->
  12. <dependency>
  13. <groupId>org.apache.dubbo</groupId>
  14. <artifactId>dubbo-bom</artifactId>
  15. <version>${dubbo.version}</version>
  16. <type>pom</type>
  17. <scope>import</scope>
  18. </dependency>
  19. <!-- Zookeeper -->
  20. <!-- NOTICE: Dubbo only provides dependency management module for Zookeeper, add Nacos or other product dependency directly if you want to use them. -->
  21. <dependency>
  22. <groupId>org.apache.dubbo</groupId>
  23. <artifactId>dubbo-dependencies-zookeeper</artifactId>
  24. <version>${dubbo.version}</version>
  25. <type>pom</type>
  26. </dependency>
  27. </dependencies>
  28. </dependencyManagement>

然后在相应的模块的 pom 中增加

  1. <dependencies>
  2. <!-- dubbo -->
  3. <dependency>
  4. <groupId>org.apache.dubbo</groupId>
  5. <artifactId>dubbo</artifactId>
  6. </dependency>
  7. <dependency>
  8. <groupId>org.apache.dubbo</groupId>
  9. <artifactId>dubbo-dependencies-zookeeper</artifactId>
  10. <type>pom</type>
  11. </dependency>
  12. <!-- dubbo starter -->
  13. <dependency>
  14. <groupId>org.apache.dubbo</groupId>
  15. <artifactId>dubbo-spring-boot-starter</artifactId>
  16. </dependency>
  17. <!-- spring starter -->
  18. <dependency>
  19. <groupId>org.springframework.boot</groupId>
  20. <artifactId>spring-boot-starter</artifactId>
  21. </dependency>
  22. <dependency>
  23. <groupId>org.springframework.boot</groupId>
  24. <artifactId>spring-boot-autoconfigure</artifactId>
  25. </dependency>
  26. </dependencies>

区分上面的

application.yml 或 application.properties

除 service、reference 之外的组件都可以在 application.yml 文件中设置,如果要扩展 service 或 reference 的注解配置,则需要增加 dubbo.properties 配置文件或使用其他非注解如 Java Config 方式,具体请看下文 扩展注解的配置

service、reference 组件也可以通过 id 与 application 中的全局组件做关联,以下面配置为例:

  1. dubbo:
  2. application:
  3. name: dubbo-springboot-demo-provider
  4. protocol:
  5. name: dubbo
  6. port: -1
  7. registry:
  8. id: zk-registry
  9. address: zookeeper://127.0.0.1:2181
  10. config-center:
  11. address: zookeeper://127.0.0.1:2181
  12. metadata-report:
  13. address: zookeeper://127.0.0.1:2181

通过注解将 service 关联到上文定义的特定注册中心

  1. @DubboService(registry="zk-registry")
  2. public class DemoServiceImpl implements DemoService {}

通过 Java Config 配置进行关联也是同样道理

  1. @Configuration
  2. public class ProviderConfiguration {
  3. @Bean
  4. public ServiceConfig demoService() {
  5. ServiceConfig service = new ServiceConfig();
  6. service.setRegistry("zk-registry");
  7. return service;
  8. }
  9. }

注解

@DubboService 注解

@Service 注解从 3.0 版本开始就已经废弃,改用 @DubboService,以区别于 Spring 的 @Service 注解

定义好 Dubbo 服务接口后,提供服务接口的实现逻辑,并用 @DubboService 注解标记,就可以实现 Dubbo 的服务暴露

  1. @DubboService
  2. public class DemoServiceImpl implements DemoService {}

如果要设置服务参数,@DubboService 也提供了常用参数的设置方式。如果有更复杂的参数设置需求,则可以考虑使用其他设置方式

  1. @DubboService(version = "1.0.0", group = "dev", timeout = 5000)
  2. public class DemoServiceImpl implements DemoService {}

@DubboReference 注解

@Reference 注解从 3.0 版本开始就已经废弃,改用 @DubboReference,以区别于 Spring 的 @Reference 注解

  1. @Component
  2. public class DemoClient {
  3. @DubboReference
  4. private DemoService demoService;
  5. }

@DubboReference 注解将自动注入为 Dubbo 服务代理实例,使用 demoService 即可发起远程服务调用

@EnableDubbo 注解

@EnableDubbo 注解必须配置,否则将无法加载 Dubbo 注解定义的服务,@EnableDubbo 可以定义在主类上

  1. @SpringBootApplication
  2. @EnableDubbo
  3. public class ProviderApplication {
  4. public static void main(String[] args) throws Exception {
  5. SpringApplication.run(ProviderApplication.class, args);
  6. }
  7. }

Spring Boot 注解默认只会扫描 main 类所在的 package,如果服务定义在其它 package 中,需要增加配置 EnableDubbo(scanBasePackages = {"org.apache.dubbo.springboot.demo.provider"})

扩展注解配置

虽然可以通过 @DubboServiceDubboReference 调整配置参数(如下代码片段所示),但总体来说注解提供的配置项还是非常有限。在这种情况下,如果有更复杂的参数设置需求,可以使用 Java Configdubbo.properties 两种方式。

  1. @DubboService(version = "1.0.0", group = "dev", timeout = 5000)
  2. @DubboReference(version = "1.0.0", group = "dev", timeout = 5000)

使用 Java Config 代替注解

注意,Java Config 是 DubboServiceDubboReference 的替代方式,对于有复杂配置需求的服务建议使用这种方式。

  1. @Configuration
  2. public class ProviderConfiguration {
  3. @Bean
  4. public ServiceConfig demoService() {
  5. ServiceConfig service = new ServiceConfig();
  6. service.setInterface(DemoService.class);
  7. service.setRef(new DemoServiceImpl());
  8. service.setGroup("dev");
  9. service.setVersion("1.0.0");
  10. Map<String, String> parameters = new HashMap<>();
  11. service.setParameters(parameters);
  12. return service;
  13. }
  14. }

通过 dubbo.properties 补充配置

对于使用 DubboServiceDubboReference 的场景,可以使用 dubbo.properties 作为配置补充,具体格式这里有更详细解释。

  1. dubbo.service.org.apache.dubbo.springboot.demo.DemoService.timeout=5000
  2. dubbo.service.org.apache.dubbo.springboot.demo.DemoService.parameters=[{myKey:myValue},{anotherKey:anotherValue}]
  3. dubbo.reference.org.apache.dubbo.springboot.demo.DemoService.timeout=6000

properties 格式配置目前结构性不太强,比如体现在 key 字段冗余较多,后续会考虑提供对于 yaml 格式的支持。

最后修改 December 16, 2022: Fix check (#1736) (97972c1)