【java框架】SpringBoot(5)--SpringBoot整合分散式Dubbo+Zookeeper
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官網映象:https://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下載:https://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 --> <!-- https://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> <!-- https://mvnrepository.com/artifact/com.github.sgroschupf/zkclient --> <dependency> <groupId>com.github.sgroschupf</groupId> <artifactId>zkclient</artifactId> <version>0.1</version> </dependency> <!-- 日誌衝突 --> <!-- https://mvnrepository.com/artifact/org.apache.curator/curator-framework --> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-framework</artifactId> <version>2.12.0</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.curator/curator-recipes --> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-recipes</artifactId> <version>2.12.0</version> </dependency> <!-- https://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(); } }
成功呼叫可以看到遠端服務提供者方法已被呼叫:
本部落格寫作參考文件相關:
https://dubbo.apache.org/zh/docs/v2.7/user/preface/architecture/
https://www.kuangstudy.com/bbs/1355164021359243266
https://www.kuangstudy.com/bbs/1371400397700218882
示例程式碼已上傳至Github地址:
https://github.com/devyf/SpringBoot_Study/springboot_dubb