【java框架】SpringBoot(5)--SpringBoot整合分布式Dubbo+Zookeeper


1.理論概述

1.1.分布式

分布式系統是若干獨立計算機的集合,這些計算機對於用戶來講就像單個系統。

由多個系統集成成一個整體,提供多個功能,組合成一個板塊,用戶在使用上看起來是一個服務。(比如淘寶網)。

 

起源

分布式系統出現的原因是:用多個廉價的、普通的機器完成單個計算機無法完成的計算、存儲任務

分布式使用

只有單個節點處理能力無法滿足日益增長的計算、存儲任務的時候,且硬件的提升(內存、磁盤、CPU)高昂得不償失的時候,應用程序也不能進一步優化的時候,才考慮分布式。

因為分布式系統是建立在網絡之上的軟件系統,網絡是不安全不穩定的,所以會帶來單系統沒有的問題,為了解決這些問題,又引入更多的機制、協議,帶來更多的問題。

集群與分布式區別

 

【集群】:多個相同的微服務,提供同一個功能

【分布式】:多個不同功能的微服務,提供不同的功能

 

1.2.RPC

Remote Procedure Call 遠程過程調用

遠程調用另外一台機器上的方法,RPC只是一種理論,不是協議。

 

1.3.Dubbo

概念

Dubbo是一個高性能、輕量級、開源的Java RPC框架。

提供三大核心能力:面向接口的遠程方法調用、智能容錯和負載均衡、服務自動注冊與發現。

執行流程

 

調用關系說明:

  1. 服務容器負責啟動,加載,運行服務提供者。
  2. 服務提供者在啟動時,向注冊中心注冊自己提供的服務。
  3. 服務消費者在啟動時,向注冊中心訂閱自己所需的服務。
  4. 注冊中心返回服務提供者地址列表給消費者,如果有變更,注冊中心將基於長連接推送變更數據給消費者。
  5. 服務消費者,從提供者地址列表中,基於軟負載均衡算法,選一台提供者進行調用,如果調用失敗,再選另一台調用。
  6. 服務消費者和提供者,在內存中累計調用次數和調用時間,定時每分鍾發送一次統計數據到監控中心。

 

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_dubbo_zk


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM