本文主要介紹 SpringBoot 集成Dubbo、Zookeeper
一、什么是分布式
在《分布式系統原則與范型》一書中有定義:“分布式體統是若干獨立計算機的集合,這些計算機對用戶來說就像單個相關的系統”;
分布式系統是由一組通過網路進行通信,為了完成共同的任務而協調作業的計算機節點組成的系統,分布式系統的出現是為了用廉價的、普通機器完成單個計算機無法完成的計算、存盤任務,其目的是利用更多的機器,處理更多的資料,
分布式系統(distributed system)是建立在網路之上的軟體系統,
首先需要明確的是,只有當單個節點的處理能力無法滿足日益層長的計算、存盤任務的時候,且硬體的提升(加記憶體、加磁盤、使用更好的CPU)高昂到得不償失的時候,應用程式也不能進一步優化的時候,我們才需要考慮分布式,因為,分布式系統要解決的問題本身就是和單機系統一樣的,而由于分布式系統多個節點、通過網路通信的拓撲結構,會引入很多單機系統沒有的問題,為了解決這些問題又會引入更多的機制、協調,帶來更多的問題,
在 Dubbo 官方檔案中用這樣的描述:

單一應用架構
當網站流量很小時,只需一個應用,將所有功能都部署在一起,以減少部署節點和成本,此時,用于簡化增刪改查作業量的資料訪問框架(ORM)是關鍵,

實用于小型管理系統,將所用功能都部署在一個功能里,簡單易用,
缺點:
1.性能擴展比較難;
2.不易于協同開發
3.不利于升級維護
垂直應用架構
當訪問量逐漸增大,單一應用增加機器帶來的加速度越來越小,提升效率的方法之一是將應用拆成互不相干的幾個應用,以提升效率,此時,用于加速前端頁面開發的Web框架(MVC)是關鍵,

通過切分業務來實作各個模塊獨立部署,降低了維護和部署的難度,團隊各司其職,更容易維護和管理,提高了可擴展性,
缺點:公用模塊無法重復利用,
分布式服務架構
當垂直應用越來越多,應用之間互動不可避免,將核心業務抽取出來,作為獨立的服務,逐漸形成穩定的服務中心,使前端應用能更快速的回應多變的市場需求,此時,用于提高業務復用及整合的分布式服務框架(RPC)是關鍵,

流動計算架構
當服務越來越多,容量的評估,小服務資源的浪費等問題逐漸顯現,此時需增加一個調度中心基于訪問壓力實時管理集群容量,提高集群利用率,此時,用于提高機器利用率的資源調度和治理中心(SOA)是關鍵,

- RPC
RPC(Remote Procedure Call)是指遠程程序呼叫,是一種行程間通信方式,它是一種技術思想,而不是規范,它允許程式呼叫另外一個地址空間(通常是共享網路的另一臺機器)的程序或函式,而不用程式員顯示編碼這個遠程呼叫的細節,即程式員無論是呼叫本地的還是遠程的函式,本質上撰寫的呼叫代碼基本相同,
RPC 基本原理:

步驟分析:

RPC的兩個核心:通訊和序列化,
二、Dubbo
隨著互聯網的發展,網站應用的規模不斷擴大,常規的垂直應用架構已經無法應對,分布式服務架構以及流動計算機架構勢在必行,急需一個治理系統確保架構有條不絮的演進,
Dubbo:Apache Dubbo |?d?b??| 提供了六大核心能力:面向介面代理的高性能RPC呼叫,智能容錯和負載均衡,服務自動注冊和發現,高度可擴展能力,運行期流量調度,可視化的服務治理與運維,
Dubbo官網:https://dubbo.apache.org/zh/

- Dubbo 要解決的需求

- Dubbo 架構

