全部产品
云市场

使用 Spring Boot 开发 Dubbo 微服务应用

更新时间:2019-09-05 11:42:15

Spring Boot 简化了微服务应用的配置和部署,同时 Nacos 又同时提供了服务注册发现和配置管理功能,这两者结合的方式能够帮助您提升开发效率。本文介绍如何使用 Spring Boot 注解的方式基于 Nacos 开发一个 Dubbo 微服务示例应用。

前提条件

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

  • 下载 Maven并设置环境变量。

  • 下载最新版本的 Nacos Server

  • 按以下步骤启动 Nacos Server。

    1. 解压下载的 Nacos Server 压缩包
    2. 进入nacos/bin目录,启动 Nacos Server。
      • Linux/Unix/Mac 系统:执行命令sh startup.sh -m standalone
      • Windows 系统:双击执行startup.cmd文件。

示例工程

您可以按照本文的步骤一步步搭建出最终的工程,也可以选择直接下载本文对应的示例工程,或者使用 Git 来 clone: git clone https://github.com/aliyun/alibabacloud-microservice-demo.git

该项目包含了众多了示例工程,本文对应的示例工程位于 alibabacloud-microservice-demo/microservice-doc-demo/dubbo-samples-spring-boot

创建服务提供者

  1. 创建一个 Maven 工程,命名为spring-boot-dubbo-provider

  2. pom.xml文件中添加所需的依赖。

    这里以 Spring Boot 2.0.6.RELEASE 为例。

    1. <dependencyManagement>
    2. <dependencies>
    3. <dependency>
    4. <groupId>org.springframework.boot</groupId>
    5. <artifactId>spring-boot-dependencies</artifactId>
    6. <version>2.0.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</artifactId>
    16. </dependency>
    17. <dependency>
    18. <groupId>org.springframework.boot</groupId>
    19. <artifactId>spring-boot-actuator</artifactId>
    20. </dependency>
    21. <dependency>
    22. <groupId>org.apache.dubbo</groupId>
    23. <artifactId>dubbo-spring-boot-starter</artifactId>
    24. <version>2.7.3</version>
    25. </dependency>
    26. <dependency>
    27. <groupId>com.alibaba.nacos</groupId>
    28. <artifactId>nacos-client</artifactId>
    29. <version>1.1.1</version>
    30. </dependency>
    31. </dependencies>
  3. 开发 Dubbo 服务提供者。

    Dubbo 中服务都是以接口的形式提供的。

    1. src/main/java路径下创建一个 package com.alibaba.edas.boot

    2. com.alibaba.edas.boot下创建一个 接口(interface) IHelloService,里面包含一个 SayHello 方法。

      1. package com.alibaba.edas.boot;
      2. public interface IHelloService {
      3. String sayHello(String str);
      4. }
    3. com.alibaba.edas.boot下创建一个类IHelloServiceImpl,实现此接口。

      1. package com.alibaba.edas.boot;
      2. import com.alibaba.dubbo.config.annotation.Service;
      3. @Service
      4. public class IHelloServiceImpl implements IHelloService {
      5. public String sayHello(String name) {
      6. return "Hello, " + name + " (from Dubbo with Spring Boot)";
      7. }
      8. }

      说明: 这里的 Service 注解是 Dubbo 提供的一个注解类,类的全名称为:com.alibaba.dubbo.config.annotation.Service

  4. 配置 Dubbo 服务。

    1. src/main/resources路径下创建application.propertiesapplication.yaml文件并打开。

    2. application.propertiesapplication.yaml中添加如下配置。

      1. # Base packages to scan Dubbo Components (e.g @Service , @Reference)
      2. dubbo.scan.basePackages=com.alibaba.edas.boot
      3. dubbo.application.name=dubbo-provider-demo
      4. dubbo.registry.address=nacos://127.0.0.1:8848

      说明:

      • 以上三个配置没有默认值,必须要给出具体的配置。
      • dubbo.scan.basePackages的值是开发的代码中含有com.alibaba.dubbo.config.annotation.Servicecom.alibaba.dubbo.config.annotation.Reference注解所在的包。多个包之间用逗号隔开。
      • dubbo.registry.address的值前缀必须以 nacos:// 开头,后面的 IP 地址和端口指的是 Nacos Server 的地址。代码示例中为本地地址,如果您将 Nacos Server 部署在其它机器上,请修改为实际的 IP 地址。
  5. 开发并启动 Spring Boot 入口类DubboProvider

    1. package com.alibaba.edas.boot;
    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. }
  6. 登录 Nacos 控制台 http://127.0.0.1:8848,在左侧导航栏中单击服务列表 ,查看提供者列表。

    可以看到服务提供者里已经包含了com.alibaba.edas.boot.IHelloService,且可以查询该服务的服务分组和提供者 IP。

