2 - 基于 Dubbo API 开发微服务应用程序
目标
从头开始开发基于 Dubbo 的微服务
难度
低
环境要求
系统:Windows、Linux、MacOS
JDK 8 及以上(推荐 JDK17)
Git
IntelliJ IDEA(可选)
Docker(可选)
动手
本章将通过循序渐进的教程,教你如何从头开始开发一个微服务应用程序。
1. 启动注册中心
对于一个微服务应用程序来说,注册中心是不可或缺的组件。只有通过注册中心,消费者才能成功地发现服务器的地址信息,然后进行调用。
为了使本教程更容易使用,我们提供了一个基于 Apache Zookeeper 注册中心的简单启动器。如果您需要在生产环境中部署注册中心,请参考 生产环境初始化 部署高可用注册中心。
Windows:
git clone --depth=1 --branch master git@github.com:apache/dubbo-samples.git
cd dubbo-samples
./mvnw.cmd clean compile exec:java -pl tools/embedded-zookeeper
Linux / MacOS:
git clone --depth=1 --branch master git@github.com:apache/dubbo-samples.git
cd dubbo-samples
./mvnw clean compile exec:java -pl tools/embedded-zookeeper
Docker:
docker run --name some-zookeeper --restart always -d zookeeper
2. 初始化项目
从本节开始,项目将基于 IntelliJ IDEA 进行构建和测试。
如上图所示,可以构建一个基本的项目。
初始化项目后,需要在 src/main/java
目录下创建 org.apache.dubbo.samples.api
、org.apache.dubbo.samples.client
和 org.apache.dubbo.samples.provider
三个包。
未来,我们将在 api
下创建对应的接口,在 client
下创建对应的客户端订阅服务功能,在 provider
下创建对应的服务器实现和发布服务功能。
以上三个包分别对应应用程序所依赖的 API、消费者端应用程序的模块以及服务器端应用程序的模块。在实际部署中,需要将其拆分为三个项目,消费者和服务的共同依赖是 api 模块。从简入手,本教程将在一个项目中进行开发,以区分多个启动类。
3. 添加 Maven 依赖
初始化项目后,我们需要先添加 Dubbo 相关的 maven 依赖。
编辑 pom.xml
文件,添加如下配置。
<dependencies>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>3.2.0-beta.4</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-x-discovery</artifactId>
<version>4.3.0</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.8.0</version>
<exclusions>
<exclusion>
<groupId>io.netty</groupId>
<artifactId>netty-handler</artifactId>
</exclusion>
<exclusion>
<groupId>io.netty</groupId>
<artifactId>netty-transport-native-epoll</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
在该配置中,定义了 dubbo 和 zookeeper(以及对应的连接器 curator)的依赖。
添加完以上配置后,可以通过 IDEA 的 Maven - Reload All Maven Projects
刷新依赖。
4. 定义服务接口
服务接口是 Dubbo 中消费者和服务器之间的桥梁。
在 org.apache.dubbo.samples.api
下创建 GreetingsService
接口,定义如下
package org.apache.dubbo.samples.api;
public interface GreetingsService {
String sayHi(String name);
}
在 GreetingsService
中,定义了 sayHi
方法。后续服务器发布的服务和消费者订阅的服务,都是围绕 GreetingsService
接口进行开发的。
5. 定义服务器的实现
定义完服务接口后,就可以在服务器端定义对应的实现。与消费者端相比,这部分实现是远程实现,本地没有相关信息。
在 org.apache.dubbo.samples.provider
下创建 GreetingsServiceImpl
类,定义如下
package org.apache.dubbo.samples.provider;
import org.apache.dubbo.samples.api.GreetingsService;
public class GreetingsServiceImpl implements GreetingsService {
@Override
public String sayHi(String name) {
return "hi," + name;
}
}
在 GreetingsServiceImpl
中,实现了 GreetingsService
接口,对于 sayHi
方法,返回 hi, name
。
6. 服务器发布服务
实现完服务后,本节将通过 Dubbo 的 API 将服务发布到网络上。
在 org.apache.dubbo.samples.provider
下创建 Application
类,定义如下
package org.apache.dubbo.samples.provider;
import org.apache.dubbo.config.ProtocolConfig;
import org.apache.dubbo.config.RegistryConfig;
import org.apache.dubbo.config.ServiceConfig;
import org.apache.dubbo.config.bootstrap.DubboBootstrap;
import org.apache.dubbo.samples.api.GreetingsService;
public class Application {
public static void main(String[] args) {
// define a specific service
ServiceConfig<GreetingsService> service = new ServiceConfig<>();
service.setInterface(GreetingsService.class);
service.setRef(new GreetingsServiceImpl());
// start Dubbo
DubboBootstrap. getInstance()
.application("first-dubbo-provider")
.registry(new RegistryConfig("zookeeper://127.0.0.1:2181"))
.protocol(new ProtocolConfig("dubbo", -1))
.service(service)
.start()
.await();
}
}
在 org.apache.dubbo.samples.provider.Application
中,有两部分功能:首先,基于 ServiceConfig
,定义了发布的服务信息,包括接口信息和对应的实现类对象;其次,配置了 Dubbo 的启动器,传入应用程序名称、注册中心地址、协议信息以及服务信息。
注意:DubboBootstrap 中的 registry
、protocol
和 service
可以多次传入。
7. 消费者订阅并调用
对于消费者端,您可以通过 Dubbo 的 API 订阅消费者端。
在 org.apache.dubbo.samples.client
下创建 Application
类,定义如下
package org.apache.dubbo.samples.client;
import java.io.IOException;
import org.apache.dubbo.config.ReferenceConfig;
import org.apache.dubbo.config.RegistryConfig;
import org.apache.dubbo.config.bootstrap.DubboBootstrap;
import org.apache.dubbo.samples.api.GreetingsService;
public class Application {
public static void main(String[] args) throws IOException {
ReferenceConfig<GreetingsService> reference = new ReferenceConfig<>();
reference.setInterface(GreetingsService.class);
DubboBootstrap. getInstance()
.application("first-dubbo-consumer")
.registry(new RegistryConfig("zookeeper://127.0.0.1:2181"))
.reference(reference);
GreetingsService service = reference. get();
String message = service.sayHi("dubbo");
System.out.println("Receive result ======> " + message);
System.in.read();
}
}
org.apache.dubbo.samples.client.Application
中有三个函数
第一个是基于 ReferenceConfig
定义订阅的服务信息,包括接口信息。
第二个是配置 Dubbo 启动器,传入应用程序名称、注册中心地址、协议信息和服务信息。
最后,获取动态代理对象并调用它。
注意:DubboBootstrap 支持同时传入 service
和 reference
,这意味着一个应用程序可以同时是消费者和服务器。
8. 启动应用程序
截至步骤 7,代码已经开发完成,本节将启动整个项目并进行验证。
首先启动 org.apache.dubbo.samples.provider.Application
,等待一段时间后查看日志(DubboBootstrap awaiting
),如下图所示,表示服务提供者已启动,表明服务提供者可以提供服务。
[DUBBO] DubboBootstrap awaiting ..., dubbo version: 3.2.0-beta.4, current host: 169.254.44.42
然后启动 org.apache.dubbo.samples.client.Application
,等待一段时间后查看日志(hi, dubbo
),如下图所示,表示服务消费者已启动,并且成功获取了对服务器的调用。
Receive result ======> hi, dubbo
进一步阅读
1. Dubbo 配置介绍
Dubbo 的主要配置项是 ReferenceConfig
、ServiceConfig
和 DubboBootstrap
。有关更多详细信息,请参阅 [API 配置 | Apache Dubbo](/en/docs3-v2/java-sdk/reference-manual/config/api /) 文章。
2. 除了 API 方法之外的其他使用方式
除了 API 方法之外,Dubbo 还支持 Spring XML、Annotation 和 Spring Boot 等配置方法。在下一教程中,我们将解释如何使用 Spring Boot 配置方法快速开发。
有关 XML 和 Annotation 的详细信息,请参阅 XML 配置 | Apache Dubbo、[Annotation 配置 | Apache Dubbo](/en/docs3- v2/java-sdk/reference-manual/config/annotation/) 疑问。
更多
本教程介绍了如何基于 Dubbo 的纯 API 开发微服务应用程序。在下一教程中,我们将介绍如何基于 Spring Boot 开发微服务项目。