節點角色說明:
| 節點 | 角色說明 |
|---|---|
| Provider | 暴露服務的服務提供方 |
| Consumer | 呼叫遠程服務的服務消費方 |
| Registry | 服務注冊與發現的注冊中心 |
| Monitor | 統計服務的呼叫次數和呼叫時間的監控中心 |
| Container | 服務運行容器 |
呼叫關系說明:
0.服務容器負責啟動,加載,運行服務提供者,
1.服務提供者在啟動時,向注冊中心注冊自己提供的服務,
2.服務消費者在啟動時,向注冊中心訂閱自己所需的服務,
3.注冊中心回傳服務提供者地址串列給消費者,如果有變更,注冊中心將基于長連接推送變更資料給消費者,
4.服務消費者,從提供者地址串列中,基于軟負載均衡演算法,選一臺提供者進行呼叫,如果呼叫失敗,再選另一臺呼叫,
5.服務消費者和提供者,在記憶體中累計呼叫次數和呼叫時間,定時每分鐘發送一次統計資料到監控中心,
Dubbo 架構具有以下幾個特點,分別是連通性、健壯性、伸縮性、以及向未來架構的升級性,
三、Zookeeper
Dubbo 官方檔案推薦使用 Zookeeper 注冊中心,
ZooKeeper是一種針對分布式應用程式的高性能協調服務,它在一個簡單的界面中公開了公共服務,比如命名、配置管理、同步和組服務,這樣您就不必從頭開始撰寫它們,您可以使用現成的工具來實作共識、組管理、領匯入選舉和在場協議,你可以根據自己的具體需要來做,
Zookeeper 官網:https://zookeeper.apache.org/

1.Windows安裝Zookeeper
Zookeeper 下載:https://zookeeper.apache.org/releases.html

2.解壓后,進入 bin目錄(我這里是:E:\Zookeeper\apache-zookeeper-3.7.0-bin\bin)
用 cmd命令 或者 雙擊:zkServer.cmd,發現雙擊后會閃退,打開 zkServer.cmd 設定暫停 pause

繼續雙擊:zkServer.cmd,看到報錯資訊:
org.apache.zookeeper.server.quorum.QuorumPeerConfig$ConfigException: Error processing E:\Zookeeper\apache-zookeeper-3.7.0-bin\bin..\conf\zoo.cfg

解決:在 E:\Zookeeper\apache-zookeeper-3.7.0-bin\conf 中將 zoo_sample.cfg 復制一份,并重命名為 zoo.cfg

另外,在組態檔(zoo.cfg)中可以得到Zookeeper的默認埠號(clientPort=2181)等資訊:
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.臨時資料存盤目錄(可寫相對路徑)
dataDir=/tmp/zookeeper
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
## Metrics Providers
#
# https://prometheus.io Metrics Exporter
#metricsProvider.className=org.apache.zookeeper.metrics.prometheus.PrometheusMetricsProvider
#metricsProvider.httpPort=7000
#metricsProvider.exportJvmInfo=true
注意:dataDir= 臨時資料存盤目錄(可寫相對路徑)
3.雙擊:zkServer.cmd 發現輸出: - ZooKeeper audit is disabled.

查看原始碼發現日志由zookeeper.audit.enable開關控制

繼續查看,發現 zookeeper.audit.enable 變數,實際上是加載的系統變數

查看啟動腳本,發現call方法中可以設定變數值 "-Dzookeeper.audit.enable=true"

因為zookeeper新版本啟動的程序中,zookeeper新增的審核日志是默認關閉,所以控制臺輸出ZooKeeper audit is disabled,標準的修改方式應該是在zookeeper的組態檔zoo.cfg新增一行audit.enable=true即可,
4.雙擊:zkServer.cmd 后,不要關閉視窗,雙擊:zkCli.cmd
提示連接成功:Connecting to localhost:2181

5.使用 zkCli.cmd 測驗
ls / :列出Zookeeper 根下保存的所有節點

create -e /zhouzhou 1234 :創建一個zhouzhou節點,值為1234
get /zhouzhou :獲取zhouzhou節點的值

四、Windows 安裝 dubbo-admin
Dubbo 本身并不是一個服務軟體,它其實就是一個jar包,能夠幫助你的Java程式連接到Zookeeper,并利用Zookeeper消費、提供服務,但是為了讓用戶更好的管理監控眾多的Dubbo服務,官方提供了一個可視化的監控程式 dubbo-admin,這個監控程式不安裝也不影響使用,
1.下載 dubbo-admin
dubbo-admin下載地址:https://github.com/apache/dubbo-admin

