基礎 我是在ruoyi-vue已經安裝了mybatis-plus的基礎上進行的修改 關於SQLite SQLite 是一個軟體庫,實現了自給自足的、無伺服器的、零配置的、事務性的 SQL 資料庫引擎。 SQLite主頁:https://www.sqlite.org/index.html 1. pom ...
目標
從零上手開發基於 Dubbo 的微服務
難度
低
環境要求
-
系統:Windows、Linux、MacOS
-
JDK 8 及以上(推薦使用 JDK17)
-
Git
-
IntelliJ IDEA(可選)
-
Docker (可選)
動手實踐
本章將通過手把手的教程一步一步教你如何從零開發一個微服務應用。
1. 啟動註冊中心
對於一個微服務化的應用來說,註冊中心是不可或缺的一個組件。只有通過註冊中心,消費端才可以成功發現服務端的地址信息,進而進行調用。
為了讓本教程更易於上手,我們提供了一個基於 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
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 技能