1. 程式人生 > >【java框架】SpringBoot(5)--SpringBoot整合分散式Dubbo+Zookeeper

【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_dubb