SpringBoot+Dubbo+Nacos 開發(fā)實(shí)戰(zhàn)教程
Aug 15, 2023 pm 04:49 PMdubbo nacos Spring Boot
開發(fā)實(shí)戰(zhàn)。本文不會(huì)講述太多的理論的知識(shí),會(huì)寫一個(gè)最簡(jiǎn)單的例子來說明dubbo如何與nacos整合,快速建構(gòu)開發(fā)環(huán)境。文章目錄
環(huán)境準(zhǔn)備 dubbo簡(jiǎn)介 Nacos環(huán)境準(zhǔn)備 Nacos與dubbo整合 ##專案管理規(guī)格
dubbo整合nacos案例##建立公共介面模組
建立服務(wù)提供者模組建立服務(wù)消費(fèi)者模組
##服務(wù)呼叫測(cè)試

呼叫關(guān)係說明
#服務(wù)容器負(fù)責(zé)啟動(dòng),加載,運(yùn)行服務(wù)提供者。 服務(wù)提供者在啟動(dòng)時(shí),向註冊(cè)中心註冊(cè)自己提供的服務(wù)。 服務(wù)消費(fèi)者在啟動(dòng)時(shí),向註冊(cè)中心訂閱自己所需的服務(wù)。 註冊(cè)中心傳回服務(wù)提供者位址清單給消費(fèi)者,如果有變更,註冊(cè)中心將基於長(zhǎng)連線推送變更資料給消費(fèi)者。 服務(wù)消費(fèi)者,從提供者位址清單中,基於軟負(fù)載平衡演算法,選一臺(tái)提供者進(jìn)行調(diào)用,如果調(diào)用失敗,再選另一臺(tái)調(diào)用。 服務(wù)消費(fèi)者和提供者,在記憶體中累積呼叫次數(shù)和呼叫時(shí)間,定時(shí)每分鐘發(fā)送一次統(tǒng)計(jì)資料到監(jiān)控中心。
Nacos環(huán)境準(zhǔn)備
#啟動(dòng)nacos,本文使用的是nacos1 .4.3版本

開啟nacos的控制面板

Nacos與dubbo整合
為了方便大家理解,這裡寫出對(duì)應(yīng)的生產(chǎn)方、消費(fèi)方Demo 代碼,以及使用的註冊(cè)中心。

專案管理規(guī)格
#springboot,netflix和cloud alibaba之間有版本之間的對(duì)應(yīng)關(guān)係,本文所選的版本如下

dubbo和cloud alibaba之間有版本之間的對(duì)應(yīng)關(guān)係,本文選擇的版本如下

為了後續(xù)方便使用SpringCloud Alibaba
進(jìn)行開發(fā),首先建立一個(gè)pom類型的父項(xiàng)目,主要用於專案技術(shù)堆疊版本管理,建立一個(gè)maven項(xiàng)目,名稱為spring-cloud-alibaba-example
,去除src文件,修改pom文件
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>ah.wideth</groupId> <artifactId>spring-cloud-alibaba-example</artifactId> <version>1.0-SNAPSHOT</version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.12.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <packaging>pom</packaging> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <java.version>1.8</java.version> <spring-cloud.version>Hoxton.SR12</spring-cloud.version> <com-alibaba-cloud.version>2.2.7.RELEASE</com-alibaba-cloud.version> </properties> <!--對(duì)項(xiàng)目版本進(jìn)行管理--> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>${com-alibaba-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> </project>
後續(xù)創(chuàng)建的項(xiàng)目都放到此目錄下,只需要聲明groupId和artifactId,會(huì)自動(dòng)引用父項(xiàng)目spring-cloud-alibaba-example
的版本。與其說是父項(xiàng)目,不如說是根項(xiàng)目: 因?yàn)橄旅婷繉W(xué)習(xí)一個(gè)新的技術(shù),就會(huì)新建一個(gè)真正的父項(xiàng)目,而在對(duì)應(yīng)的父項(xiàng)目下面又會(huì)創(chuàng)建許多的子項(xiàng)目

dubbo整合nacos案例
本文的案例是在上文nacos開發(fā)實(shí)例的基礎(chǔ)之上繼續(xù)編寫的。下面開始建立我們的項(xiàng)目,貼上我的目錄結(jié)構(gòu)。

