四個方面對比微服務(wù)注冊中心產(chǎn)品
不點藍字關(guān)注,我們哪來故事?

一致性(Consistency),所有節(jié)點在同一時間具有相同的數(shù)據(jù)
可用性(Availability),保證每個請求不管成功或者失敗都有響應(yīng)
分隔容忍(Partition tolerance),系統(tǒng)中任意信息的丟失或失敗不會影響系統(tǒng)的繼續(xù)運作

應(yīng)用內(nèi):直接集成到應(yīng)用中,依賴于應(yīng)用自身完成服務(wù)的注冊與發(fā)現(xiàn),最典型的是Netflix提供的Eureka
應(yīng)用外:把應(yīng)用當(dāng)成黑盒,通過應(yīng)用外的某種機制將服務(wù)注冊到注冊中心,最小化對應(yīng)用的侵入性,比如Airbnb的SmartStack,HashiCorp的Consul
DNS:將服務(wù)注冊為DNS的SRV記錄,嚴格來說,是一種特殊的應(yīng)用外注冊方式,SkyDNS是其中的代表
測活:服務(wù)注冊之后,如何對服務(wù)進行測活以保證服務(wù)的可用性?
負載均衡:當(dāng)存在多個服務(wù)提供者時,如何均衡各個提供者的負載?
集成:在服務(wù)提供端或者調(diào)用端,如何集成注冊中心?
運行時依賴:引入注冊中心之后,對應(yīng)用的運行時環(huán)境有何影響?
可用性:如何保證注冊中心本身的可用性,特別是消除單點故障?

| 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ù)中心 | 支持 | 支持 | 支持 | 不支持 | 不支持 |
| 跨注冊中心同步 | 支持 | 不支持 | 支持 | 不支持 | 不支持 |
| Spring Cloud集成 | 支持 | 支持 | 支持 | 不支持 | 支持 |
| Dubbo集成 | 支持 | 不支持 | 支持 | 不支持 | 支持 |
| Kubernetes集成 | 支持 | 不支持 | 支持 | 支持 | 不支持 |
Consul是支持自動注銷服務(wù)實例,請見文檔:https://www.consul.io/api-docs/agent/service,在check的 DeregisterCriticalServiceAfter 這個參數(shù)-- 感謝@超帥的菜鳥博主提供最新信息
新版本的Dubbo也擴展了對 Consul 的支持。參考:https://github.com/apache/dubbo/tree/master/dubbo-registry

Eureka不再從注冊表中移除因為長時間沒有收到心跳而過期的服務(wù);
Eureka仍然能夠接受新服務(wù)注冊和查詢請求,但是不會被同步到其它節(jié)點上(即保證當(dāng)前節(jié)點依然可用);
當(dāng)網(wǎng)絡(luò)穩(wěn)定時,當(dāng)前實例新注冊的信息會被同步到其它節(jié)點中。


服務(wù)注冊相比Eureka會稍慢一些。因為Consul的Raft協(xié)議要求必須過半數(shù)的節(jié)點都寫入成功才認為注冊成功
Leader掛掉時,重新選舉期間整個Consul不可用。保證了強一致性但犧牲了可用性。
服務(wù)注冊相對要快,因為不需要等注冊信息Replicate到其他節(jié)點,也不保證注冊信息是否Replicate成功
當(dāng)數(shù)據(jù)出現(xiàn)不一致時,雖然A,B上的注冊信息不完全相同,但每個Eureka節(jié)點依然能夠正常對外提供服務(wù),這會出現(xiàn)查詢服務(wù)信息時如果請求A查不到,但請求B就能查到。如此保證了可用性但犧牲了一致性。

推薦



