Springboot整合Dubbo+Nacos實(shí)現(xiàn)RPC調(diào)用的示例代碼
前言
隨著互聯(lián)網(wǎng)技術(shù)的飛速發(fā)展,越來越多的企業(yè)和開發(fā)者開始關(guān)注微服務(wù)架構(gòu)。微服務(wù)架構(gòu)可以將一個(gè)大型的應(yīng)用拆分成多個(gè)獨(dú)立、可擴(kuò)展、可維護(hù)的小型服務(wù),每個(gè)服務(wù)負(fù)責(zé)實(shí)現(xiàn)應(yīng)用的一部分功能。這種架構(gòu)方式可以提高開發(fā)效率,降低系統(tǒng)復(fù)雜度,方便團(tuán)隊(duì)協(xié)作,同時(shí)也有利于資源的合理利用和彈性伸縮。
在微服務(wù)架構(gòu)中,服務(wù)之間的通信是一個(gè)關(guān)鍵問題。傳統(tǒng)的HTTP通信方式在高并發(fā)、高性能的場景下存在性能瓶頸,因此,越來越多的開發(fā)者開始采用RPC(遠(yuǎn)程過程調(diào)用)技術(shù)來實(shí)現(xiàn)服務(wù)之間的通信。Dubbo是一款高性能、輕量級(jí)的開源Java RPC框架,它提供了豐富的服務(wù)治理功能,如服務(wù)注冊(cè)、服務(wù)發(fā)現(xiàn)、負(fù)載均衡、容錯(cuò)等,被廣泛應(yīng)用于微服務(wù)架構(gòu)中。
Nacos是阿里巴巴開源的一個(gè)動(dòng)態(tài)服務(wù)發(fā)現(xiàn)、配置管理和服務(wù)管理平臺(tái),它支持基于DNS和基于RPC的服務(wù)發(fā)現(xiàn),具有跨語言、跨平臺(tái)、靈活擴(kuò)展的特點(diǎn)。網(wǎng)上很多都是Springcloud整合Dubbo,本文講解如何將Spring Boot與Dubbo和Nacos整合,實(shí)現(xiàn)RPC調(diào)用。
快速上手
在實(shí)現(xiàn)DubboRPC服務(wù)調(diào)用時(shí),我們首先需要一個(gè)服務(wù)注冊(cè)中心,常用的服務(wù)注冊(cè)中心有Zookeeper,Nacos等,我們這里采用Nacos,沒有部署Nacos的請(qǐng)先自行教程部署,這里不細(xì)講
創(chuàng)建示例項(xiàng)目
我們這里創(chuàng)建兩個(gè)名為ProviderDemo和ConsumerDemo的項(xiàng)目
導(dǎo)入依賴
整合nacos和dubbo主要需要nacos-client和dubbo這兩項(xiàng)依賴
<!--這里對(duì)應(yīng)的Springboot版本為2.7.6--> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo</artifactId> <version>3.0.9</version> </dependency> <dependency> <groupId>com.alibaba.nacos</groupId> <artifactId>nacos-client</artifactId> <version>2.1.0</version> </dependency>
ProviderDemo的maven配置信息如下
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.luckysj</groupId> <artifactId>ProviderDemo</artifactId> <version>0.0.1-SNAPSHOT</version> <name>ProviderDemo</name> <description>ProviderDemo</description> <properties> <java.version>1.8</java.version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <spring-boot.version>2.7.6</spring-boot.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo</artifactId> <version>3.0.9</version> </dependency> <dependency> <groupId>com.alibaba.nacos</groupId> <artifactId>nacos-client</artifactId> <version>2.1.0</version> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>${spring-boot.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> </project>
ConsumerDemo的配置信息如下
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.luckysj</groupId> <artifactId>ConsumerDemo</artifactId> <version>0.0.1-SNAPSHOT</version> <name>ConsumerDemo</name> <description>ConsumerDemo</description> <properties> <java.version>1.8</java.version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <spring-boot.version>2.7.6</spring-boot.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo</artifactId> <version>3.0.9</version> </dependency> <dependency> <groupId>com.alibaba.nacos</groupId> <artifactId>nacos-client</artifactId> <version>2.1.0</version> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>${spring-boot.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> </project>
編寫配置
consumerDemo項(xiàng)目的配置如下,注意把nacos信息更改為自己的
server: port: 7777 dubbo: application: #設(shè)置應(yīng)用的名稱 name: dubbo-springboot-consumer #qos監(jiān)控服務(wù)是否啟動(dòng) qos-enable: true #qos監(jiān)控服務(wù)端口 qos-port: 23456 qos-accept-foreign-ip: false #指定使用Dubbo協(xié)議,且端口設(shè)置為-1,表示隨機(jī)分配可用端口 protocol: name: dubbo port: -1 registry: #配置注冊(cè)中心為Nacos id: nacos-registry address: nacos://nacos服務(wù)的ip:nacos服務(wù)的端口 username: nacos賬戶 password: nacos密碼 parameters: namespace: f74484c1-02d8-4322-a50c-630bc814fe54 #nacos命名空間 group: dubbo-demo #nacos分組 config-center: timeout: 40000 #設(shè)置服務(wù)超時(shí)時(shí)間
providerDemo項(xiàng)目的配置如下
server: port: 6666 dubbo: application: #設(shè)置應(yīng)用的名稱 name: dubbo-springboot-provider qos-enable: true qos-port: 23444 qos-accept-foreign-ip: false #指定使用Dubbo協(xié)議,且端口設(shè)置為-1,表示隨機(jī)分配可用端口 protocol: name: dubbo port: -1 registry: #配置注冊(cè)中心為Nacos id: nacos-registry address: nacos://ip:端口 username: 賬戶 password: 密碼 parameters: namespace: f74484c1-02d8-4322-a50c-630bc814fe54 #nacos命名空間 group: dubbo-demo #nacos分組 config-center: timeout: 40000 #設(shè)置服務(wù)超時(shí)時(shí)間
添加啟動(dòng)類注解
我們要使用Dubbo服務(wù)的話需要在服務(wù)啟動(dòng)類上編寫@EnableDubbo注解(提供者項(xiàng)目和消費(fèi)者項(xiàng)目都需要)
編寫服務(wù)接口與服務(wù)實(shí)現(xiàn)類
我們?cè)赑rovider項(xiàng)目中provider包下新建服務(wù)接口與實(shí)現(xiàn)類
PrintService接口內(nèi)容如下
public interface PrintService { public void print(String str); }
PrintServiceImpl接口內(nèi)容如下,我們通過@DubboService注解暴露該服務(wù),
@DubboService public class PrintServiceImpl implements PrintService { @Override public void print(String str) { System.out.println("dubbo調(diào)用打印信息為" + str); } }
在服務(wù)消費(fèi)方項(xiàng)目中也定義相同的接口
public interface PrintService { public void print(String str); }
特別注意這里調(diào)用者與提供者的服務(wù)接口需要有相同的包路徑,否則無法找到對(duì)應(yīng)服務(wù),我們后續(xù)通過引入一個(gè)common項(xiàng)目來解決這個(gè)問題
在服務(wù)消費(fèi)方項(xiàng)目編寫一個(gè)測(cè)試接口,使用@DubboReference注解聲明引用的服務(wù)
@RestController @RequestMapping("/demo") public class DemoController { @DubboReference //聲明服務(wù)引用 private PrintService printService; @GetMapping("/test") public void testDubbo(String str){ System.out.println("consumer開始RPC調(diào)用provider服務(wù)"); printService.print(str); } }
訪問接口,測(cè)試兩項(xiàng)目之間的服務(wù)調(diào)用,可以看到我們ConsumerDemo項(xiàng)目通過Dubbo成功的調(diào)用了ProviderDemo項(xiàng)目
http://localhost:7777/demo/test?str=111
引入common項(xiàng)目
我們上面可以發(fā)現(xiàn)提供者和消費(fèi)者的服務(wù)接口必須在相同的包路徑下,十分的不優(yōu)雅,故我們可以新建一個(gè)common項(xiàng)目,在這個(gè)項(xiàng)目中定義雙方服務(wù)調(diào)用的接口,相當(dāng)于定義了一種規(guī)范,兩邊都采用common中的服務(wù)接口,這樣就不會(huì)因?yàn)榘窂讲煌瑢?dǎo)致dubbo找不到對(duì)應(yīng)服務(wù)
新建common項(xiàng)目
打包該項(xiàng)目到本地(云)倉庫中,在消費(fèi)者和提供者項(xiàng)目中引入該項(xiàng)目
雙方都使用common包內(nèi)的服務(wù)接口
測(cè)試接口,運(yùn)行正常,結(jié)束
總結(jié)
Dubbo是一個(gè)基于Java的RPC (遠(yuǎn)程過程調(diào)用)框架,比OpenFeign支持更多的通訊協(xié)議,且性能更高,更加適應(yīng)于大規(guī)模的分布式項(xiàng)目中。
以上就是Springboot整合Dubbo+Nacos實(shí)現(xiàn)RPC調(diào)用的示例代碼的詳細(xì)內(nèi)容,更多關(guān)于Springboot實(shí)現(xiàn)RPC調(diào)用的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
idea中springboot項(xiàng)目創(chuàng)建后追加依賴
在項(xiàng)目創(chuàng)建的時(shí)候選擇好依賴創(chuàng)建項(xiàng)目,之后追加依賴不是很方便,本文就來介紹一下idea中springboot項(xiàng)目創(chuàng)建后追加依賴,具有一定的參考價(jià)值,感興趣的可以了解一下2024-03-03LambdaQueryWrapper與QueryWrapper的使用方式
這篇文章主要介紹了LambdaQueryWrapper與QueryWrapper的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05SpringMVC實(shí)現(xiàn)文件上傳與下載、攔截器、異常處理器等功能
這篇文章主要給大家介紹了關(guān)于SpringMVC實(shí)現(xiàn)文件上傳與下載、攔截器、異常處理器等功能的相關(guān)資料,這些功能在我們?nèi)粘i_發(fā)中經(jīng)常會(huì)遇到,本文通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2021-09-09Java將一個(gè)正整數(shù)分解質(zhì)因數(shù)的代碼
這篇文章主要介紹了將一個(gè)正整數(shù)分解質(zhì)因數(shù)。例如:輸入90,打印出90=2*3*3*5,需要的朋友可以參考下2017-02-02