Dubbo 微服务注册发现

本地开发应用

前提条件

使用 Spring Boot 开发 Dubbo 微服务应用前,请确认已完成以下工作:

  • 下载 Maven 并设置环境变量。
  • 下载最新版本 Nacos Server
  • 按照以下步骤启动 Nacos Server。
    1. 解压 Nacos Server 压缩包。
    2. 进入 nacos/bin 目录,启动 Nacos Server。

tip 提示

  • Linux/Unix/Mac 系统:sh startup.sh -m standalone
  • Windows 系统:双击文件 startup.cmd

创建服务提供者

  1. 创建名为 spring-boot-dubbo-provider 的 Maven 工程。

  2. 在 pom.xml 文件中添加依赖,此处以 Spring Boot 2.1.6.RELEASE 为例。

    1. <dependencyManagement>
    2. <dependencies>
    3. <dependency>
    4. <groupId>org.springframework.boot</groupId>
    5. <artifactId>spring-boot-dependencies</artifactId>
    6. <version>2.1.6.RELEASE</version>
    7. <type>pom</type>
    8. <scope>import</scope>
    9. </dependency>
    10. </dependencies>
    11. </dependencyManagement>
    12. <dependencies>
    13. <dependency>
    14. <groupId>org.springframework.boot</groupId>
    15. <artifactId>spring-boot-starter-web</artifactId>
    16. </dependency>
    17. <dependency>
    18. <groupId>io.terminus.boot.rpc</groupId>
    19. <artifactId>dubbo-light-provider</artifactId>
    20. <version>2.1.6-RELEASE</version>
    21. </dependency>
    22. </dependencies>
  3. 开发 Dubbo 服务提供者,Dubbo 中服务均以接口的形式提供。

    • src/main/java 路径下创建 package: io.terminus.erda.trial.demo.hellodubbo

    • io.terminus.erda.trial.demo.hellodubbo 下创建一个接口(interface)EchoService,其中包含一个 echo 方法。

      1. package io.terminus.erda.trial.demo.hellodubbo;
      2. public interface EchoService {
      3. String echo(String name);
      4. }
    • io.terminus.erda.trial.demo.hellodubbo 下创建一个类 EchoServiceImpl,实现此接口。

      ```java package io.terminus.erda.trial.demo.hellodubbo;

      import org.apache.dubbo.config.annotation.Service;;

  1. import java.util.concurrent.TimeUnit;
  2. @Service
  3. public class EchoServiceImpl implements EchoService {
  4. public String echo(String name) {
  5. long start = System.currentTimeMillis();
  6. try {
  7. TimeUnit.SECONDS.sleep(1);
  8. } catch (InterruptedException e) {
  9. }
  10. long end = System.currentTimeMillis();
  11. return "\r\n\t" + start + " Provider received." +
  12. "\r\n\t\tProvider processed after sleep 1 second! Echo String: \"" + name + "\"" +
  13. "\r\n\t" + end + " Provider Return";
  14. }
  15. }
  16. ```
  17. > tip 提示
  18. 此处的 Service 注解是 Dubbo 提供的一个注解类,类的全名称为 org.apache.dubbo.config.annotation.Service。
  19. >
  1. 配置 Dubbo 服务。

    • src/main/resources 路径下创建 application.properties 或 application.yml 文件并打开。

    • 在 application.properties 或 application.yml 中添加如下配置:

      1. spring:
      2. application.name: dubbo-spring-boot-provider
      3. dubbo:
      4. application.name: dubbo-spring-boot-provider
      5. protocol:
      6. name: dubbo
      7. port: 20880
      8. registry:
      9. address: nacos://${NACOS_ADDRESS:127.0.0.1:8848}?namespace=${NACOS_TENANT_ID:}
      10. scan:
      11. base-packages: io.terminus.erda.trial.demo.hellodubbo

      tip 提示

      • 以上配置无默认值,必须提供具体配置。
      • dubbo.registry.address 的值前缀必须以 nacos:// 开头,其后 IP 地址和端口为 Nacos Server 地址。代码示例中为本地地址,若将 Nacos Server 部署在其它机器上,请修改为实际的 IP 地址。
      • dubbo.scan.base-packages 的值需在代码中暴露外部调用,有多个带 @Service 注解的类所在的包时用逗号分隔。
  2. 开发并启动 Spring Boot 入口类 DubboProvider

    1. package io.terminus.erda.trial.demo.hellodubbo;
    2. import org.springframework.boot.SpringApplication;
    3. import org.springframework.boot.autoconfigure.SpringBootApplication;
    4. @SpringBootApplication
    5. public class DubboProvider {
    6. public static void main(String[] args) {
    7. SpringApplication.run(DubboProvider.class, args);
    8. }
    9. }
  3. 登录 Nacos 控制台 http://127.0.0.1:8848,在左侧导航栏中选择 服务列表 > 提供者列表,列表中已包含 io.terminus.erda.trial.demo.hellodubbo.EchoService,且可以查询该服务的服务分组和提供者 IP。

