eureka 作為 spring cloud 體系中最核心、預設的註冊中心元件,研究它的執行機制,有助於我們在工作中更好地使用它。
eureka(註冊中心)包含兩個元件:eureka server和eureka client。服務提供者和服務的消費者。
eureka負責管理、記錄服務提供者的資訊。服務呼叫者無需自己尋找服務,而是把自己的需求告訴eureka,然後eureka會把符合你需求的服務告訴你。
同時,服務提供方與eureka之間通過「心跳」
機制進行監控,當某個服務提供方出現問題,eureka自然會把它從服務列表中剔除。
這就實現了服務的自動註冊、發現、狀態監控。基本架構如下:
同時註冊中心服務端(eureka server)主要對外提供三個功能
(1)服務註冊:提供者啟動後,向eureka註冊自己資訊(位址,提供什麼服務),ureka server 會儲存該(eureka server 內部有二層快取機制來維護整個登錄檔)服務的資訊。
(3)同步狀態:通過註冊,心跳(續約)機制,和 eureka server 同步當前客戶端的狀態。
心跳(續約就是提供者定期通過http方式向eureka重新整理自己的狀態
註冊中心客戶端(eureka client)
eureka client 會拉取、更新和快取 eureka server 中的資訊。因此當所有的 eureka server 節點都宕掉,服務消費者依然可以使用快取中的資訊找到服務提供者,但是當服務有更改的時候會出現資訊不一致。
服務註冊(register)
服務的提供者,將自身註冊到註冊中心,服務提供者也是乙個 eureka client。當 eureka client 向 eureka server 註冊時,它提供自身的元資料,比如 ip 位址、埠,執行狀況指示符 url,主頁等。yml配置如下
register-with-eureka: true #服務啟動方啟動時,會檢測該引數是否為true,true會註冊給eureka
服務獲取(getregisty)eureka client 從伺服器獲取登錄檔資訊,並將其快取在本地。客戶端會使用該資訊查詢其他服務,從而進行遠端呼叫。該註冊列表資訊定期(每30秒鐘)更新一次。每次返回註冊列表資訊可能與 eureka client 的快取資訊不同,eureka client 自動處理。
eureka client 定時全量或者增量從註冊中心獲取服務登錄檔,並且將獲取到的資訊快取到本地 這裡應該為第一次全量,後面為定時增量。
如果由於某種原因導致註冊列表資訊不能及時匹配,eureka client 則會重新獲取整個登錄檔資訊。 eureka server 快取註冊列表資訊,整個登錄檔以及每個應用程式的資訊進行了壓縮,壓縮內容和沒有壓縮的內容完全相同。eureka client 和 eureka server 可以使用 json/xml 格式進行通訊。在預設情況下 eureka client 使用壓縮 json 格式來獲取註冊列表的資訊。獲取服務的引數示例如下:
fetch-registry: true #開啟拉取註冊後的服務
服務續約(renew)eureka client 會每隔 30 秒傳送一次心跳來續約。 通過續約來告知 eureka server 該 eureka client 執行正常,沒有出現問題。 預設情況下,如果 eureka server 在 90 秒內沒有收到 eureka client 的續約,server 端會將例項從其登錄檔中刪除,此時間可配置,一般情況不建議更改。服務續約中油兩個重要的引數是lease-renewal-interval-in-seconds和lease-expiration-duration-in-seconds,引數配置如下
eureka:
client:
service-url:
defaultzone:
instance:
lease-renewal-interval-in-seconds: 5 # 每隔5秒傳送一次心跳,服務續約任務的呼叫間隔時間,預設為30秒
lease-expiration-duration-in-seconds: 10 # 10秒不傳送就過期,服務失效的時間,預設為90秒。
服務剔除(eviction)當 eureka client 和 eureka server 不再有心跳時,eureka server 會將該服務例項從服務註冊列表中刪除,即服務剔除
服務下線(cancel)
eureka client 在程式關閉時向 eureka server 傳送取消請求。 傳送請求後,該客戶端例項資訊將從 eureka server 的例項登錄檔中刪除。該下線請求不會自動完成,需要以下**來進行手動完成。
discoverymanager.getinstance().shutdowncomponent();
遠端呼叫(remote call)當 eureka client 從註冊中心獲取到服務提供者資訊後,就可以通過 http 請求呼叫對應的服務;服務提供者有多個時,eureka client 客戶端會通過 ribbon 自動進行負載均衡。
預設情況下,如果 eureka server 在一定的 90s 內沒有接收到某個微服務例項的心跳,會登出該例項。但是在微服務架構下服務之間通常都是跨程序呼叫,網路通訊往往會面臨著各種問題,比如微服務狀態正常,網路分割槽故障,導致此例項被登出。
固定時間內大量例項被登出,可能會嚴重威脅整個微服務架構的可用性。為了解決這個問題,eureka 開發了自我保護機制,那麼什麼是自我保護機制呢?
eureka server 在執行期間會去統計心跳失敗比例在 15 分鐘之內是否低於 85%,如果低於 85%,eureka server 即會進入自我保護機制。eureka server會將當前的例項註冊資訊保護起來,同時提示乙個警告,一旦進入保護模式,eureka server將會嘗試保護其服務登錄檔中的資訊,不再刪除服務登錄檔中的資料。也就是不會登出任何微服務。eureka預設開啟自我保護,引數如下
eureka:
instance:
hostname: localhost
server:
enable-self-preservation: false #關閉自我保護機制
當註冊中心進入進入自我保護後,頁面會出現如下的字樣
同時服務會出現以下的情況:
(1 eureka 不再從註冊列表中移除因為長時間沒收到心跳而應該過期的服務
(2 eureka 仍然能夠接受新服務的註冊和查詢請求,但是不會被同步到其它節點上(即保證當前節點依然可用)
(3 當網路穩定時,當前例項新的註冊資訊會被同步到其它節點中
eureka 自我保護機制是為了防止誤殺服務而提供的乙個機制。當個別客戶端出現心跳失聯時,則認為是客戶端的問題,剔除掉客戶端;當 eureka 捕獲到大量的心跳失敗時,則認為可能是網路問題,進入自我保護機制;當客戶端心跳恢復時,eureka 會自動退出自我保護機制。
如果在保護期內剛好這個服務提供者非正常下線了,此時服務消費者就會拿到乙個無效的服務例項,即會呼叫失敗。對於這個問題需要服務消費者端要有一些容錯機制,如重試,斷路器等。
建議開發環境關閉自我保護,生產開啟自我保護。
乙個有關eureka的圖送給大家。
Read Write spinlock工作原理
1 假設臨界區內沒有任何的thread,這時候任何read thread或者write thread可以進入,但是只能是其一。2 假設臨界區內有乙個read thread,這時候新來的read thread可以任意進入,但是write thread不可以進入 3 假設臨界區內有乙個write thr...
selenium webdriver工作原理
1 啟動瀏覽器,selenium webdriver會將目標瀏覽器繫結帶特定的埠,啟動後的瀏覽器則作為webdriver的remote server 服務端 2 客戶端 也就是測試指令碼 傳送http請求給server端。通訊協議 the webdriver wire protocol,在http請...
uWSGI django nginx的工作原理流程
wsgi 一種實現python解析的通用介面標準 協議,是一種通用的介面標準或者介面協議,實現了python web程式與伺服器之間互動的通用性。利用它,web.py或bottle或者django等等的python web開發框架,就可以輕鬆地部署在不同的web server上了 uwsgi 同ws...