SpringBoot整合Dubbo+Zookeeper實(shí)現(xiàn)RPC調(diào)用
Spring Boot整合Dubbo+Zookeeper實(shí)現(xiàn)RPC調(diào)用
技術(shù)棧說(shuō)明
Dubbo:Dubbo作為RPC框架,能在多個(gè)服務(wù)之間實(shí)現(xiàn)遠(yuǎn)程服務(wù)的調(diào)用。比如有兩個(gè)獨(dú)立的微服務(wù)A和B,A服務(wù)想要調(diào)用B服務(wù)時(shí),因?yàn)閮烧卟辉谕瑐€(gè)內(nèi)存空間中,不能直接調(diào)用,所以可以通過(guò)Dubbo實(shí)現(xiàn)這點(diǎn)。
功能和Spring Cloud的Feign相同,兩者都是應(yīng)用于微服務(wù)架構(gòu)的遠(yuǎn)程調(diào)用框架
Zookeeper:作為注冊(cè)中心去管理Dubbo服務(wù),這點(diǎn)和Eureka、Nacos相同。
概述
通過(guò)一個(gè)示例說(shuō)明Dubbo+Zookeeper在Spring Boot中的應(yīng)用。
現(xiàn)有兩個(gè)服務(wù)provider和consumer,即生產(chǎn)者和消費(fèi)者:
實(shí)現(xiàn)步驟
- 搭建Zookeeper集群服務(wù)作為注冊(cè)中心(docker-compose)
- Spring Boot項(xiàng)目,添加依賴,并創(chuàng)建三個(gè)Module:
- api:提供Service接口,但不實(shí)現(xiàn)
- provider:實(shí)現(xiàn)api的Service接口
- consumer:調(diào)用api的Service接口,并對(duì)外提供訪問(wèn)接口
期望結(jié)果
調(diào)用consumer服務(wù)的訪問(wèn)接口,能訪問(wèn)到數(shù)據(jù),則說(shuō)明provider實(shí)現(xiàn)的服務(wù)成功注冊(cè)到zookeeper注冊(cè)中心,并被consumer獲取到。
實(shí)現(xiàn)
Zookeeper集群搭建(docker-compose)
zookeeper.yml:
version: "3" services: zk1: image: zookeeper network_mode: mynetwork container_name: zk1 restart: always hostname: zk1 # 端口映射,三個(gè)容器的對(duì)外端口是不同的 ports: - 2181:2181 - 8081:8080 # 路徑映射,路徑也要注意不同 volumes: - /etc/localtime:/etc/localtime - /home/mycontainers/zk1/data:/data - /home/mycontainers/zk1/datalog:/datalog environment: # 當(dāng)前zk實(shí)例的id - ZOO_MY_ID=1 # 整個(gè)zk集群的機(jī)器、端口列表 - ZOO_SERVERS=server.1=0.0.0.0:2888:3888;2181 server.2=zk2:2888:3888;2181 server.3=zk3:2888:3888;2181 zk2: image: zookeeper network_mode: mynetwork container_name: zk2 restart: always hostname: zk2 # 端口映射,三個(gè)容器的對(duì)外端口是不同的 ports: - 2182:2181 - 8082:8080 # 路徑映射,路徑也要注意不同 volumes: - /etc/localtime:/etc/localtime - /home/mycontainers/zk2/data:/data - /home/mycontainers/zk2/datalog:/datalog environment: # 當(dāng)前zk實(shí)例的id - ZOO_MY_ID=2 # 整個(gè)zk集群的機(jī)器、端口列表 - ZOO_SERVERS=server.1=zk1:2888:3888;2181 server.2=0.0.0.0:2888:3888;2181 server.3=zk3:2888:3888;2181 zk3: image: zookeeper network_mode: mynetwork container_name: zk3 restart: always hostname: zk3 # 端口映射,三個(gè)容器的對(duì)外端口是不同的 ports: - 2183:2181 - 8083:8080 # 路徑映射,路徑也要注意不同 volumes: - /etc/localtime:/etc/localtime - /home/mycontainers/zk3/data:/data - /home/mycontainers/zk3/datalog:/datalog environment: # 當(dāng)前zk實(shí)例的id - ZOO_MY_ID=3 # 整個(gè)zk集群的機(jī)器、端口列表 - ZOO_SERVERS=server.1=zk1:2888:3888;2181 server.2=zk2:2888:3888;2181 server.3=0.0.0.0:2888:3888;2181
啟動(dòng)服務(wù):
docker-compose -f zookeeper.yml up
訪問(wèn)Zookeeper:http://mylocalhost:8081/commands
有Json結(jié)果輸出表示Zookeeper服務(wù)啟動(dòng)成功。
Spring Boot添加Dubbo依賴
<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>2.3.4.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>3.1.0</version> </dependency> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-registry-zookeeper</artifactId> <version>3.1.0</version> </dependency> </dependencies> </dependencyManagement> <!--使用阿里云的Maven源--> <repositories> <repository> <id>aliyunmaven</id> <name>aliyun</name> <url>https://maven.aliyun.com/repository/public</url> </repository> </repositories>
dubbo-api代碼
僅提供接口,不提供實(shí)現(xiàn),讓provider去實(shí)現(xiàn)代碼,來(lái)驗(yàn)證provider和consumer之間的脫藕。
/service TimeService
package com.cc.service; import java.time.LocalDateTime; public interface TimeService { LocalDateTime getTime(); }
dubbo-provider代碼
provider和consumer的pom.xml是一致的:
<dependencies> <!--springboot啟動(dòng)器--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-registry-zookeeper</artifactId> </dependency> <dependency> <groupId>com.com.cc</groupId> <artifactId>dubbo-api</artifactId> <version>1.0-SNAPSHOT</version> </dependency> </dependencies>
application.yml
server: port: 8081 dubbo: application: name: provider-app registry: address: zookeeper://mylocalhost:2181
provider去實(shí)現(xiàn)類的接口,TimeServiceImpl.java:
package com.cc.service.impl; import com.cc.service.TimeService; import org.apache.dubbo.config.annotation.DubboService; import java.time.LocalDateTime; // 使用這個(gè)注解,可以將該接口實(shí)現(xiàn)注冊(cè)到注冊(cè)中心 @DubboService public class TimeServiceImpl implements TimeService { @Override public LocalDateTime getTime() { return LocalDateTime.now(); } }
啟動(dòng)類需要添加@EnableDubbo注解:
@EnableDubbo @SpringBootApplication public class ProviderApplication { public static void main(String[] args) { SpringApplication.run(ProviderApplication.class, args); } }
dubbo-consumer代碼
application.yml:
server: port: 8082 dubbo: application: name: consumer-app registry: address: zookeeper://mylocalhost:2181
對(duì)外提供訪問(wèn)接口:
@RestController public class ConsumerController { @DubboReference private TimeService timeService; @GetMapping("/") public String getTime() { return timeService.getTime().format(DateTimeFormatter.ISO_DATE_TIME); } }
記得添加@Dubbo注解:
@EnableDubbo @SpringBootApplication public class ConsumerApplication { public static void main(String[] args) { SpringApplication.run(ConsumerApplication.class, args); } }
驗(yàn)證
現(xiàn)在去訪問(wèn):http://localhost:8082/
有結(jié)果則表示驗(yàn)證通過(guò)。
到此這篇關(guān)于SpringBoot整合Dubbo+Zookeeper實(shí)現(xiàn)RPC調(diào)用的文章就介紹到這了,更多相關(guān)SpringBoot RPC調(diào)用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Springboot 整合 Dubbo/ZooKeeper 實(shí)現(xiàn) SOA 案例解析
- springBoot+dubbo+zookeeper實(shí)現(xiàn)分布式開發(fā)應(yīng)用的項(xiàng)目實(shí)踐
- springboot+dubbo+zookeeper的簡(jiǎn)單實(shí)例詳解
- IDEA整合Dubbo+Zookeeper+SpringBoot實(shí)現(xiàn)
- SpringBoot+Dubbo+Zookeeper實(shí)現(xiàn)簡(jiǎn)單分布式開發(fā)的應(yīng)用詳解
- SpringBoot中dubbo+zookeeper實(shí)現(xiàn)分布式開發(fā)的應(yīng)用詳解
- SpringBoot+Dubbo+Zookeeper知識(shí)整合過(guò)程詳解
相關(guān)文章
java并發(fā)編程中實(shí)現(xiàn)可見性的四種可行方案解析
這篇文章主要介紹了java并發(fā)編程中實(shí)現(xiàn)可見性的四種可行方案解析,使用關(guān)鍵字volatile和使用鎖(如synchronized關(guān)鍵字或者java.util.concurrent包中的鎖)來(lái)確保對(duì)共享變量的修改在多線程環(huán)境中能夠正確地被其他線程所觀察到,需要的朋友可以參考下2023-08-08SpringBoot項(xiàng)目統(tǒng)一枚舉轉(zhuǎn)換實(shí)踐過(guò)程
文章介紹了在Spring Boot項(xiàng)目中統(tǒng)一枚舉轉(zhuǎn)換的實(shí)踐,通過(guò)使用自定義的父枚舉接口和AttributeConverter、ConverterFactory、JsonSerializer和JsonDeserializer等工具,實(shí)現(xiàn)了枚舉與數(shù)據(jù)庫(kù)、請(qǐng)求參數(shù)、響應(yīng)參數(shù)和消息參數(shù)之間的自動(dòng)轉(zhuǎn)換2024-12-12Springcloud ribbon負(fù)載均衡算法實(shí)現(xiàn)
這篇文章主要介紹了Springcloud ribbon負(fù)載均衡算法實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04MyBatis之自查詢使用遞歸實(shí)現(xiàn) N級(jí)聯(lián)動(dòng)效果(兩種實(shí)現(xiàn)方式)
這篇文章主要介紹了MyBatis之自查詢使用遞歸實(shí)現(xiàn) N級(jí)聯(lián)動(dòng)效果,本文給大家分享兩種實(shí)現(xiàn)方式,需要的的朋友參考下吧2017-07-07Java編程二項(xiàng)分布的遞歸和非遞歸實(shí)現(xiàn)代碼實(shí)例
這篇文章主要介紹了Java編程二項(xiàng)分布的遞歸和非遞歸實(shí)現(xiàn)代碼實(shí)例,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01IDEA整合Dubbo+Zookeeper+SpringBoot實(shí)現(xiàn)
初學(xué)者,想自己動(dòng)手做一個(gè)簡(jiǎn)單的demo,本文主要介紹了IDEA整合Dubbo+Zookeeper+SpringBoot實(shí)現(xiàn),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-06-06詳解spring-boot集成elasticsearch及其簡(jiǎn)單應(yīng)用
本篇文章主要介紹了詳解spring-boot集成elasticsearch及其簡(jiǎn)單應(yīng)用,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06