创建基于Spring Boot的微服务应用

快速开始,学习如何使用 dubbo-nacos-spring-boot-starter 从头创建基于一个基于Spring Boot的Dubbo应用。

以下文档将引导您从头创建一个基于 Spring Boot 的 Dubbo 应用,并为应用配置 Triple 通信协议、服务发现等微服务基础能力。

快速创建应用

以下是我们为您提前准备好的示例项目,可通过如下命令快速下载示例源码。在实际开发中,您也可以访问 start.dubbo.apache.org 快速创建一个全新的 Dubbo 应用模板。

  1. curl -O -# https://dubbo-demo.oss-cn-hangzhou.aliyuncs.com/quickstart/dubbo-quickstart.zip
  2. unzip dubbo-quickstart
  3. cd dubbo-quickstart

提示

本项目源码在 Dubbo Github 示例仓库中维护 https://github.com/apache/dubbo-samples

本地启动应用

接下来,让我们尝试在本地启动应用。运行以下命令启动应用:

  1. chmod a+x ./mvnw
  2. ./mvnw clean install -DskipTests
  3. ./mvnw compile -pl quickstart-service exec:java -Dexec.mainClass="org.apache.dubbo.samples.quickstart.QuickStartApplication"

注意

  • 运行示例要求 JDK 17+ 版本。
  • 由于配置文件中启用了注册中心,您需要首先在本地启动 Nacos 注册中心 server。或者参考下一篇 Kubernetes 部署方式。

在应用启动成功后,本地进程使用 Triple协议在指定端口发布了服务。同时可以看到消费端持续对提供端发起调用调用:

  1. Started QuickStartApplication in 4.38 seconds (process running for 4.629)
  2. Receive result ======> Hello world

可直接使用 cURL 测试服务是否已经正常运行:

  1. curl \
  2. --header "Content-Type: application/json" \
  3. --data '["Dubbo"]' \
  4. http://localhost:50051/org.apache.dubbo.samples.quickstart.dubbo.api.DemoService/sayHello/

除了使用命令行之外,我们还可以在 IDE 中启动项目,调整示例或进行本地 debug。

源码解析

将以上准备好的示例项目导入最喜欢的 IDE 开发工具(以 IntelliJ IDEA 为例),项目结构如下:

项目结构截图

Maven 依赖

打开 pom.xml,可以看到示例项目中 Dubbo 相关核心依赖如下:

  1. <dependencyManagement>
  2. <dependencies>
  3. <dependency>
  4. <groupId>org.apache.dubbo</groupId>
  5. <artifactId>dubbo-bom</artifactId>
  6. <version>3.3.0</version>
  7. <type>pom</type>
  8. <scope>import</scope>
  9. </dependency>
  10. </dependencies>
  11. </dependencyManagement>
  12. <dependencies>
  13. <dependency>
  14. <groupId>org.apache.dubbo</groupId>
  15. <artifactId>dubbo-spring-boot-starter</artifactId>
  16. </dependency>
  17. <dependency>
  18. <groupId>org.apache.dubbo</groupId>
  19. <artifactId>dubbo-nacos-spring-boot-starter</artifactId>
  20. </dependency>
  21. </dependencies>

其中,dubbo-spring-boot-starterdubbo-nacos-spring-boot-starter 分别为我们引入了 Dubbo 内核框架与 Nacos 客户端相关的依赖组件,更多内容可以查看 Dubbo 支持的 Spring Boot Starter 清单

服务定义

以下是基于 Java Interface 的标准 Dubbo 服务定义。

  1. public interface DemoService {
  2. String sayHello(String name);
  3. }

DemoService 中,定义了 sayHello 这个方法。后续服务端发布的服务,消费端订阅的服务都是围绕着 DemoService 接口展开的。

服务实现

定义了服务接口之后,可以在服务端这一侧定义对应的业务逻辑实现。

  1. @DubboService
  2. public class DemoServiceImpl implements DemoService {
  3. @Override
  4. public String sayHello(String name) {
  5. return "Hello " + name;
  6. }
  7. }

DemoServiceImpl 类中添加了 @DubboService 注解,通过这个配置可以基于 Spring Boot 去发布 Dubbo 服务。

发起服务调用

示例应用中有一个 consumer 包,用于模拟发起对 provider 服务的远程调用。

  1. @Component
  2. public class Consumer implements CommandLineRunner {
  3. @DubboReference
  4. private DemoService demoService;
  5. @Override
  6. public void run(String... args) throws Exception {
  7. String result = demoService.sayHello("world");
  8. System.out.println("Receive result ======> " + result);
  9. }
  10. }

Task 类中,通过@DubboReference 从 Dubbo 获取了一个 RPC 订阅代理,这个 demoService 代理可以像本地调用一样直接调用: demoService.sayHello("world")

提示

通常远程调用是跨进程的,示例项目为了方便开发,直接内置了一个 @DubboReference 调用。如果您想学习如何开发一个独立的 Consumer(客户端)进程,以便发起对 Dubbo 服务的远程调用,我们有一个 包含独立 consumer、provider 模块的示例项目 可供参考。

应用入口与配置文件

由于我们创建的是一个 Spring Boot 应用,Dubbo 相关配置信息都存放在 application.yml 配置文件中。基于以下配置,Dubbo 进程将在 50051 端口监听 triple 协议请求,同时,实例的 ip:port 信息将会被注册到 Nacos server。

  1. # application.yml
  2. dubbo:
  3. registry:
  4. address: nacos://${nacos.address:127.0.0.1}:8848?username=nacos&password=nacos
  5. # This will enable application-level service discovery only (the recommended service discovery method for Dubbo3).
  6. # For users upgrading from Dubbo2.x, please set the value to 'all' for smooth migration.
  7. register-mode: instance
  8. protocol:
  9. name: tri
  10. port: 50051
  11. application:
  12. name: QuickStartApplication
  13. logger: slf4j

以下是整个应用的启动入口,@EnableDubbo 注解用来加载和启动 Dubbo 相关组件。

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

发布服务定义到远端仓库

应用开发完成后,我们需要将服务定义(在此示例中是 DemoService 接口定义)发布到外部公开的或组织内部的 maven 仓库,以便调用这些服务的应用能够加载并使用这些服务定义。

如之前我们看到的,示例项目包含 api、service 两个模块,切换项目到 api 目录,以下命令即可完成发布动作:

  1. mvn clean deploy

更多内容

最后修改 September 18, 2024: update quick start (1ef7e90ab63)