模組說明
public-api
公共接口模塊(接口),供服務(wù)消費(fèi)者和服務(wù)提供者調(diào)用。dubbo-provider
服務(wù)提供者模塊(接口實(shí)現(xiàn)類),引入了public-api
模塊dubbo-consumer
服務(wù)消費(fèi)者模塊(controller
),引入了public-api
模塊消費(fèi)者和提供者通過公共接口模塊進(jìn)行rpc遠(yuǎn)程調(diào)用
父工程pom文件
<?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> <parent> <artifactId>spring-cloud-alibaba-example</artifactId> <groupId>ah.wideth</groupId> <version>1.0-SNAPSHOT</version> </parent> <modules> <module>public-api</module> <module>dubbo-provider</module> <module>dubbo-consumer</module> </modules> <artifactId>dubbo-nacos-example</artifactId> <name>dubbo-nacos-example</name> <description>duboo與nacos整合的父工程</description> <packaging>pom</packaging> <properties> <java.version>1.8</java.version> <project.build.sourceEncoding>utf-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <dubbo.version>2.7.13</dubbo.version> <nacos.version>1.4.1</nacos.version> </properties> <dependencies> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <!--解決nacos-client2.0報(bào)錯(cuò)的問題--> <exclusions> <exclusion> <artifactId>nacos-client</artifactId> <groupId>com.alibaba.nacos</groupId> </exclusion> </exclusions> </dependency> <!--dubbo相關(guān)--> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>${dubbo.version}</version> </dependency> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-registry-nacos</artifactId> <version>${dubbo.version}</version> </dependency> <dependency> <groupId>com.alibaba.nacos</groupId> <artifactId>nacos-client</artifactId> <version>${nacos.version}</version> </dependency> <!-- 解決dubbo2.7.13jar包沖突問題--> <dependency> <groupId>com.alibaba.spring</groupId> <artifactId>spring-context-support</artifactId> <version>1.0.11</version> </dependency> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo</artifactId> <version>${dubbo.version}</version> <exclusions> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring</artifactId> </exclusion> <exclusion> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> </exclusion> <exclusion> <groupId>log4j</groupId> <artifactId>log4j</artifactId> </exclusion> </exclusions> </dependency> </dependencies> </project>

創(chuàng)建公共接口模塊
pom文件
<?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> <parent> <artifactId>dubbo-nacos-example</artifactId> <groupId>ah.wideth</groupId> <version>1.0-SNAPSHOT</version> </parent> <artifactId>public-api</artifactId> <name>public-api</name> <description>api公用接口</description> <packaging>jar</packaging> <properties> <java.version>1.8</java.version> <project.build.sourceEncoding>utf-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>

公共接口模塊里面只有一個(gè)接口,沒有配置文件,打jar包
package ah.wideth.api; /** * 讓生產(chǎn)者和服務(wù)消 * 費(fèi)者來使用這個(gè)接口 */ public interface InfoService { String getInfo(); }

