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>
  1. 开发 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 ,实现此接口。
  1. package io.terminus.erda.trial.demo.hellodubbo;
  2. import org.apache.dubbo.config.annotation.Service;;
  3. import java.util.concurrent.TimeUnit;
  4. @Service
  5. public class EchoServiceImpl implements EchoService {
  6. public String echo(String name) {
  7. long start = System.currentTimeMillis();
  8. try {
  9. TimeUnit.SECONDS.sleep(1);
  10. } catch (InterruptedException e) {
  11. }
  12. long end = System.currentTimeMillis();
  13. return "\r\n\t" + start + " Provider received." +
  14. "\r\n\t\tProvider processed after sleep 1 second! Echo String: \"" + name + "\"" +
  15. "\r\n\t" + end + " Provider Return";
  16. }
  17. }

:::tip

这里的 Service 注解是 Dubbo 提供的一个注解类,类的全名称为:

org.apache.dubbo.config.annotation.Service

:::

  1. 配置 Dubbo 服务
  • 在 src/main/resources 路径下创建 application.properties 或 application.yaml 文件并打开
  • 在 application.properties 或 application.yaml 中添加如下配置
  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 注解的类所在的包,有多个时用逗号进行分隔

:::

  1. 开发并启动 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. }
  1. 登录 Nacos 控制台 http://127.0.0.1:8848,在左侧导航栏中单击服务列表 ,查看提供者列表。可以看到服务提供者里已经包含了io.terminus.erda.trial.demo.hellodubbo.EchoService,且可以查询该服务的服务分组和提供者 IP。

创建服务消费者

  1. 创建一个 Maven 工程,命名为spring-boot-dubbo-consumer
  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>
  1. 开发 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;。

:::

  1. 在 application.properties/application.yaml 配置文件中新增以下配置。
  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 地址。

:::

  1. 开发并启动 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. }
  1. 登录 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

具体取值,可以通过点击部署详情中的注册中心卡片,进入微服务治理页面,点击组件信息->注册中心进行查看