创建服务消费者

  1. 创建名为 spring-boot-dubbo-consumer 的 Maven 工程。

  2. 在 pom.xml 文件中添加依赖,此处以 Spring Boot 2.1.6.RELEASE 为例。

    1. <dependencyManagement>
    2. <dependencies>
    3. <dependency>
    4. <groupId>org.springframework.boot</groupId>
    5. <artifactId>spring-boot-dependencies</artifactId>
    6. <version>2.1.6.RELEASE</version>
    7. <type>pom</type>
    8. <scope>import</scope>
    9. </dependency>
    10. </dependencies>
    11. </dependencyManagement>
    12. <dependencies>
    13. <dependency>
    14. <groupId>org.springframework.boot</groupId>
    15. <artifactId>spring-boot-starter-web</artifactId>
    16. </dependency>
    17. <dependency>
    18. <groupId>io.terminus.boot.rpc</groupId>
    19. <artifactId>dubbo-light-consumer</artifactId>
    20. <version>2.1.6-RELEASE</version>
    21. </dependency>
    22. </dependencies>
  3. 开发 Dubbo 消费者。

    • src/main/java 路径下创建 package: io.terminus.erda.trial.demo.hellodubbo

    • io.terminus.erda.trial.demo.hellodubbo 下创建一个接口(interface)EchoService,其中包含一个 echo 方法。

      1. package io.terminus.erda.trial.demo.hellodubbo;
      2. public interface EchoService {
      3. String echo(String name);
      4. }
    • 开发 Dubbo 服务调用,例如需在 Controller 中调用一次远程 Dubbo 服务,则开发代码示例如下:

      1. package io.terminus.erda.trial.demo.hellodubbo;
      2. import org.apache.dubbo.config.annotation.Reference;
      3. import org.springframework.web.bind.annotation.PathVariable;
      4. import org.springframework.web.bind.annotation.RequestMapping;
      5. import org.springframework.web.bind.annotation.RequestMethod;
      6. import org.springframework.web.bind.annotation.RestController;
      7. @RestController
      8. public class DemoConsumerController {
      9. @Reference
      10. private EchoService demoService;
      11. @RequestMapping(value = "/ping", method = RequestMethod.GET)
      12. public Boolean ping() {
      13. try {
      14. String pong = demoService.echo("ping");
      15. System.out.println("Service returned: " + pong);
      16. return pong.contains("ping");
      17. } catch (Throwable t) {
      18. t.printStackTrace();
      19. return false;
      20. }
      21. }
      22. @RequestMapping(value = "/consumer-echo/{str}", method = RequestMethod.GET)
      23. public String feign1(@PathVariable String str) {
      24. long start = System.currentTimeMillis();
      25. String result = demoService.echo(str);
      26. long end = System.currentTimeMillis();
      27. return "" + start + " Consumer received." +
      28. "\t" + result +
      29. "\r\n" + end + " Consumer Return";
      30. }
      31. }

      tip 提示

      此处的 Reference 注解为 org.apache.dubbo.config.annotation.Reference

  4. 在 application.properties 或 application.yml 配置文件中新增以下配置:

    1. spring:
    2. application.name: dubbo-spring-boot-consumer
    3. dubbo:
    4. application.name: dubbo-spring-boot-consumer
    5. registry:
    6. address: nacos://${NACOS_ADDRESS:127.0.0.1:8848}?namespace=${NACOS_TENANT_ID:}

    tip 提示

    • 以上配置无默认值,必须提供具体配置。
    • dubbo.registry.address 的值前缀必须以 nacos:// 开头,其后 IP 地址和端口为 Nacos Server 地址。代码示例中为本地地址,若将 Nacos Server 部署在其它机器上,请修改为实际的 IP 地址。
  5. 开发并启动 Spring Boot 入口类 DubboConsumer

    1. package io.terminus.erda.trial.demo.hellodubbo;
    2. import org.springframework.boot.SpringApplication;
    3. import org.springframework.boot.autoconfigure.SpringBootApplication;
    4. @SpringBootApplication
    5. public class DubboConsumer {
    6. public static void main(String[] args) {
    7. SpringApplication.run(DubboConsumer.class, args);
    8. }
    9. }
  6. 登录 Nacos 控制台 http://127.0.0.1:8848,在左侧导航栏中选择 服务列表 > 调用者列表,列表中已包含 io.terminus.erda.trial.demo.hellodubbo.EchoService,且可以查看该服务的服务分组和调用者 IP。

验证结果

  1. `curl http://localhost:8088/ping`
  2. true

部署应用至 Erda

部署应用至 Erda 时,需注意 Erda 将注入以下 application.yml 中的变量:

  1. spring:
  2. application.name: dubbo-spring-boot-provider
  3. dubbo:
  4. application.name: dubbo-spring-boot-provider
  5. protocol:
  6. name: dubbo
  7. port: 20880
  8. registry:
  9. address: nacos://${NACOS_ADDRESS:127.0.0.1:8848}?namespace=${NACOS_TENANT_ID:}
  10. scan:
  11. base-packages: io.terminus.erda.trial.demo.hellodubbo
  1. spring:
  2. application.name: dubbo-spring-boot-consumer
  3. dubbo:
  4. application.name: dubbo-spring-boot-consumer
  5. registry:
  6. address: nacos://${NACOS_ADDRESS:127.0.0.1:8848}?namespace=${NACOS_TENANT_ID:}

修改 dice.yml,添加注册中心 v2.0 的依赖。

Dubbo 微服务注册发现 - 图1

完成服务部署后,Erda 将自动注入两个环境变量:

  • NACOS_ADDRESS
  • NACOS_TENANT_ID

点击注册中心,即可查看注册完成的服务。

Dubbo 微服务注册发现 - 图2

本地连线上注册中心

使用 Nacos 时,需配置以下环境变量:

  • NACOS_ADDRESS
  • NACOS_TENANT_ID

使用 ZooKeeper 时,需配置以下环境变量:

  • ZOOKEEPER_DUBBO
  • DUBBO_TENANT_ID