創(chuàng)建服務(wù)提供者模塊
pom文件
<?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> <parent> <artifactId>dubbo-nacos-example</artifactId> <groupId>ah.wideth</groupId> <version>1.0-SNAPSHOT</version> </parent> <artifactId>dubbo-provider</artifactId> <name>dubbo-provider</name> <description>dubbo的服務(wù)提供者模塊</description> <properties> <java.version>1.8</java.version> <project.build.sourceEncoding>utf-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--引入公共接口模塊--> <dependency> <groupId>${project.groupId}</groupId> <artifactId>public-api</artifactId> <version>${project.version}</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
application.yml配置文件
server: port: 8180 spring: application: name: dubbo-provider dubbo: registry: address: nacos://127.0.0.1:8848 #注冊(cè)地址 application: name: dubbo-provider #應(yīng)用名 protocol: name: dubbo #dubbo協(xié)議 port: 20880 #協(xié)議端口 scan: base-packages: ah.wideth.impl #掃包范圍 provider: timeout: 30000 #超時(shí)時(shí)間
接口實(shí)現(xiàn)類,該類實(shí)現(xiàn)了上面我們?cè)诠步涌谀K創(chuàng)建的接口
package ah.wideth.impl; import ah.wideth.api.InfoService; import org.apache.dubbo.config.annotation.DubboService; import org.springframework.stereotype.Component; // dubbo提供的Service注解,用于聲明對(duì)外暴露服務(wù) // Service引入的是org.apache.dubbo.config.annotation.Service包 @Component @DubboService public class InfoServiceImpl implements InfoService { @Override public String getInfo() { return "hello,這里是dubbo-provider模塊!"; } }
服務(wù)提供者啟動(dòng)類
package ah.wideth; import org.apache.dubbo.config.spring.context.annotation.EnableDubbo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @EnableDubbo @EnableDiscoveryClient @SpringBootApplication public class DubboProviderApplication { public static void main(String[] args) { SpringApplication.run(DubboProviderApplication.class, args); System.out.println("dubbo服務(wù)提供者8180啟動(dòng)了"); } }
創(chuàng)建服務(wù)消費(fèi)者模塊
pom文件
<?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> <parent> <artifactId>dubbo-nacos-example</artifactId> <groupId>ah.wideth</groupId> <version>1.0-SNAPSHOT</version> </parent> <artifactId>dubbo-consumer</artifactId> <name>dubbo-consumer</name> <description>dubbo的服務(wù)消費(fèi)者模塊</description> <properties> <java.version>1.8</java.version> <project.build.sourceEncoding>utf-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--引入公共接口模塊--> <dependency> <groupId>${project.groupId}</groupId> <artifactId>public-api</artifactId> <version>${project.version}</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
application.yml配置文件
server: port: 8181 spring: application: name: dubbo-consumer dubbo: registry: address: nacos://127.0.0.1:8848 #注冊(cè)地址 application: name: dubbo-consumer #應(yīng)用名 consumer: timeout: 30000 #超時(shí)時(shí)間
controller,調(diào)用公共接口模塊創(chuàng)建的接口
package ah.wideth.controller; import ah.wideth.api.InfoService; import org.apache.dubbo.config.annotation.DubboReference; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class InfoController { //dumbo提供的Reference注解,用于調(diào)用遠(yuǎn)程服務(wù) @DubboReference(check = false) private InfoService infoService; @GetMapping("/getInfo") public String getInfo(){ return infoService.getInfo(); } }
服務(wù)消費(fèi)者啟動(dòng)類
package ah.wideth; import org.apache.dubbo.config.spring.context.annotation.EnableDubbo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @EnableDubbo @EnableDiscoveryClient @SpringBootApplication public class DubboConsumerApplication { public static void main(String[] args) { SpringApplication.run(DubboConsumerApplication.class, args); System.out.println("dubbo服務(wù)消費(fèi)者8181啟動(dòng)了"); } }
服務(wù)調(diào)用測(cè)試
打開Nacos控制面板查看注冊(cè)中心中的服務(wù)

啟動(dòng)nacos,啟動(dòng)服務(wù)提供者和服務(wù)消費(fèi)者,調(diào)用服務(wù)消費(fèi)者的getInfo方法,服務(wù)提供者會(huì)返回結(jié)果
本文小結(jié)
本文編寫了一個(gè)例子來對(duì)dubbo整合nacos進(jìn)行服務(wù)調(diào)用的例子,不過要注意jar包的沖突問題。
以上是SpringBoot+Dubbo+Nacos 開發(fā)實(shí)戰(zhàn)教程的詳細(xì)內(nèi)容。更多資訊請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

熱AI工具

Undress AI Tool
免費(fèi)脫衣圖片

Undresser.AI Undress
人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6
視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版
神級(jí)程式碼編輯軟體(SublimeText3)

Jasypt介紹Jasypt是一個(gè)java庫,它允許開發(fā)員以最少的努力為他/她的專案添加基本的加密功能,並且不需要對(duì)加密工作原理有深入的了解用於單向和雙向加密的高安全性、基於標(biāo)準(zhǔn)的加密技術(shù)。加密密碼,文本,數(shù)字,二進(jìn)位檔案...適合整合到基於Spring的應(yīng)用程式中,開放API,用於任何JCE提供者...添加如下依賴:com.github.ulisesbocchiojasypt-spring-boot-starter2. 1.1Jasypt好處保護(hù)我們的系統(tǒng)安全,即使程式碼洩露,也可以保證資料來源的

一、Redis實(shí)現(xiàn)分散式鎖原理為什麼需要分散式鎖在聊分散式鎖之前,有必要先解釋一下,為什麼需要分散式鎖。與分散式鎖相對(duì)就的是單機(jī)鎖,我們?cè)趯懚鄨?zhí)行緒程式時(shí),避免同時(shí)操作一個(gè)共享變數(shù)產(chǎn)生資料問題,通常會(huì)使用一把鎖來互斥以保證共享變數(shù)的正確性,其使用範(fàn)圍是在同一個(gè)進(jìn)程中。如果換做是多個(gè)進(jìn)程,需要同時(shí)操作一個(gè)共享資源,如何互斥?現(xiàn)在的業(yè)務(wù)應(yīng)用通常是微服務(wù)架構(gòu),這也意味著一個(gè)應(yīng)用會(huì)部署多個(gè)進(jìn)程,多個(gè)進(jìn)程如果需要修改MySQL中的同一行記錄,為了避免操作亂序?qū)е麦v數(shù)據(jù),此時(shí)就需要引入分佈式鎖了。想要實(shí)現(xiàn)分

