環(huán)境要求
-
系統(tǒng):Windows、Linux、MacOS
-
JDK 8 及以上(推薦使用 JDK17)
-
Git
-
IntelliJ IDEA(可選)
-
Docker (可選)
項(xiàng)目介紹
在本任務(wù)中,將分為 3 個(gè)子模塊進(jìn)行獨(dú)立開發(fā),模擬生產(chǎn)環(huán)境下的部署架構(gòu)。
. // apache/dubbo-samples/1-basic/dubbo-samples-spring-boot
├── dubbo-samples-spring-boot-interface // 共享 API 模塊
├── dubbo-samples-spring-boot-consumer // 消費(fèi)端模塊
└── dubbo-samples-spring-boot-provider // 服務(wù)端模塊
如上所示,共有 3 個(gè)模塊,其中?interface
?模塊被?consumer
?和?provider
?兩個(gè)模塊共同依賴,存儲(chǔ) RPC 通信使用的 API 接口。
. // apache/dubbo-samples/1-basic/dubbo-samples-spring-boot
├── dubbo-samples-spring-boot-interface // 共享 API 模塊
│?? ├── pom.xml
│?? └── src
│?? └── main
│?? └── java
│?? └── org
│?? └── apache
│?? └── dubbo
│?? └── springboot
│?? └── demo
│?? └── DemoService.java // API 接口
├── dubbo-samples-spring-boot-consumer // 消費(fèi)端模塊
│?? ├── pom.xml
│?? └── src
│?? ├── main
│?? │?? ├── java
│?? │?? │?? └── org
│?? │?? │?? └── apache
│?? │?? │?? └── dubbo
│?? │?? │?? └── springboot
│?? │?? │?? └── demo
│?? │?? │?? └── consumer
│?? │?? │?? ├── ConsumerApplication.java // 消費(fèi)端啟動(dòng)類
│?? │?? │?? └── Task.java // 消費(fèi)端模擬調(diào)用任務(wù)
│?? │?? └── resources
│?? │?? └── application.yml // Spring Boot 配置文件
├── dubbo-samples-spring-boot-provider // 服務(wù)端模塊
│?? ├── pom.xml
│?? └── src
│?? └── main
│?? ├── java
│?? │?? └── org
│?? │?? └── apache
│?? │?? └── dubbo
│?? │?? └── springboot
│?? │?? └── demo
│?? │?? └── provider
│?? │?? ├── DemoServiceImpl.java // 服務(wù)端實(shí)現(xiàn)類
│?? │?? └── ProviderApplication.java // 服務(wù)端啟動(dòng)類
│?? └── resources
│?? └── application.yml // Spring Boot 配置文件
└── pom.xml
如上為本教程接下來會(huì)使用到的項(xiàng)目的文件結(jié)構(gòu)。
快速部署(基于 Samples 直接啟動(dòng))
本章將通過幾個(gè)簡單的命令,一步一步教你如何部署并運(yùn)行一個(gè)基于 Dubbo x Spring Boot 的用例。
注:本章部署的代碼細(xì)節(jié)可以在?apache/dubbo-samples?這個(gè)倉庫中?1-basic/dubbo-samples-spring-boot
?中找到,在下一章中也將展開進(jìn)行講解。
1. 獲取測試工程
在開始整個(gè)教程之前,我們需要先獲取測試工程的代碼。Dubbo 的所有測試用例代碼都存儲(chǔ)在?apache/dubbo-samples?這個(gè)倉庫中,以下這個(gè)命令可以幫你獲取 Samples 倉庫的所有代碼。
git clone --depth=1 --branch master git@github.com:apache/dubbo-samples.git
2. 啟動(dòng)一個(gè)簡易的注冊中心
對于一個(gè)微服務(wù)化的應(yīng)用來說,注冊中心是不可或缺的一個(gè)組件。只有通過注冊中心,消費(fèi)端才可以成功發(fā)現(xiàn)服務(wù)端的地址信息,進(jìn)而進(jìn)行調(diào)用。
為了讓本教程更易于上手,我們提供了一個(gè)基于 Apache Zookeeper 注冊中心的簡易啟動(dòng)器,如果您需要在生產(chǎn)環(huán)境部署注冊中心,? 請參考生產(chǎn)環(huán)境初始化一文部署高可用的注冊中心。
Windows:
./mvnw.cmd clean compile exec:java -pl tools/embedded-zookeeper
Linux / MacOS:
./mvnw clean compile exec:java -pl tools/embedded-zookeeper
Docker:
docker run --name some-zookeeper -p 2181:2181 --restart always -d zookeeper
3. 本地打包 API 模塊
為了成功編譯服務(wù)端、消費(fèi)端模塊,需要先在本地打包安裝?dubbo-samples-spring-boot-interface
?模塊。
./mvnw clean install -pl 1-basic/dubbo-samples-spring-boot
./mvnw clean install -pl 1-basic/dubbo-samples-spring-boot/dubbo-samples-spring-boot-interface
4. 啟動(dòng)服務(wù)提供者
在啟動(dòng)了注冊中心之后,下一步是啟動(dòng)一個(gè)對外提供服務(wù)的服務(wù)提供者。在 dubbo-samples 中也提供了對應(yīng)的示例,可以通過以下命令快速拉起。
Windows:
./mvnw.cmd clean compile exec:java -pl 1-basic/dubbo-samples-spring-boot/dubbo-samples-spring-boot-provider -Dexec.mainClass="org.apache.dubbo.springboot.demo.provider.ProviderApplication"
Linux / MacOS:
./mvnw clean compile exec:java -pl 1-basic/dubbo-samples-spring-boot/dubbo-samples-spring-boot-provider -Dexec.mainClass="org.apache.dubbo.springboot.demo.provider.ProviderApplication"
注:需要開一個(gè)獨(dú)立的 terminal 運(yùn)行,命令將會(huì)保持一直執(zhí)行的狀態(tài)。
在執(zhí)行完上述命令以后,等待一會(huì)出現(xiàn)如下所示的日志(Current Spring Boot Application is await
)即代表服務(wù)提供者啟動(dòng)完畢,標(biāo)志著該服務(wù)提供者可以對外提供服務(wù)了。
2023-02-08 17:13:00.357 INFO 80600 --- [lication.main()] o.a.d.c.d.DefaultApplicationDeployer : [DUBBO] Dubbo Application[1.1](dubbo-springboot-demo-provider) is ready., dubbo version: 3.2.0-beta.4, current host: 30.221.128.96
2023-02-08 17:13:00.369 INFO 80600 --- [lication.main()] o.a.d.s.d.provider.ProviderApplication : Started ProviderApplication in 9.114 seconds (JVM running for 26.522)
2023-02-08 17:13:00.387 INFO 80600 --- [pool-1-thread-1] .b.c.e.AwaitingNonWebApplicationListener : [Dubbo] Current Spring Boot Application is await...
5. 啟動(dòng)服務(wù)消費(fèi)者
最后一步是啟動(dòng)一個(gè)服務(wù)消費(fèi)者來調(diào)用服務(wù)提供者,也即是 RPC 調(diào)用的核心,為服務(wù)消費(fèi)者提供調(diào)用服務(wù)提供者的橋梁。
Windows:
./mvnw.cmd clean compile exec:java -pl 1-basic/dubbo-samples-spring-boot/dubbo-samples-spring-boot-consumer -Dexec.mainClass="org.apache.dubbo.springboot.demo.consumer.ConsumerApplication"
Linux / MacOS:
./mvnw clean compile exec:java -pl 1-basic/dubbo-samples-spring-boot/dubbo-samples-spring-boot-consumer -Dexec.mainClass="org.apache.dubbo.springboot.demo.consumer.ConsumerApplication"
在執(zhí)行完上述命令以后,等待一會(huì)出現(xiàn)如下所示的日志(Hello world
),打印出的數(shù)據(jù)就是服務(wù)提供者處理之后返回的,標(biāo)志著一次服務(wù)調(diào)用的成功。
2023-02-08 17:14:33.045 INFO 80740 --- [lication.main()] o.a.d.s.d.consumer.ConsumerApplication : Started ConsumerApplication in 11.052 seconds (JVM running for 31.62)
Receive result ======> Hello world
2023-02-08 17:14:33.146 INFO 80740 --- [pool-1-thread-1] .b.c.e.AwaitingNonWebApplicationListener : [Dubbo] Current Spring Boot Application is await...
Wed Feb 08 17:14:34 CST 2023 Receive result ======> Hello world
Wed Feb 08 17:14:35 CST 2023 Receive result ======> Hello world
Wed Feb 08 17:14:36 CST 2023 Receive result ======> Hello world
Wed Feb 08 17:14:37 CST 2023 Receive result ======> Hello world
動(dòng)手實(shí)踐(從零代碼開發(fā)版)
本章將通過手把手的教程一步一步教你如何從零開發(fā)一個(gè)微服務(wù)應(yīng)用。
1. 啟動(dòng)注冊中心
對于一個(gè)微服務(wù)化的應(yīng)用來說,注冊中心是不可或缺的一個(gè)組件。只有通過注冊中心,消費(fèi)端才可以成功發(fā)現(xiàn)服務(wù)端的地址信息,進(jìn)而進(jìn)行調(diào)用。
為了讓本教程更易于上手,我們提供了一個(gè)基于 Apache Zookeeper 注冊中心的簡易啟動(dòng)器,如果您需要在生產(chǎn)環(huán)境部署注冊中心,請參考生產(chǎn)環(huán)境初始化一文部署高可用的注冊中心。
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 -p 2181:2181 --restart always -d zookeeper
2. 初始化項(xiàng)目
從本小節(jié)開始,將基于 IntelliJ IDEA 進(jìn)行工程的搭建以及測試。
如上圖所示,可以建立一個(gè)基礎(chǔ)的項(xiàng)目。
搭建了基礎(chǔ)項(xiàng)目之后,我們還需要?jiǎng)?chuàng)建?dubbo-spring-boot-demo-interface
?、dubbo-spring-boot-demo-provider
?和?dubbo-spring-boot-demo-consumer
?三個(gè)子模塊。
?
?
創(chuàng)建了三個(gè)子模塊之后,需要?jiǎng)?chuàng)建一下幾個(gè)文件夾:
-
在?
dubbo-spring-boot-demo-consumer/src/main/java
?下創(chuàng)建?org.apache.dubbo.springboot.demo.consumer
?package -
在?
dubbo-spring-boot-demo-interface/src/main/java
?下創(chuàng)建?org.apache.dubbo.springboot.demo
?package -
在?
dubbo-spring-boot-demo-provider/src/main/java
?下創(chuàng)建?org.apache.dubbo.springboot.demo.provider
?package
?文章來源地址http://www.zghlxwxcb.cn/news/detail-657529.html
最終的文件夾參考如上圖所示。
3. 添加 Maven 依賴
在初始化完項(xiàng)目以后,我們需要先添加 Dubbo 相關(guān)的 maven 依賴。
對于多模塊項(xiàng)目,首先需要在父項(xiàng)目的?pom.xml
?里面配置依賴信息。
?
編輯?./pom.xml
?這個(gè)文件,添加下列配置。
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-demo</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>dubbo-spring-boot-demo-interface</module>
<module>dubbo-spring-boot-demo-provider</module>
<module>dubbo-spring-boot-demo-consumer</module>
</modules>
<properties>
<dubbo.version>3.2.0-beta.4</dubbo.version>
<spring-boot.version>2.7.8</spring-boot.version>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencyManagement>
<dependencies>
<!-- Spring Boot -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- Dubbo -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-bom</artifactId>
<version>${dubbo.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-dependencies-zookeeper-curator5</artifactId>
<version>${dubbo.version}</version>
<type>pom</type>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
</plugin>
</plugins>
</pluginManagement>
</build>
然后在?dubbo-spring-boot-consumer
?和?dubbo-spring-boot-provider
?兩個(gè)模塊?pom.xml
?中進(jìn)行具體依賴的配置。
?
編輯?./dubbo-spring-boot-consumer/pom.xml
?和?./dubbo-spring-boot-provider/pom.xml
?這兩文件,都添加下列配置。
<dependencies>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-demo-interface</artifactId>
<version>${project.parent.version}</version>
</dependency>
<!-- dubbo -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-dependencies-zookeeper-curator5</artifactId>
<type>pom</type>
<exclusions>
<exclusion>
<artifactId>slf4j-reload4j</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
<!-- spring boot starter -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
</dependencies>
在這份配置中,定義了 dubbo 和 zookeeper(以及對應(yīng)的連接器 curator)的依賴。
添加了上述的配置以后,可以通過 IDEA 的?Maven - Reload All Maven Projects
?刷新依賴。
4. 定義服務(wù)接口
服務(wù)接口 Dubbo 中溝通消費(fèi)端和服務(wù)端的橋梁。
?
在?dubbo-spring-boot-demo-interface
?模塊的?org.apache.dubbo.samples.api
?下建立?DemoService
?接口,定義如下:
package org.apache.dubbo.springboot.demo;
public interface DemoService {
String sayHello(String name);
}
在?GreetingsService
?中,定義了?sayHi
?這個(gè)方法。后續(xù)服務(wù)端發(fā)布的服務(wù),消費(fèi)端訂閱的服務(wù)都是圍繞著?GreetingsService
?接口展開的。
5. 定義服務(wù)端的實(shí)現(xiàn)
定義了服務(wù)接口之后,可以在服務(wù)端這一側(cè)定義對應(yīng)的實(shí)現(xiàn),這部分的實(shí)現(xiàn)相對于消費(fèi)端來說是遠(yuǎn)端的實(shí)現(xiàn),本地沒有相關(guān)的信息。
在dubbo-spring-boot-demo-provider
?模塊的?org.apache.dubbo.samples.provider
?下建立?DemoServiceImpl
?類,定義如下:
package org.apache.dubbo.springboot.demo.provider;
import org.apache.dubbo.config.annotation.DubboService;
import org.apache.dubbo.springboot.demo.DemoService;
@DubboService
public class DemoServiceImpl implements DemoService {
@Override
public String sayHello(String name) {
return "Hello " + name;
}
}
在?DemoServiceImpl
?中,實(shí)現(xiàn)了?DemoService
?接口,對于?sayHello
?方法返回?Hello name
。
注:在DemoServiceImpl
?類中添加了?@DubboService
?注解,通過這個(gè)配置可以基于 Spring Boot 去發(fā)布 Dubbo 服務(wù)。
6. 配置服務(wù)端 Yaml 配置文件
從本步驟開始至第 7 步,將會(huì)通過 Spring Boot 的方式配置 Dubbo 的一些基礎(chǔ)信息。
首先,我們先創(chuàng)建服務(wù)端的配置文件。
?
在?dubbo-spring-boot-demo-provider
?模塊的?resources
?資源文件夾下建立?application.yml
?文件,定義如下:
dubbo:
application:
name: dubbo-springboot-demo-provider
protocol:
name: dubbo
port: -1
registry:
address: zookeeper://${zookeeper.address:127.0.0.1}:2181
在這個(gè)配置文件中,定義了 Dubbo 的應(yīng)用名、Dubbo 協(xié)議信息、Dubbo 使用的注冊中心地址。
7. 配置消費(fèi)端 YAML 配置文件
同樣的,我們需要?jiǎng)?chuàng)建消費(fèi)端的配置文件。
在?dubbo-spring-boot-demo-consumer
?模塊的?resources
?資源文件夾下建立?application.yml
?文件,定義如下:
dubbo:
application:
name: dubbo-springboot-demo-consumer
protocol:
name: dubbo
port: -1
registry:
address: zookeeper://${zookeeper.address:127.0.0.1}:2181
在這個(gè)配置文件中,定義了 Dubbo 的應(yīng)用名、Dubbo 協(xié)議信息、Dubbo 使用的注冊中心地址。
8. 基于 Spring 配置服務(wù)端啟動(dòng)類
除了配置 Yaml 配置文件之外,我們還需要?jiǎng)?chuàng)建基于 Spring Boot 的啟動(dòng)類。
首先,我們先創(chuàng)建服務(wù)端的啟動(dòng)類。
?
在?dubbo-spring-boot-demo-provider
?模塊的?org.apache.dubbo.springboot.demo.provider
?下建立?Application
?類,定義如下:
package org.apache.dubbo.springboot.demo.provider;
import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@EnableDubbo
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
}
}
在這個(gè)啟動(dòng)類中,配置了一個(gè)?ProviderApplication
?去讀取我們前面第 6 步中定義的?application.yml
?配置文件并啟動(dòng)應(yīng)用。
9. 基于 Spring 配置消費(fèi)端啟動(dòng)類
同樣的,我們需要?jiǎng)?chuàng)建消費(fèi)端的啟動(dòng)類。
在?dubbo-spring-boot-demo-consumer
?模塊的?org.apache.dubbo.springboot.demo.consumer
?下建立?Application
?類,定義如下:
package org.apache.dubbo.springboot.demo.consumer;
import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@EnableDubbo
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
}
在這個(gè)啟動(dòng)類中,配置了一個(gè)?ConsumerApplication
?去讀取我們前面第 7 步中定義的?application.yml
?配置文件并啟動(dòng)應(yīng)用。
10. 配置消費(fèi)端請求任務(wù)
除了配置消費(fèi)端的啟動(dòng)類,我們在 Spring Boot 模式下還可以基于?CommandLineRunner
去創(chuàng)建
?
在?dubbo-spring-boot-demo-consumer
?模塊的?org.apache.dubbo.springboot.demo.consumer
?下建立?Task
?類,定義如下:
package org.apache.dubbo.springboot.demo.consumer;
import java.util.Date;
import org.apache.dubbo.config.annotation.DubboReference;
import org.apache.dubbo.springboot.demo.DemoService;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
@Component
public class Task implements CommandLineRunner {
@DubboReference
private DemoService demoService;
@Override
public void run(String... args) throws Exception {
String result = demoService.sayHello("world");
System.out.println("Receive result ======> " + result);
new Thread(()-> {
while (true) {
try {
Thread.sleep(1000);
System.out.println(new Date() + " Receive result ======> " + demoService.sayHello("world"));
} catch (InterruptedException e) {
e.printStackTrace();
Thread.currentThread().interrupt();
}
}
}).start();
}
}
在?Task
?類中,通過@DubboReference
?從 Dubbo 獲取了一個(gè) RPC 訂閱,這個(gè)?demoService
?可以像本地調(diào)用一樣直接調(diào)用。在?run
方法中創(chuàng)建了一個(gè)線程進(jìn)行調(diào)用。
11. 啟動(dòng)應(yīng)用
截止第 10 步,代碼就已經(jīng)開發(fā)完成了,本小節(jié)將啟動(dòng)整個(gè)項(xiàng)目并進(jìn)行驗(yàn)證。
?
首先是啟動(dòng)?org.apache.dubbo.samples.provider.Application
?,等待一會(huì)出現(xiàn)如下圖所示的日志(Current Spring Boot Application is await
)即代表服務(wù)提供者啟動(dòng)完畢,標(biāo)志著該服務(wù)提供者可以對外提供服務(wù)了。
[Dubbo] Current Spring Boot Application is await...
然后是啟動(dòng)org.apache.dubbo.samples.client.Application
?,等待一會(huì)出現(xiàn)如下圖所示的日志(Hello world
?)即代表服務(wù)消費(fèi)端啟動(dòng)完畢并調(diào)用到服務(wù)端成功獲取結(jié)果。
文章來源:http://www.zghlxwxcb.cn/news/detail-657529.html
?
Receive result ======> Hello world
?
到了這里,關(guān)于Dubbo Spring Boot Starter 開發(fā)微服務(wù)應(yīng)用的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!