為什么要使用注冊(cè)中心?是eureka還是nacos?
來(lái)源:blog.csdn.net/new_com/article/details/112633748為什么要使用注冊(cè)中心 Eureka注冊(cè)中心 nacos注冊(cè)中心

為什么要使用注冊(cè)中心
有使用過(guò)ip:port地址直接調(diào)用服務(wù)的開發(fā)經(jīng)歷么?該段痛苦的經(jīng)歷在此處省略500字......,該種方式的缺點(diǎn):
需要手動(dòng)的維護(hù)所有的服務(wù)訪問(wèn)ip地址列表。 單個(gè)服務(wù)實(shí)現(xiàn)負(fù)載均衡需要自己搭建,例如使用nginx負(fù)載均衡策略,或者基于容器化多實(shí)例部署單個(gè)服務(wù),在實(shí)例之間做負(fù)載均衡。
使用注冊(cè)中心能夠?qū)崿F(xiàn)服務(wù)治理,(點(diǎn)擊下載2021年最新阿里p7面試題教程) 服務(wù)動(dòng)態(tài)擴(kuò)容,以及服務(wù)調(diào)用的負(fù)載均衡,完整調(diào)用鏈路示例如下:

服務(wù)提供者 :向注冊(cè)中心根據(jù)服務(wù)名稱提供服務(wù)訪問(wèn)的ip:port以及其他信息。 注冊(cè)中心 :根據(jù)服務(wù)名稱,存儲(chǔ)對(duì)應(yīng)的ip:port以及其他信息。 服務(wù)消費(fèi)者 :根據(jù)服務(wù)名向注冊(cè)中心獲取調(diào)用服務(wù)的ip:port以及其他相關(guān)的信息集合,然后根據(jù)負(fù)載均衡策略獲取最終的服務(wù)器ip:port訪問(wèn)地址。
使用springcloud時(shí),常用的是eureka和nacos作為注冊(cè)中心,如何選擇呢?
Eureka注冊(cè)中心
架構(gòu)原理圖如下:

服務(wù)提供者
主動(dòng)向注冊(cè)中心注冊(cè),續(xù)約,下線,獲取注冊(cè)表。服務(wù)注冊(cè)成功后,定時(shí)向注冊(cè)中心發(fā)送心跳,保證服務(wù)不被剔除。
注冊(cè)中心
存儲(chǔ)服務(wù)實(shí)例,定時(shí)掃描注冊(cè)表,剔除過(guò)期的服務(wù)實(shí)例。通過(guò)同步復(fù)制方式實(shí)現(xiàn)高可用,先獲取注冊(cè)表,然后再向其他注冊(cè)中心注冊(cè)自己,屬于AP模式。在實(shí)際項(xiàng)目中,會(huì)根據(jù)環(huán)境,例如dev,test,prod配置不同的注冊(cè)中心集群,如果不同的項(xiàng)目使用統(tǒng)一的注冊(cè)中心,只能根據(jù)服務(wù)名稱做區(qū)分。
重點(diǎn)介紹一下Eureka自我保護(hù)機(jī)制。如果出現(xiàn)大量的服務(wù)實(shí)例過(guò)期被剔除,則注冊(cè)中心進(jìn)入自我保護(hù)模式,注冊(cè)表中信息不再被剔除,目的是提高eureka的可用性。默認(rèn)情況下,統(tǒng)計(jì)心跳失敗比例在 15 分鐘之內(nèi)是否低于 85%,如果低于 85%,Eureka Server 會(huì)將這些實(shí)例保護(hù)起來(lái),讓這些實(shí)例不會(huì)過(guò)期。
講述一次慘痛的上線經(jīng)歷,錯(cuò)誤描述如下:
當(dāng)時(shí)服務(wù)部署成功,在Eureka注冊(cè)中心已經(jīng)顯示該服務(wù)已經(jīng)注冊(cè)成功,但是,前端請(qǐng)求經(jīng)過(guò)網(wǎng)關(guān)再轉(zhuǎn)發(fā)到該服務(wù)時(shí),一直就沒有反應(yīng),服務(wù)調(diào)用一直不成功。nginx轉(zhuǎn)發(fā),網(wǎng)關(guān)轉(zhuǎn)發(fā)都在確認(rèn)問(wèn)題到底發(fā)生在哪里,幾經(jīng)折磨,在網(wǎng)關(guān)直接通過(guò)ip地址轉(zhuǎn)發(fā)到上線的服務(wù),快速的解決該問(wèn)題。后續(xù),復(fù)盤,應(yīng)該Eureka的自我保護(hù)機(jī)制,導(dǎo)致的問(wèn)題。在注冊(cè)中心注冊(cè)的服務(wù)是一個(gè)不可用的服務(wù),但是,由于自我保護(hù)機(jī)制,Eureka Server沒有將無(wú)效的服務(wù)剔除。
后續(xù)的解決方法是,設(shè)置enableSelfPreservation=false關(guān)閉自我保護(hù)機(jī)制,把renewalPercentThreshold 比例降低,在Eureka Server端,如果出現(xiàn)無(wú)效的服務(wù)就會(huì)將該服務(wù)剔除。
nacos注冊(cè)中心
nacos是springcloud的擴(kuò)展,注冊(cè)中心功能通過(guò)NacosDiscoveryClient 繼承DiscoveryClient,在springcloud中,與Eureka可以無(wú)侵入的切換。注冊(cè)中心可以手動(dòng)剔除服務(wù)實(shí)例,通過(guò)消息通知客戶端更新緩存的實(shí)例信息,完整調(diào)用鏈路示例如下:

在spring cloud中引入nacos時(shí),參考官網(wǎng)匹配具體的版本,如圖:

nacos重點(diǎn)需要了解下其領(lǐng)域模型Nacos 數(shù)據(jù)模型 Key 由三元組唯一確定, Namespace命名空間,分組group,service服務(wù)。詳情可以參考官網(wǎng)Nacos 架構(gòu)。
nacos與Eureka相比優(yōu)勢(shì)如下:
nacos在自動(dòng)或手動(dòng)下線服務(wù),使用消息機(jī)制通知客戶端,服務(wù)實(shí)例的修改很快響應(yīng);Eureka只能通過(guò)任務(wù)定時(shí)剔除無(wú)效的服務(wù)。 nacos可以根據(jù)namespace命名空間,DataId,Group分組,來(lái)區(qū)分不同環(huán)境(dev,test,prod),不同項(xiàng)目的配置。
如有文章對(duì)你有幫助,
“在看”和轉(zhuǎn)發(fā)是對(duì)我最大的支持!
一款牛逼的Java面試題庫(kù),點(diǎn)擊下圖查看詳細(xì)內(nèi)容


