一廓啊、概述
springcloud是一個非常優(yōu)秀的微服務(wù)框架避消,要管理眾多的服務(wù)给梅,就需要對這些服務(wù)進行治理刁憋,也就是我們說的服務(wù)治理
,服務(wù)治理
的作用就是在傳統(tǒng)的rpc遠程調(diào)用框架中杂彭,管理每個服務(wù)與每個服務(wù)之間的依賴關(guān)系当叭,可以實現(xiàn)服務(wù)調(diào)用、負載均衡盖灸、服務(wù)容錯蚁鳖、以及服務(wù)的注冊與發(fā)現(xiàn)。
? 如果微服務(wù)之間存在調(diào)用依賴赁炎,就需要得到目標(biāo)服務(wù)的服務(wù)地址醉箕,也就是微服務(wù)治理的服務(wù)發(fā)現(xiàn)
。要完成服務(wù)發(fā)現(xiàn)徙垫,就需要將服務(wù)信息存儲到某個載體讥裤,載體本身即是微服務(wù)治理的服務(wù)注冊中心
,而存儲到載體的動作即是服務(wù)注冊
姻报。
? springcloud支持的注冊中心有Eureka
己英、Zookeeper
、Consul
吴旋、Nacos
組件名稱 | 所屬公司 | 組件簡介 |
---|---|---|
Eureka | Netflix | springcloud最早的注冊中心损肛,目前已經(jīng)進入停更進維 了 |
Zookeeper | Apache | zookeeper是一個分布式協(xié)調(diào)工具,可以實現(xiàn)注冊中心功能 |
Consul | Hashicorp | Consul 簡化了分布式環(huán)境中的服務(wù)的注冊和發(fā)現(xiàn)流程荣瑟,通過 HTTP 或者 DNS 接口發(fā)現(xiàn)治拿。支持外部 SaaS 提供者等。 |
Nacos | Alibaba | Nacos 致力于幫助您發(fā)現(xiàn)笆焰、配置和管理微服務(wù)劫谅。Nacos 提供了一組簡單易用的特性集,幫助您快速實現(xiàn)動態(tài)服務(wù)發(fā)現(xiàn)、服務(wù)配置捏检、服務(wù)元數(shù)據(jù)及流量管理荞驴。 |
1.1 eureka
Spring Cloud Netflix 在設(shè)計 Eureka 時就緊遵AP原則,Eureka Server 也可以運行多個實例來構(gòu)建集群,解決單點問題贯城,但不同于 ZooKeeper 的選舉 leader 的過程熊楼,Eureka Server 采用的是Peer to Peer 對等通信。這是一種去中心化的架構(gòu)冤狡,無 master/slave 之分孙蒙,每一個 Peer 都是對等的。在這種架構(gòu)風(fēng)格中悲雳,節(jié)點通過彼此互相注冊來提高可用性挎峦,每個節(jié)點需要添加一個或多個有效的 serviceUrl 指向其他節(jié)點。每個節(jié)點都可被視為其他節(jié)點的副本合瓢。
在集群環(huán)境中如果某臺 Eureka Server 宕機坦胶,Eureka Client 的請求會自動切換到新的 Eureka Server 節(jié)點上,當(dāng)宕機的服務(wù)器重新恢復(fù)后晴楔,Eureka 會再次將其納入到服務(wù)器集群管理之中顿苇。當(dāng)節(jié)點開始接受客戶端請求時,所有的操作都會在節(jié)點間進行復(fù)制(replicate To Peer)操作税弃,將請求復(fù)制到該 Eureka Server 當(dāng)前所知的其它所有節(jié)點中纪岁。
Eureka的集群中,只要有一臺Eureka還在则果,就能保證注冊服務(wù)可用(保證可用性)幔翰,只不過查到的信息可能不是最新的(不保證強一致性)。除此之外西壮,Eureka還有一種自我保護機制遗增,如果在15分鐘內(nèi)超過85%的節(jié)點都沒有正常的心跳,那么Eureka就認為客戶端與注冊中心出現(xiàn)了網(wǎng)絡(luò)故障款青,此時會出現(xiàn)以下幾種情況:
- Eureka不再從注冊表中移除因為長時間沒有收到心跳而過期的服務(wù)做修;
- Eureka仍然能夠接受新服務(wù)注冊和查詢請求,但是不會被同步到其它節(jié)點上(即保證當(dāng)前節(jié)點依然可用)抡草;
- 當(dāng)網(wǎng)絡(luò)穩(wěn)定時饰及,當(dāng)前實例新注冊的信息會被同步到其它節(jié)點中;
因此渠牲,Eureka可以很好的應(yīng)對因網(wǎng)絡(luò)故障導(dǎo)致部分節(jié)點失去聯(lián)系的情況旋炒,而不會像zookeeper那樣使得整個注冊服務(wù)癱瘓
Eureka保證高可用(A)和最終一致性:
- 服務(wù)注冊相對要快,因為不需要等注冊信息replicate到其他節(jié)點签杈,也不保證注冊信息是否replicate成功
- 當(dāng)數(shù)據(jù)出現(xiàn)不一致時,雖然A, B上的注冊信息不完全相同,但每個Eureka節(jié)點依然能夠正常對外提供服務(wù)答姥,這會出現(xiàn)查詢服務(wù)信息時如果請求A查不到铣除,但請求B就能查到。如此保證了可用性但犧牲了一致性鹦付。
1.2 zookeeper
與 Eureka 有所不同尚粘,Apache Zookeeper 在設(shè)計時就緊遵CP原則,即任何時候?qū)?Zookeeper 的訪問請求能得到一致的數(shù)據(jù)結(jié)果敲长,同時系統(tǒng)對網(wǎng)絡(luò)分割具備容錯性郎嫁,但是 Zookeeper 不能保證每次服務(wù)請求都是可達的。從 Zookeeper 的實際應(yīng)用情況來看祈噪,在使用 Zookeeper 獲取服務(wù)列表時泽铛,如果此時的 Zookeeper 集群中的 Leader 宕機了,該集群就要進行 Leader 的選舉辑鲤,又或者 Zookeeper 集群中半數(shù)以上服務(wù)器節(jié)點不可用(例如有三個節(jié)點盔腔,如果節(jié)點一檢測到節(jié)點三掛了 ,節(jié)點二也檢測到節(jié)點三掛了月褥,那這個節(jié)點才算是真的掛了)弛随,那么將無法處理該請求。所以說宁赤,Zookeeper 不能保證服務(wù)可用性舀透。
1.3 consul
Consul 是 HashiCorp 公司推出的開源工具,用于實現(xiàn)分布式系統(tǒng)的服務(wù)發(fā)現(xiàn)與配置决左。Consul 使用 Go 語言編寫愕够,因此具有天然可移植性(支持Linux、windows和Mac OS X)哆窿。Consul 內(nèi)置了服務(wù)注冊與發(fā)現(xiàn)框架链烈、分布一致性協(xié)議實現(xiàn)、健康檢查挚躯、Key/Value 存儲强衡、多數(shù)據(jù)中心方案,不再需要依賴其他工具(比如 ZooKeeper 等)码荔,使用起來也較為簡單漩勤。
Consul 遵循CAP原理中的CP原則,保證了強一致性和分區(qū)容錯性缩搅,且使用的是Raft算法越败,比zookeeper使用的Paxos算法更加簡單。雖然保證了強一致性硼瓣,但是可用性就相應(yīng)下降了究飞,例如服務(wù)注冊的時間會稍長一些置谦,因為 Consul 的 raft 協(xié)議要求必須過半數(shù)的節(jié)點都寫入成功才認為注冊成功 ;在leader掛掉了之后亿傅,重新選舉出leader之前會導(dǎo)致Consul 服務(wù)不可用媒峡。
Consul強一致性(C)帶來的是:
服務(wù)注冊相比Eureka會稍慢一些。因為Consul的raft協(xié)議要求必須過半數(shù)的節(jié)點都寫入成功才認為注冊成功
Leader掛掉時葵擎,重新選舉期間整個consul不可用谅阿。保證了強一致性但犧牲了可用性。
1.4 Nacos
Nacos是阿里開源的酬滤,Nacos 支持基于 DNS 和基于 RPC 的服務(wù)發(fā)現(xiàn)签餐。Nacos除了服務(wù)的注冊發(fā)現(xiàn)之外,還支持動態(tài)配置服務(wù)盯串。動態(tài)配置服務(wù)可以讓您以中心化氯檐、外部化和動態(tài)化的方式管理所有環(huán)境的應(yīng)用配置和服務(wù)配置。動態(tài)配置消除了配置變更時重新部署應(yīng)用和服務(wù)的需要嘴脾,讓配置管理變得更加高效和敏捷男摧。配置中心化管理讓實現(xiàn)無狀態(tài)服務(wù)變得更簡單,讓服務(wù)按需彈性擴展變得更容易译打。 一句話概括就是Nacos = 注冊中心 + 配置中心耗拓。
二、功能異同
這四個組件雖然都實現(xiàn)了注冊中心的功能奏司,但是他們的功能和實現(xiàn)方式都有不同的地方乔询,也各有各的優(yōu)點,單從注冊中心方面來比價四個注冊中心(如果不了解CAP定理
可先閱讀下一章節(jié)):
2.1 基本實現(xiàn)不同
組件名稱 | 實現(xiàn)語言 | CAP | 健康檢查 |
---|---|---|---|
Eureka | Java |
AP | 可配 |
Zookeeper | Java |
CP | 支持 |
Consul | Golang |
CP | 支持 |
Nacos | Java |
AP | 支持 |
eureka就是個servlet程序,跑在servlet容器中; Consul則是go編寫而成韵洋。
2.2 功能支持度不同
Nacos | Eureka | Consul | CoreDNS | Zookeeper | |
---|---|---|---|---|---|
一致性協(xié)議 | CP+AP | AP | CP | — | CP |
健康檢查 | TCP/HTTP/MYSQL/Client Beat | Client Beat | TCP/HTTP/gRPC/Cmd | — | Keep Alive |
負載均衡策略 | 權(quán)重/metadata/Selector | Ribbon | Fabio | RoundRobin | — |
雪崩保護 | 有 | 有 | 無 | 無 | 無 |
自動注銷實例 | 支持 | 支持 | 不支持 | 不支持 | 支持 |
訪問協(xié)議 | HTTP/DNS | HTTP | HTTP/DNS | DNS | TCP |
監(jiān)聽支持 | 支持 | 支持 | 支持 | 不支持 | 支持 |
多數(shù)據(jù)中心 | 支持 | 支持 | 支持 | 不支持 | 不支持 |
跨注冊中心同步 | 支持 | 不支持 | 支持 | 不支持 | 不支持 |
SpringCloud集成 | 支持 | 支持 | 支持 | 不支持 | 不支持 |
Dubbo集成 | 支持 | 不支持 | 不支持 | 不支持 | 支持 |
K8S集成 | 支持 | 不支持 | 支持 | 支持 | 不支持 |
三竿刁、CAP定理
CAP原則又稱CAP定理,指的是在一個分布式系統(tǒng)中搪缨,一致性(Consistency)食拜、可用性(Availability)、分區(qū)容錯性(Partition tolerance)副编。CAP 原則指的是负甸,這三個要素最多只能同時實現(xiàn)兩點,不可能三者兼顧痹届。參考 阮一峰博客呻待。
-
Consistency 一致性
:所有數(shù)據(jù)備份,在同一時刻是否同樣的值队腐。(等同于所有節(jié)點訪問同一份最新的數(shù)據(jù)副本) -
Availability 可用性
:在集群中一部分節(jié)點故障后蚕捉,集群整體是否還能響應(yīng)客戶端的讀寫請求。(對數(shù)據(jù)更新具備高可用性) -
Partition Tolerance 容錯性
:以實際效果而言柴淘,分區(qū)相當(dāng)于對通信的時限要求迫淹。系統(tǒng)如果不能在時限內(nèi)達成數(shù)據(jù)一致性秘通,就意味著發(fā)生了分區(qū)的情況,必須就當(dāng)前操作在C和A之間做出選擇千绪。
CAP原則的精髓就是要么AP充易,要么CP梗脾,要么AC荸型,但是不存在CAP。如果在某個分布式系統(tǒng)中數(shù)據(jù)無副本炸茧, 那么系統(tǒng)必然滿足強一致性條件瑞妇, 因為只有獨一數(shù)據(jù),不會出現(xiàn)數(shù)據(jù)不一致的情況梭冠,此時C和P兩要素具備辕狰,但是如果系統(tǒng)發(fā)生了網(wǎng)絡(luò)分區(qū)狀況或者宕機,必然導(dǎo)致某些數(shù)據(jù)不可以訪問控漠,此時可用性條件就不能被滿足蔓倍,即在此情況下獲得了CP系統(tǒng),但是CAP不可同時滿足盐捷。
因此在進行分布式架構(gòu)設(shè)計時偶翅,必須做出取舍。當(dāng)前一般是通過分布式緩存中各節(jié)點的最終一致性來提高系統(tǒng)的性能碉渡,通過使用多節(jié)點之間的數(shù)據(jù)異步復(fù)制技術(shù)來實現(xiàn)集群化的數(shù)據(jù)一致性聚谁。通常使用類似 memcached 之類的 NOSQL 作為實現(xiàn)手段。雖然 memcached 也可以是分布式集群環(huán)境的滞诺,但是對于一份數(shù)據(jù)來說形导,它總是存儲在某一臺 memcached 服務(wù)器上。如果發(fā)生網(wǎng)絡(luò)故障或是服務(wù)器死機习霹,則存儲在這臺服務(wù)器上的所有數(shù)據(jù)都將不可訪問朵耕。由于數(shù)據(jù)是存儲在內(nèi)存中的,重啟服務(wù)器淋叶,將導(dǎo)致數(shù)據(jù)全部丟失阎曹。當(dāng)然也可以自己實現(xiàn)一套機制,用來在分布式 memcached 之間進行數(shù)據(jù)的同步和持久化爸吮,但是實現(xiàn)難度是非常大的
CAP定理關(guān)注的粒度是數(shù)據(jù)芬膝,而不是整體的架構(gòu)。
例如形娇,根據(jù)CAP定理將NoSql數(shù)據(jù)分成了滿足CA原則锰霜、滿足CP原則和滿足AP原則的三大類:
-
CA
-單點集群,滿足一致性可用性的系統(tǒng)桐早,擴展能力不強 -
CP
-滿足一致性和容錯性系統(tǒng)癣缅,性能不高 -
AP
-滿足可用性厨剪、容錯性的系統(tǒng),對一致性要求低一些友存。