(我下載的是:dubbo-admin-master)
2.解壓進入目錄
查看 E:\Dubbo-Admin\dubbo-admin-master\dubbo-admin\src\main\resources目錄下的 application.properties檔案

3.在專案目錄下打包 dubbo-admin(跳過測驗)
mvn clean package -Dmaven.test.skip=true
第一次打包的程序可能有點慢,需要耐心等待,

4.在 E:\Dubbo-Admin\dubbo-admin-master\dubbo-admin\target下生成了 dubbo-admin-0.0.1-SNAPSHOT.jar
5.cmd 執行
java -jar dubbo-admin-0.0.1-SNAPSHOT.jar
發現,程式一直在運行并在監聽,報出錯誤資訊:

6.打開 Zookeeper服務(zkServer.cmd)
7.觀察此時在執行 java -jar dubbo-admin-0.0.1-SNAPSHOT.jar 的視窗出現 State change: CONNECTED
8.訪問:http://localhost:7001/

輸入用戶名和密碼

五、 SpringBoot 集成Dubbo、Zookeeper
1.創建空專案 dubbo-zookeeper

注意事項:

2.創建 provider-server 模塊(撰寫一個簡單的服務)
匯入依賴:
<!--匯入依賴: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.9</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.github.sgroschupf/zkclient -->
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
<!--引入zookeeper會出現日志沖突-->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>5.1.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>5.1.0</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.6.2</version>
<!--排除 slf4j-log4j12-->
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
專案結構:

TicketService 介面
package com.zhou.service;
public interface TicketService {
public String getTicket();
}
TicketServiceImpl 實作類
package com.zhou.service;
import org.apache.dubbo.config.annotation.DubboService;
import org.springframework.stereotype.Component;
//zookeeper:服務注冊與發現
@DubboService//在專案一啟動就自動注冊到注冊中心
@Component
public class TicketServiceImpl implements TicketService{
@Override
public String getTicket() {
return "TicketService 為您服務!";
}
}
application.properties
server.port=8081
#服務中心的名字
dubbo.application.name=provider-server
#注冊中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
#哪些服務要被注冊
dubbo.scan.base-packages=com.zhou.service
測驗一下:
開啟 zooKeeper服務(雙擊:zkServer.cmd),然后,啟動 ProviderServerApplication

查看,可視化的監控程式 dubbo-admin
java -jar dubbo-admin-0.0.1-SNAPSHOT.jar
訪問:http://localhost:7001 查看 提供者

3.創建 consumer-server 模塊
匯入依賴:
<!--匯入依賴: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.9</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.github.sgroschupf/zkclient -->
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
<!--引入zookeeper會出現日志沖突-->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>5.1.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>5.1.0</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.6.2</version>
<!--排除 slf4j-log4j12-->
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
專案結構:

創建 UserService類
package com.zhou.service;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.stereotype.Service;
@Service //放到容器中
public class UserService {
//想拿到 provider-server 提供的票,要去注冊中心拿到服務
@DubboReference //參考 方式1:pom坐標;方式2:可以定義路徑完全相同的介面名
TicketService ticketService;
public void buyTicket(){
String ticket = ticketService.getTicket();
System.out.println("UserService拿到"+ticket);
}
}
方式2:定義路徑完全相同的介面名
TicketService 介面
package com.zhou.service;
public interface TicketService {
public String getTicket();
}
application.properties
server.port=8002
#消費者去哪里拿服務,需要暴露自己的名字
dubbo.application.name=consumer-server
#注冊中心的地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
啟動測驗

package com.zhou;
import com.zhou.service.UserService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class ConsumerServerApplicationTests {
@Autowired
UserService userService;
@Test
void contextLoads() {
userService.buyTicket();
}
}
控制臺輸出:UserService拿到TicketService 為您服務!

或則,啟動 ConsumerServerApplication程式:

訪問:http://localhost:7001/ 查看 消費者

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/271130.html
標籤:其他
