本文将基于 Dubbo Samples 示例演示如何快速搭建并部署一个微服务应用。
背景
Dubbo 作为一款微服务框架,最重要的是向用户提供跨进程的 RPC 远程调用能力。如上图所示,Dubbo 的服务消费者(Consumer)通过一系列的工作将请求发送给服务提供者(Provider)。
为了实现这样一个目标,Dubbo 引入了注册中心(Registry)组件,通过注册中心,服务消费者可以感知到服务提供者的连接方式,从而将请求发送给正确的服务提供者。
目标
了解微服务调用的方式以及 Dubbo 的能力
难度
低
环境要求
-
系统:Windows、Linux、MacOS
-
JDK 8 及以上(推荐使用 JDK17)
-
Git
-
Docker (可选)
动手实践
本章将通过几个简单的命令,一步一步教你如何部署并运行一个最简单的 Dubbo 用例。
1. 获取测试工程
在开始整个教程之前,我们需要先获取测试工程的代码。Dubbo 的所有测试用例代码都存储在 apache/dubbo-samples 这个仓库中,以下这个命令可以帮你获取 Samples 仓库的所有代码。
git clone --depth=1 --branch master git@github.com:apache/dubbo-samples.git
2. 认识 Dubbo Samples 项目结构
在将 apache/dubbo-samples 这个仓库 clone 到本地以后,本小节将就仓库的具体组织方式做说明。
.
├── codestyle // 开发使用的 style 配置文件
├── 1-basic // 基础的入门用例
├── 2-advanced // 高级用法
├── 3-extensions // 扩展使用示例
├── 4-governance // 服务治理用例
├── 10-task // Dubbo 学习系列示例
├── 99-integration // 集成测试使用
├── test // 集成测试使用
└── tools // 三方组件快速启动工具
如上表所示,apache/dubbo-samples 主要由三个部分组成:代码风格文件、测试代码、集成测试。
-
代码风格文件是开发 Dubbo 代码的时候可以使用,其中包括了 IntelliJ IDEA 的配置文件。
-
测试代码即本教材所需要的核心内容。目前包括了 5 个部分的内容:面向初学者的 basic 入门用例、面向开发人员的 advanced 高级用法、面向中间件维护者的 extensions Dubbo 周边扩展使用示例、面向生产的 governance 服务治理用例以及 Dubbo 学习系列。本文将基于 basic 入门用例中最简单的 Dubbo API 使用方式进行讲解。
-
集成测试是 Dubbo 的质量保证体系中重要的一环,Dubbo 的每个版本都会对所有的 samples 进行回归验证,保证 Dubbo 的所有变更都不会影响 samples 的使用。
3. 启动一个简易的注册中心
从这一小节开始,将正式通过三个命令部署一个微服务应用。
从 背景 一节中可知,运行起 Dubbo 应用的一个大前提是部署一个注册中心,为了让本教程更易于上手,我们提供了一个基于 Apache Zookeeper 注册中心的简易启动器,如果您需要在生产环境部署注册中心,请参考生产环境初始化一文部署高可用的注册中心。
Windows:
./mvnw.cmd clean compile exec:java -pl tools/embedded-zookeeper
Linux / MacOS:
./mvnw clean compile exec:java -pl tools/embedded-zookeeper
注:需要开一个独立的 terminal 运行,命令将会保持一直执行的状态。
Docker:
docker run --name some-zookeeper --restart always -d zookeeper
在执行完上述命令以后,等待一会出现如下图所示的日志即代表注册中心启动完毕,可以继续执行后续任务。
4. 启动服务提供者
在启动了注册中心之后,下一步是启动一个对外提供服务的服务提供者。在 dubbo-samples 中也提供了对应的示例,可以通过以下命令快速拉起。
Windows:
./mvnw.cmd clean compile exec:java -pl 1-basic/dubbo-samples-api -Dexec.mainClass="org.apache.dubbo.samples.provider.Application"
Linux / MacOS:
./mvnw clean compile exec:java -pl 1-basic/dubbo-samples-api -Dexec.mainClass="org.apache.dubbo.samples.provider.Application"
注:需要开一个独立的 terminal 运行,命令将会保持一直执行的状态。
在执行完上述命令以后,等待一会出现如下图所示的日志(DubboBootstrap awaiting
)即代表服务提供者启动完毕,标志着该服务提供者可以对外提供服务了。
[19/01/23 03:55:49:049 CST] org.apache.dubbo.samples.provider.Application.main() INFO bootstrap.DubboBootstrap: [DUBBO] DubboBootstrap awaiting ..., dubbo version: 3.2.0-beta.3, current host: 169.254.44.42
5. 启动服务消费者
最后一步是启动一个服务消费者来调用服务提供者,也即是 RPC 调用的核心,为服务消费者提供调用服务提供者的桥梁。
Windows:
./mvnw.cmd clean compile exec:java -pl 1-basic/dubbo-samples-api -Dexec.mainClass="org.apache.dubbo.samples.client.Application"
Linux / MacOS:
./mvnw clean compile exec:java -pl 1-basic/dubbo-samples-api -Dexec.mainClass="org.apache.dubbo.samples.client.Application"
在执行完上述命令以后,等待一会出现如下图所示的日志(hi, dubbo
),打印出的数据就是服务提供者处理之后返回的,标志着一次服务调用的成功。
Receive result ======> hi, dubbo
延伸阅读
1. 消费端是怎么找到服务端的?
在本用例中的步骤 3 启动了一个 Zookeeper 的注册中心,服务提供者会向注册中心中写入自己的地址,供服务消费者获取。
Dubbo 会在 Zookeeper 的 /dubbo/interfaceName
和 /services/appName
下写入服务提供者的连接信息。
如下所示是 Zookeeper 上的数据示例:
[zk: localhost:2181(CONNECTED) 5] ls /dubbo/org.apache.dubbo