從零上手開發基於 Dubbo 的微服務
低
系統:Windows、Linux、MacOS
JDK 8 及以上(推薦使用 JDK17)
Git
IntelliJ IDEA(可選)
Docker (可選)
本章將通過手把手的教學一步一步教你如何從零開發一個微服務應用。
對於一個微服務化的應用來說,註冊中心是不可或缺的一個元件。只有通過註冊中心,消費端才可以成功發現伺服器端的地址資訊,進而進行呼叫。
為了讓本教學更易於上手,我們提供了一個基於 Apache Zookeeper 註冊中心的簡易啟動器,如果您需要在生產環境部署註冊中心,請參考生產環境初始化一文部署高可用的註冊中心。
Windows:
git clone --depth=1 --branch master [email protected]: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 [email protected]: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
從本小節開始,將基於 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 模組。從簡單出發,本教學將在同一個工程中進行開發,區分多個啟動類。
在初始化完專案以後,我們需要先新增 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
重新整理依賴。
服務介面 Dubbo 中溝通消費端和伺服器端的橋樑。
在 org.apache.dubbo.samples.api
下建立 GreetingsService
介面,定義如下:
package org.apache.dubbo.samples.api;
public interface GreetingsService {
String sayHi(String name);
}
在 GreetingsService
中,定義了 sayHi
這個方法。後續伺服器端釋出的服務,消費端訂閱的服務都是圍繞著 GreetingsService
介面展開的。
定義了服務介面之後,可以在伺服器端這一側定義對應的實現,這部分的實現相對於消費端來說是遠端的實現,本地沒有相關的資訊。
在 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
。
在實現了服務之後,本小節將通過 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
可以多次傳入。
對於消費端,可以通過 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
可以同時傳入,意味著一個應用可以同時即是消費端、也是伺服器端。
截止第 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
Dubbo 的主要設定入口有ReferenceConfig
、ServiceConfig
和 DubboBootstrap
,更多的細節可以參考 API 設定 | Apache Dubbo 一文。
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 技能