1.自訂RedisTemplate1.1、RedisAPI預(yù)設(shè)序列化機(jī)制基於API的Redis快取實(shí)作是使用RedisTemplate範(fàn)本進(jìn)行資料快取操作的,這裡開啟RedisTemplate類,查看該類別的源碼資訊publicclassRedisTemplateextendsRedisAccessorimplementsRedisOperations,BeanClassLoaderAware{//聲明了value的各種序列化方式,初始值為空@NullableprivateRedisSe

springboot讀取文件,打成jar包後訪問不到最新開發(fā)出現(xiàn)一種情況,springboot打成jar包後讀取不到文件,原因是打包之後,文件的虛擬路徑是無效的,只能通過流去讀取。文件在resources下publicvoidtest(){Listnames=newArrayList();InputStreamReaderread=null;try{ClassPathResourceresource=newClassPathResource("name.txt");Input

在Springboot+Mybatis-plus不使用SQL語句進(jìn)行多表添加操作我所遇到的問題準(zhǔn)備工作在測(cè)試環(huán)境下模擬思維分解一下:創(chuàng)建出一個(gè)帶有參數(shù)的BrandDTO對(duì)像模擬對(duì)後臺(tái)傳遞參數(shù)我所遇到的問題我們都知道,在我們使用Mybatis-plus中進(jìn)行多表操作是極其困難的,如果你不使用Mybatis-plus-join這一類的工具,你只能去配置對(duì)應(yīng)的Mapper.xml文件,配置又臭又長(zhǎng)的ResultMap,然後再寫對(duì)應(yīng)的sql語句,這種方法雖然看上去很麻煩,但具有很高的靈活性,可以讓我們

SpringBoot和SpringMVC都是Java開發(fā)中常用的框架,但它們之間有一些明顯的差異。本文將探究這兩個(gè)框架的特點(diǎn)和用途,並對(duì)它們的差異進(jìn)行比較。首先,我們來了解一下SpringBoot。 SpringBoot是由Pivotal團(tuán)隊(duì)開發(fā)的,它旨在簡(jiǎn)化基於Spring框架的應(yīng)用程式的建立和部署。它提供了一種快速、輕量級(jí)的方式來建立獨(dú)立的、可執(zhí)行

一、@Import引入普通類別@Import引入普通的類別可以幫助我們把普通的類別定義為Bean。 @Import可以加入在@SpringBootApplication(啟動(dòng)類別)、@Configuration(配置類別)、@Component(組件類別)對(duì)應(yīng)的類別上。注意:@RestController、@Service、@Repository都屬於@Component@SpringBootApplication@Import(ImportBean.class)//透過@Import註解把ImportBean

在專案中,很多時(shí)候需要用到一些配置信息,這些信息在測(cè)試環(huán)境和生產(chǎn)環(huán)境下可能會(huì)有不同的配置,後面根據(jù)實(shí)際業(yè)務(wù)情況有可能還需要再做修改。我們不能將這些設(shè)定在程式碼中寫死,最好是寫到設(shè)定檔中,例如可以把這些資訊寫到application.yml檔案中。那麼,怎麼在程式碼裡取得或使用這個(gè)位址呢?有2個(gè)方法。方法一:我們可以透過@Value註解的${key}即可取得設(shè)定檔(application.yml)中和key對(duì)應(yīng)的value值,這個(gè)方法適用於微服務(wù)比較少的情形方法二:在實(shí)際專案中,遇到業(yè)務(wù)繁瑣,邏
