目標
從零上手開發基於 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
三個 package。
後續我們將在 api
下建立對應的介面,在 client
下建立對應客戶端訂閱服務的功能,在 provider
下建立對應服務端的實現以及釋出服務的功能。
上述三個 package 分別對應了應用共同依賴的 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) {
// 定義具體的服務
ServiceConfig<GreetingsService> service = new ServiceConfig<>();
service.setInterface(GreetingsService.class);
service.setRef(new GreetingsServiceImpl());
// 啟動 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 一文。
2. 除了 API 方式其他的使用方式
Dubbo 除了 API 方式還支援 Spring XML、Annotation、Spring Boot 等配置方式,在下一個教程中將就 Spring Boot 配置方式講解如何進行快速開發。
關於 XML 和 Annotation 的細節可以參考 XML 配置 | Apache Dubbo、Annotation 配置 | Apache Dubbo 疑問。
更多
本教程介紹瞭如何基於 Dubbo 的純 API 開發一個微服務應用。下一個教程中,將介紹如何基於 Spring Boot 開發微服務專案。
歡迎在 https://github.com/apache/dubbo 給 Dubbo Star。
搜尋關注官方微信公眾號:Apache Dubbo,瞭解更多業界最新動態,掌握大廠面試必備 Dubbo 技能