创建服务消费者

  1. 创建一个 Maven 工程,命名为spring-boot-dubbo-consumer

  2. pom.xml文件中添加相关依赖。

    这里以 Spring Boot 2.0.6.RELEASE 为例。

    1. <dependencyManagement>
    2. <dependencies>
    3. <dependency>
    4. <groupId>org.springframework.boot</groupId>
    5. <artifactId>spring-boot-dependencies</artifactId>
    6. <version>2.0.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>org.springframework.boot</groupId>
    19. <artifactId>spring-boot-actuator</artifactId>
    20. </dependency>
    21. <dependency>
    22. <groupId>org.apache.dubbo</groupId>
    23. <artifactId>dubbo-spring-boot-starter</artifactId>
    24. <version>2.7.3</version>
    25. </dependency>
    26. <dependency>
    27. <groupId>com.alibaba.nacos</groupId>
    28. <artifactId>nacos-client</artifactId>
    29. <version>1.1.1</version>
    30. </dependency>
    31. </dependencies>

    如果您需要选择使用 Spring Boot 1.x 的版本,请使用 Spring Boot 1.5.x 版本,对应的 com.alibaba.boot:dubbo-spring-boot-starter 版本为 0.1.0。

    说明: Spring Boot 1.x 版本的生命周期即将在 2019 年 8 月 结束,推荐使用新版本开发您的应用。

  3. 开发 Dubbo 消费者

    1. src/main/java路径下创建 package com.alibaba.edas.boot

    2. com.alibaba.edas.boot下创建一个接口(interface) IHelloService,里面包含一个 SayHello 方法。

      1. package com.alibaba.edas.boot;
      2. public interface IHelloService {
      3. String sayHello(String str);
      4. }
  4. 开发 Dubbo 服务调用。

    例如需要在 Controller 中调用一次远程 Dubbo 服务,开发的代码如下所示。

    1. package com.alibaba.edas.boot;
    2. import com.alibaba.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.RestController;
    6. @RestController
    7. public class DemoConsumerController {
    8. @Reference
    9. private IHelloService demoService;
    10. @RequestMapping("/sayHello/{name}")
    11. public String sayHello(@PathVariable String name) {
    12. return demoService.sayHello(name);
    13. }
    14. }

    说明:这里的 Reference 注解是 com.alibaba.dubbo.config.annotation.Reference 。

  5. application.properties/application.yaml配置文件中新增以下配置:

    1. dubbo.application.name=dubbo-consumer-demo
    2. dubbo.registry.address=nacos://127.0.0.1:8848

    说明:

    • 以上两个配置没有默认值,必须要给出具体的配置。
    • dubbo.registry.address的值前缀必须以 nacos:// 开头,后面的 IP 地址和端口为 Nacos Server 的地址。代码示例中为本地地址,如果您将 Nacos Server 部署在其它机器上,请修改为实际的 IP 地址。
  6. 开发并启动 Spring Boot 入口类DubboConsumer

    1. package com.alibaba.edas.boot;
    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. }
  7. 登录 Nacos 控制台 http://127.0.0.1:8848,在左侧导航栏中单击服务列表 ,再在服务列表页面选择调用者列表,查看调用者列表。

    可以看到包含了com.alibaba.edas.boot.IHelloService,且可以查看该服务的服务分组和调用者 IP。

结果验证

  1. `curl http://localhost:8080/sayHello/EDAS`
  2. `Hello, EDAS (from Dubbo with Spring Boot)`

部署到 EDAS

本地使用 Nacos 作为注册中心的应用可以直接部署到 EDAS 中,无需做任何修改,注册中心会被自动替换为 EDAS 上的注册中心。

您可以根据实际需求选择部署的集群类型(主要为 ECS 集群或容器服务 Kubernetes 集群)和部署途径(控制台或工具),详情请参见部署应用概述

如果您使用控制台部署,在部署前,需要在本地应用程序中完成以下操作:

  1. pom.xml文件中添加以下打包插件的配置。

    • Provider

      1. <build>
      2. <plugins>
      3. <plugin>
      4. <groupId>org.springframework.boot</groupId>
      5. <artifactId>spring-boot-maven-plugin</artifactId>
      6. <executions>
      7. <execution>
      8. <goals>
      9. <goal>repackage</goal>
      10. </goals>
      11. <configuration>
      12. <classifier>spring-boot</classifier>
      13. <mainClass>com.alibaba.edas.boot.DubboProvider</mainClass>
      14. </configuration>
      15. </execution>
      16. </executions>
      17. </plugin>
      18. </plugins>
      19. </build>
    • Consumer

      1. <build>
      2. <plugins>
      3. <plugin>
      4. <groupId>org.springframework.boot</groupId>
      5. <artifactId>spring-boot-maven-plugin</artifactId>
      6. <executions>
      7. <execution>
      8. <goals>
      9. <goal>repackage</goal>
      10. </goals>
      11. <configuration>
      12. <classifier>spring-boot</classifier>
      13. <mainClass>com.alibaba.edas.boot.DubboConsumer</mainClass>
      14. </configuration>
      15. </execution>
      16. </executions>
      17. </plugin>
      18. </plugins>
      19. </build>
  2. 执行 mvn clean package 将本地的程序打成 JAR 包。

更多信息