為什么要使用注冊中心
有使用過ip:port地址直接呼叫服務的開發經歷么?該段痛苦的經歷在此處省略500字......,該種方式的缺點:
- 需要手動的維護所有的服務訪問ip地址串列,
- 單個服務實作負載均衡需要自己搭建,例如使用nginx負載均衡策略,或者基于容器化多實體部署單個服務,在實體之間做負載均衡,
- 服務提供者:向注冊中心根據服務名稱提供服務訪問的ip:port以及其他資訊,
- 注冊中心:根據服務名稱,存盤對應的ip:port以及其他資訊,
- 服務消費者:根據服務名向注冊中心獲取呼叫服務的ip:port以及其他相關的資訊集合,然后根據負載均衡策略獲取最終的服務器ip:port訪問地址,
使用springcloud時,常用的是eureka和nacos作為注冊中心,如何選擇呢 ?(nacos eureka專案案例fhadmin.cn)
服務提供者
主動向注冊中心注冊,續約,下線,獲取注冊表,服務注冊成功后,定時向注冊中心發送心跳,保證服務不被剔除,
注冊中心
存盤服務實體,定時掃描注冊表,剔除過期的服務實體,通過同步復制方式實作高可用,先獲取注冊表,然后再向其他注冊中心注冊自己,屬于AP模式,在實際專案中,會根據環境,例如dev,test,prod配置不同的注冊中心集群,如果不同的專案使用統一的注冊中心,只能根據服務名稱做區分,
重點介紹一下Eureka自我保護機制,如果出現大量的服務實體過期被剔除,則注冊中心進入自我保護模式,注冊表中資訊不再被剔除,目的是提高eureka的可用性,默認情況下,統計心跳失敗比例在 15 分鐘之內是否低于 85%,如果低于 85%,Eureka Server 會將這些實體保護起來,讓這些實體不會過期,
講述一次慘痛的上線經歷,錯誤描述如下:
當時服務部署成功,在Eureka注冊中心已經顯示該服務已經注冊成功,但是,前端請求經過網關再轉發到該服務時,一直就沒有反應,服務呼叫一直不成功,nginx轉發,網關轉發都在確認問題到底發生在哪里,幾經折磨,在網關直接通過ip地址轉發到上線的服務,快速的解決該問題,
后續,復盤,應該Eureka的自我保護機制,導致的問題,在注冊中心注冊的服務是一個不可用的服務,但是,由于自我保護機制,Eureka Server沒有將無效的服務剔除,
后續的解決方法是,設定enableSelfPreservation=false關閉自我保護機制,把renewalPercentThreshold 比例降低,在Eureka Server端,如果出現無效的服務就會將該服務剔除,
nacos注冊中心
nacos是springcloud的擴展,注冊中心功能通過NacosDiscoveryClient 繼承DiscoveryClient,在springcloud中,與Eureka可以無侵入的切換,注冊中心可以手動剔除服務實體,通過訊息通知客戶端更新快取的實體資訊
nacos重點需要了解下其領域模型Nacos 資料模型 Key 由三元組唯一確定, Namespace命名空間,分組group,service服務,詳情可以參考官網Nacos 架構,
nacos與Eureka相比優勢如下:
- nacos在自動或手動下線服務,使用訊息機制通知客戶端,服務實體的修改很快回應;Eureka只能通過任務定時剔除無效的服務,
- nacos可以根據namespace命名空間,DataId,Group分組,來區分不同環境(dev,test,prod),不同專案的配置,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/382192.html
標籤:架構設計
