|
在 Spring Cloud 體系中,幾乎每個(gè)角色都會(huì)有兩個(gè)以上的產(chǎn)品提供選擇,比如在注冊(cè)中心有:Eureka、Consul、zookeeper、etcd 等;網(wǎng)關(guān)的產(chǎn)品有 Zuul、Spring Cloud Gateway 等。在注冊(cè)中心產(chǎn)品中,最常使用的是 Eureka 和 Consul,兩者各有特點(diǎn),企業(yè)可以根據(jù)自述項(xiàng)目情況來選擇。 前面給大家詳細(xì)介紹了 Eureka ,本節(jié)給大家介紹 Consul 的使用。 什么是ConsulConsul 是 HashiCorp 公司推出的開源產(chǎn)品,用于實(shí)現(xiàn)分布式系統(tǒng)的服務(wù)發(fā)現(xiàn)、服務(wù)隔離、服務(wù)配置,這些功能中的每一個(gè)都可以根據(jù)需要單獨(dú)使用,也可以同時(shí)使用所有功能。Consul 官網(wǎng)目前主要推 Consul 在服務(wù)網(wǎng)格中的使用。 與其它分布式服務(wù)注冊(cè)與發(fā)現(xiàn)的方案相比,Consul 的方案更“一站式”——內(nèi)置了服務(wù)注冊(cè)與發(fā)現(xiàn)框架、分布一致性協(xié)議實(shí)現(xiàn)、健康檢查、Key/Value 存儲(chǔ)、多數(shù)據(jù)中心方案,不再需要依賴其它工具。Consul 本身使用 go 語言開發(fā),具有跨平臺(tái)、運(yùn)行高效等特點(diǎn),也非常方便和 Docker 配合使用。 Consul 的主要特點(diǎn)有: Health Checking: Consul 客戶端會(huì)定期發(fā)送一些健康檢查數(shù)據(jù)和服務(wù)端進(jìn)行通訊,判斷客戶端的狀態(tài)、內(nèi)存使用情況是否正常,用來監(jiān)控整個(gè)集群的狀態(tài),防止服務(wù)轉(zhuǎn)發(fā)到故障的服務(wù)上面。 KV Store: Consul 還提供了一個(gè)容易使用的鍵值存儲(chǔ)。這可以用來保持動(dòng)態(tài)配置,協(xié)助服務(wù)協(xié)調(diào)、建立 Leader 選舉,以及開發(fā)者想構(gòu)造的其它一些事務(wù)。 Secure Service Communication: Consul 可以為服務(wù)生成分布式的 TLS 證書,以建立相互的 TLS 連接。 可以使用 intentions 定義允許哪些服務(wù)進(jìn)行通信。 可以使用 intentions 輕松管理服務(wù)隔離,而不是使用復(fù)雜的網(wǎng)絡(luò)拓?fù)浜挽o態(tài)防火墻規(guī)則。 Multi Datacenter: Consul 支持開箱即用的多數(shù)據(jù)中心,這意味著用戶不需要擔(dān)心需要建立額外的抽象層讓業(yè)務(wù)擴(kuò)展到多個(gè)區(qū)域。 Consul 角色 Client: 客戶端, 無狀態(tài), 將 HTTP 和 DNS 接口請(qǐng)求轉(zhuǎn)發(fā)給局域網(wǎng)內(nèi)的服務(wù)端集群。 Consul 旨在對(duì) DevOps 社區(qū)和應(yīng)用程序開發(fā)人員友好,使其成為現(xiàn)代、彈性基礎(chǔ)架構(gòu)的理想選擇。 使用Consul 的優(yōu)勢(shì)使用 Raft 算法來保證一致性, 比復(fù)雜的 Paxos 算法更直接。相比較而言, zookeeper 采用的是 Paxos, 而 etcd 使用的則是 Raft。 支持多數(shù)據(jù)中心,內(nèi)外網(wǎng)的服務(wù)采用不同的端口進(jìn)行監(jiān)聽。多數(shù)據(jù)中心集群可以避免單數(shù)據(jù)中心的單點(diǎn)故障,而其部署則需要考慮網(wǎng)絡(luò)延遲, 分片等情況等。 zookeeper 和 etcd 均不提供多數(shù)據(jù)中心功能的支持。 支持健康檢查。 etcd 不提供此功能。 支持 http 和 dns 協(xié)議接口。 zookeeper 的集成較為復(fù)雜, etcd 只支持 http 協(xié)議。 官方提供 Web 管理界面, etcd 無此功能。 Consul 保持了 CAP 中的 CP,保持了強(qiáng)一致性和分區(qū)容錯(cuò)性。 Consul 支持 Http\gRPC\DNS 多種訪問方式。 Consul 的調(diào)用過程首先我們根據(jù)一張圖來了解一下 Consul 服務(wù)調(diào)用過程: 1、當(dāng) Producer 啟動(dòng)的時(shí)候,會(huì)向 Consul 發(fā)送一個(gè) post 請(qǐng)求,告訴 Consul 自己的 IP 和 Port; 2、Consul 接收到 Producer 的注冊(cè)后,每隔 10s(默認(rèn))會(huì)向 Producer 發(fā)送一個(gè)健康檢查的請(qǐng)求,檢驗(yàn) Producer 是否健康; 3、當(dāng) Consumer 發(fā)送 GET 方式請(qǐng)求 /api/address 到 Producer 時(shí),會(huì)先從 Consul 中拿到一個(gè)存儲(chǔ)服務(wù) IP 和 Port 的臨時(shí)表,從表中拿到 Producer 的 IP 和 Port 后再發(fā)送 GET 方式請(qǐng)求 /api/address; 4、該臨時(shí)表每隔 10s 會(huì)更新,只包含有通過了健康檢查的 Producer。 Spring Cloud Consul 項(xiàng)目是針對(duì) Consul 的服務(wù)治理實(shí)現(xiàn)。Consul 是一個(gè)分布式高可用的系統(tǒng),它包含多個(gè)組件,但是作為一個(gè)整體,在微服務(wù)架構(gòu)中,為我們的基礎(chǔ)設(shè)施提供服務(wù)發(fā)現(xiàn)和服務(wù)配置的工具。 Consul 和 eureka的對(duì)比我們先來通過一個(gè)表格做簡單對(duì)比
通過對(duì)比可以得知, Consul 功能更強(qiáng)大,Euerka 更容易使用。 Consul 強(qiáng)一致性?帶來的是: 服務(wù)注冊(cè)相比 Eureka 會(huì)稍慢一些。因?yàn)?Consul 的 raft 協(xié)議要求必須過半數(shù)的節(jié)點(diǎn)都寫入成功才認(rèn)為注冊(cè)成功,。Leader 掛掉時(shí),重新選舉期間整個(gè) Consul 不可用。保證了強(qiáng)一致性但犧牲了可用性。 Consul 強(qiáng)烈的一致性意味著它可以作為領(lǐng)導(dǎo)選舉和集群協(xié)調(diào)的鎖定服務(wù)。 Eureka 保證高可用(A)和最終一致性: 服務(wù)注冊(cè)相對(duì)要快,因?yàn)椴恍枰茸?cè)信息 replicate 到其它節(jié)點(diǎn),也不保證注冊(cè)信息是否 replicate 成功。當(dāng)數(shù)據(jù)出現(xiàn)不一致時(shí),雖然 A, B 上的注冊(cè)信息不完全相同,但每個(gè) Eureka 節(jié)點(diǎn)依然能夠正常對(duì)外提供服務(wù),這會(huì)出現(xiàn)查詢服務(wù)信息時(shí)如果請(qǐng)求 A 查不到,但請(qǐng)求 B 就能查到。如此保證了可用性但犧牲了一致性。 安裝ConsulConsul 不同于 Eureka 是由 go 語言開發(fā)而成,因此需要我們單獨(dú)來安裝。 打開 Consul官網(wǎng)根據(jù)不同的操作系統(tǒng)選擇最新的 Consul 版本,我們這里以 Windows 64 操作系統(tǒng)為例,可以看出 Consul 目前的最新版本為 1.4.4
cd 到對(duì)應(yīng)的目錄下,使用 cmd 啟動(dòng) Consul:
為了方便啟動(dòng),可以在同級(jí)目錄下創(chuàng)建一個(gè) run.bat 腳本來啟動(dòng),腳本內(nèi)容如下:
下次啟動(dòng)的時(shí)候直接雙擊 run.bat 文件即可;當(dāng)然也可以把 consul 的 exe 文件路徑加入到本機(jī)的 path 路徑下,這樣后期只需要在 cmd 命令行下運(yùn)行 執(zhí)行命令后,命令行會(huì)輸出如下信息: 啟動(dòng)成功之后訪問:localhost:8500,就可以看到Consul的管理界面 Consul 的 Web 管理界面有一些菜單,我們這里做一下簡單的介紹: Services,管理界面的默認(rèn)頁面,用來展示注冊(cè)到 Consul 的服務(wù),啟動(dòng)后默認(rèn)會(huì)有一個(gè) consul 服務(wù),也就是它本身。 Nodes,在 Services 界面雙擊服務(wù)名就會(huì)來到 Services 對(duì)于的 Nodes 界面,Services 是按照服務(wù)的抽象來展示的,Nodes 展示的是此服務(wù)的具體節(jié)點(diǎn)信息。比如啟動(dòng)了兩個(gè)訂單服務(wù)實(shí)例,Services 界面會(huì)出現(xiàn)一個(gè)訂單服務(wù),Nodes 界面會(huì)展示兩個(gè)訂單服務(wù)的節(jié)點(diǎn)。 Key/Value ,如果有用到 Key/Value 存儲(chǔ),可以在界面進(jìn)行配置、查詢。 ACL,全稱 Access Control List,為訪問控制列表的展示信息。 Intentions,可以在頁面配置請(qǐng)求權(quán)限。 當(dāng)我們看到這個(gè)頁面后,也就意味著 Consul 已經(jīng)安裝成功了。 總結(jié)本節(jié)為大家介紹了注冊(cè)中心的另外一個(gè)產(chǎn)品:Consul。介紹了 Consul 的特點(diǎn)、優(yōu)勢(shì),以及和 Eureka 對(duì)比有什么不同的特性,最后為大家展示了如何在 Windows 下安裝一個(gè) Consul 服務(wù)。下節(jié)為大家介紹 Consul 的架構(gòu)原理和實(shí)踐。 |
|
|