為什么要使用注冊中心?是eureka還是nacos?
來自丨CSDN
作者丨iloveoverfly
https://blog.csdn.net/new_com/article/details/112633748
為什么要使用注冊中心
有使用過ip:port地址直接調(diào)用服務的開發(fā)經(jīng)歷么?該段痛苦的經(jīng)歷在此處省略500字......,該種方式的缺點:
-
需要手動的維護所有的服務訪問ip地址列表。 -
單個服務實現(xiàn)負載均衡需要自己搭建,例如使用nginx負載均衡策略,或者基于容器化多實例部署單個服務,在實例之間做負載均衡。
使用注冊中心能夠實現(xiàn)服務治理,服務動態(tài)擴容,以及服務調(diào)用的負載均衡,完整調(diào)用鏈路示例如下:
-
服務提供者:向注冊中心根據(jù)服務名稱提供服務訪問的ip:port以及其他信息。 -
注冊中心:根據(jù)服務名稱,存儲對應的ip:port以及其他信息。 -
服務消費者:根據(jù)服務名向注冊中心獲取調(diào)用服務的ip:port以及其他相關的信息集合,然后根據(jù)負載均衡策略獲取最終的服務器ip:port訪問地址。
使用springcloud時,常用的是eureka和nacos作為注冊中心,如何選擇呢?
Eureka注冊中心
架構原理圖如下:
服務提供者
主動向注冊中心注冊,續(xù)約,下線,獲取注冊表。服務注冊成功后,定時向注冊中心發(fā)送心跳,保證服務不被剔除。
注冊中心
存儲服務實例,定時掃描注冊表,剔除過期的服務實例。通過同步復制方式實現(xiàn)高可用,先獲取注冊表,然后再向其他注冊中心注冊自己,屬于AP模式。在實際項目中,會根據(jù)環(huán)境,例如dev,test,prod配置不同的注冊中心集群,如果不同的項目使用統(tǒng)一的注冊中心,只能根據(jù)服務名稱做區(qū)分。
重點介紹一下Eureka自我保護機制。如果出現(xiàn)大量的服務實例過期被剔除,則注冊中心進入自我保護模式,注冊表中信息不再被剔除,目的是提高eureka的可用性。默認情況下,統(tǒng)計心跳失敗比例在 15 分鐘之內(nèi)是否低于 85%,如果低于 85%,Eureka Server 會將這些實例保護起來,讓這些實例不會過期。
講述一次慘痛的上線經(jīng)歷,錯誤描述如下:
當時服務部署成功,在Eureka注冊中心已經(jīng)顯示該服務已經(jīng)注冊成功,但是,前端請求經(jīng)過網(wǎng)關再轉發(fā)到該服務時,一直就沒有反應,服務調(diào)用一直不成功。nginx轉發(fā),網(wǎng)關轉發(fā)都在確認問題到底發(fā)生在哪里,幾經(jīng)折磨,在網(wǎng)關直接通過ip地址轉發(fā)到上線的服務,快速的解決該問題。后續(xù),復盤,應該Eureka的自我保護機制,導致的問題。在注冊中心注冊的服務是一個不可用的服務,但是,由于自我保護機制,Eureka Server沒有將無效的服務剔除。
后續(xù)的解決方法是,設置enableSelfPreservation=false關閉自我保護機制,把renewalPercentThreshold 比例降低,在Eureka Server端,如果出現(xiàn)無效的服務就會將該服務剔除。
nacos注冊中心
nacos是springcloud的擴展,注冊中心功能通過NacosDiscoveryClient 繼承DiscoveryClient,在springcloud中,與Eureka可以無侵入的切換。注冊中心可以手動剔除服務實例,通過消息通知客戶端更新緩存的實例信息,完整調(diào)用鏈路示例如下:
在spring cloud中引入nacos時,參考官網(wǎng)匹配具體的版本,如圖:
nacos重點需要了解下其領域模型Nacos 數(shù)據(jù)模型 Key 由三元組唯一確定, Namespace命名空間,分組group,service服務。詳情可以參考官網(wǎng)Nacos 架構。
nacos與Eureka相比優(yōu)勢如下:
-
nacos在自動或手動下線服務,使用消息機制通知客戶端,服務實例的修改很快響應;Eureka只能通過任務定時剔除無效的服務。 -
nacos可以根據(jù)namespace命名空間,DataId,Group分組,來區(qū)分不同環(huán)境(dev,test,prod),不同項目的配置。
-End-
最近有一些小伙伴,讓我?guī)兔φ乙恍?nbsp;面試題 資料,于是我翻遍了收藏的 5T 資料后,匯總整理出來,可以說是程序員面試必備!所有資料都整理到網(wǎng)盤了,歡迎下載!

面試題】即可獲取
