【java框架】SpringBoot(5)–SpringBoot整合分散式Dubbo+Zookeeper
- 2021 年 3 月 27 日
- 筆記
- springboot
1.理論概述
1.1.分散式
分散式系統是若干獨立電腦的集合,這些電腦對於用戶來講就像單個系統。
由多個系統集成成一個整體,提供多個功能,組合成一個板塊,用戶在使用上看起來是一個服務。(比如淘寶網)。
起源
分散式系統出現的原因是:用多個廉價的、普通的機器完成單個電腦無法完成的計算、存儲任務
分散式使用
只有單個節點處理能力無法滿足日益增長的計算、存儲任務的時候,且硬體的提升(記憶體、磁碟、CPU)高昂得不償失的時候,應用程式也不能進一步優化的時候,才考慮分散式。
因為分散式系統是建立在網路之上的軟體系統,網路是不安全不穩定的,所以會帶來單系統沒有的問題,為了解決這些問題,又引入更多的機制、協議,帶來更多的問題。
集群與分散式區別
【集群】:多個相同的微服務,提供同一個功能
【分散式】:多個不同功能的微服務,提供不同的功能
1.2.RPC
Remote Procedure Call 遠程過程調用
遠程調用另外一台機器上的方法,RPC只是一種理論,不是協議。
1.3.Dubbo
概念
Dubbo是一個高性能、輕量級、開源的Java RPC框架。
提供三大核心能力:面向介面的遠程方法調用、智慧容錯和負載均衡、服務自動註冊與發現。
執行流程
調用關係說明:
- 服務容器負責啟動,載入,運行服務提供者。
- 服務提供者在啟動時,向註冊中心註冊自己提供的服務。
- 服務消費者在啟動時,向註冊中心訂閱自己所需的服務。
- 註冊中心返回服務提供者地址列表給消費者,如果有變更,註冊中心將基於長連接推送變更數據給消費者。
- 服務消費者,從提供者地址列表中,基於軟負載均衡演算法,選一台提供者進行調用,如果調用失敗,再選另一台調用。
- 服務消費者和提供者,在記憶體中累計調用次數和調用時間,定時每分鐘發送一次統計數據到監控中心。
2.Linux下安裝zookeeper和dubbo-admin
軟體說明
zookeeper是一個分散式的,開放源碼的分散式應用程式協調服務,是Google的Chubby一個開源的實現,是Hadoop和Hbase的重要組件。它是一個為分散式應用提供一致性服務的軟體,提供的功能包括:配置維護、域名服務、分散式同步、組服務等。 (==類似於Eureka==)。
dubbo-admin是管理控制台,可以實現服務監控 (即查看註冊中心情況),不安裝也是可以的。
2.1.下載並安裝zookeeper
①到zookeeper官網鏡像://mirror.bit.edu.cn/apache/zookeeper/,下載zookeeper
注意3.5.x版本以上需要下載:
apache-zookeeper-3.5.9-bin.tar.gz 15-Jan-2021 03:46 9.2M
tar.gz是源碼包,執行啟動無法運行
②下載完畢後通過Xftp發送到Linux伺服器上的home目錄下(目錄可根據個人喜好),解壓並進入conf目錄下複製配置文件;
cp zoo.zoo_sample.cfg zoo.cfg
③需要同步修改zoo.cfg文件:
④返回上一層目錄並進入bin子目錄,執行命令:./zkServer.sh start
啟動zookeeper
操作zookeeper其餘命令:
./zkServer.sh stop ./zkServer.sh restart ./zkServer.sh status
啟動zookeeper過程中可能由於遠端Linux雲伺服器防火牆未關閉報:java.net.NoRouteToHostException: No route to host dubbo-admin,
需要關閉防火牆:解決方法
2.2.下載安裝dubbo-admin
①下載dubbo-admin並修改配置:
進入GitHub下載://github.com/apache/dubbo-admin/tree/master
解壓並修改application.properties文件,配置文件在dubbo-admin\src\main\resources
目錄下
②打包dubbo-admin項目,將dubbo-admin項目編譯打成jar包:
在項目目錄下執行cmd命令:
打包:
輸入命令:mvn clean package -Dmaven.test.skip=true
將項目target目錄下生成的jar上傳到Linux系統並執行java -jar dubbo-admin-0.0.1-SNAPSHOT.jar &
命令,開放7001埠,在瀏覽器便可訪問。
初始登錄賬戶和密碼都是root
3.SpringBoot整合Dubbo+Zookeeper
3.1.創建服務提供者provider
①先創建一個空項目,在空項目下以SpringBoot為基礎創建一個子模組。
②導入dubbo、zookeeper相關依賴包:
<!-- 導入依賴 Dubbo + Zookeeper --> <!-- //mvnrepository.com/artifact/org.apache.dubbo/dubbo-spring-boot-starter --> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>2.7.3</version> </dependency> <!-- //mvnrepository.com/artifact/com.github.sgroschupf/zkclient --> <dependency> <groupId>com.github.sgroschupf</groupId> <artifactId>zkclient</artifactId> <version>0.1</version> </dependency> <!-- 日誌衝突 --> <!-- //mvnrepository.com/artifact/org.apache.curator/curator-framework --> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-framework</artifactId> <version>2.12.0</version> </dependency> <!-- //mvnrepository.com/artifact/org.apache.curator/curator-recipes --> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-recipes</artifactId> <version>2.12.0</version> </dependency> <!-- //mvnrepository.com/artifact/org.apache.zookeeper/zookeeper --> <!--zookeeper的版本與自己安裝的保持一致--> <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.5.9</version> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </exclusion> </exclusions> </dependency>
application.properties配置:
server.port=8001
#服務應用名字
dubbo.application.name=provider-server
#註冊中心地址
dubbo.registry.address=zookeeper://139.155.203.191:2181
#哪些包下面的服務需要被註冊
dubbo.scan.base-packages=com.fengye.service
或yml格式:
server:
port: 8080
dubbo:
# 服務應用名字
application:
name: provider-server
# 註冊中心地址(zookeeper地址)
registry:
address: zookeeper://ip:2181
# 哪些服務要被註冊
scan:
base-packages: com.fengye.service
③創建介面並實現介面提供服務(模擬售票):
//介面 public interface TicketService { public String buyTicket(); } @Component //使用dubbo後盡量不要使用Service註解 @Service //標識可以被dubbo掃描到,項目啟動後就註冊到註冊中心 public class TicketServiceImpl implements TicketService { @Override public String buyTicket() { return "成功購票一張"; } }
④啟動此服務,便可以在dubbo-admin中發現服務:
3.2.創建服務消費者consumer
①第一步、第二步與provider模組創建、導入依賴坐標相同;
配置application.properties:
server.port=8002 #消費者去哪裡取服務需要暴露自己的名稱 dubbo.application.name=consumer-service #配置註冊中心的地址 dubbo.registry.address=zookeeper://139.155.203.191:2181
②創建消費者介面(必須和服務提供者介面方法名一樣,表示引用遠端、執行方法調用):
public interface TicketService { //定義和遠端服務提供者provider相同的介面名稱 public String buyTicket(); }
③創建消費者UserServie:
@Service public class UserService { //在消費者中使用dubbo訂閱遠程服務:使用dubbo提供的@Refence註解 @Reference private TicketService ticketService; public void getTicket(){ String ticket = ticketService.buyTicket(); System.out.println("從註冊中心拿到:" + ticket); } }
④啟動消費者服務,可以看到服務在dubbo-admin中已經註冊:
3.3.測試消費者遠程調用服務者拿數據
①在消費者方本地創建測試方法,執行方法:
@SpringBootTest class ConsumerServerApplicationTests { @Autowired private UserService userService; @Test void contextLoads() { //獲取售票數據 userService.getTicket(); } }
成功調用可以看到遠端服務提供者方法已被調用:
本部落格寫作參考文檔相關:
//dubbo.apache.org/zh/docs/v2.7/user/preface/architecture/
//www.kuangstudy.com/bbs/1355164021359243266
//www.kuangstudy.com/bbs/1371400397700218882
示例程式碼已上傳至Github地址:
//github.com/devyf/SpringBoot_Study/springboot_dubbo_zk