Eureka中的核心概念

2021-12-16 江南一點雨

本文是Spring Cloud系列的第四篇,前面三篇文章(使用Spring Cloud搭建服務註冊中心、使用Spring Cloud搭建高可用服務註冊中心、Spring Cloud中服務的發現與消費)我們帶大家搭建了服務註冊中心,向服務註冊中心註冊了服務,同時也發現和消費了服務。前面的文章我們是以實際代碼操作為主,這篇文章我想對前面三篇文章中涉及到的一些知識點再進行詳細的梳理,對於一些前面未涉及到的配置再做進一步的說明。

首先,通過前面三篇文章的學習,小夥伴們已經發現了Eureka服務治理體系中涉及到三個核心概念:服務註冊中心、服務提供者以及服務消費者,本文將從這三個方面來對Eureka服務治理體系進行一個詳細的說明。

服務提供者

Eureka服務治理體系支持跨平臺,雖然我們前文使用了Spring Boot來作為服務提供者,但是對於其他技術平臺只要支持Eureka通信機制,一樣也是可以作為服務提供者,換句話說,服務提供者既可以是Java寫的,也可以是python寫的,也可以是js寫的。這些服務提供者將自己註冊到Eureka上,供其它應用發現然後調用,這就是我們的服務提供者,服務提供者主要有如下一些功能:

服務註冊

服務提供者在啟動的時候會通過發送REST請求將自己註冊到Eureka Server上,同時還攜帶了自身服務的一些元數據信息。Eureka Server在接收到這個REST請求之後,將元數據信息存儲在一個雙層結構的Map集合中,第一層的key是服務名,第二層的key是具體服務的實例名,我們在上篇文章最後展示出來的截圖中,大家也可以看出一些端倪,如下:

 

同時,我們在服務註冊時,需要確認一下eureka.client.register-with-eureka=true配置是否正確,該值默認就為true,表示啟動註冊操作,如果設置為false則不會啟動註冊操作。

服務同步

再說服務同步之前,我先描述一個場景:首先我有兩個服務註冊中心,地址分別是http://localhost:1111和http://localhost:1112,然後我還有兩個服務提供者,地址分別是http://localhost:8080和http://localhost:8081,然後我將8080這個服務提供者註冊到1111這個註冊中心上去,將8081這個服務提供者註冊到1112這個註冊中心上去,此時我在服務消費者中如果只向1111這個註冊中心去查找服務提供者,那麼是不是只能獲取到8080這個服務而獲取不到8081這個服務?大家看下面一張圖:  

 

答案是服務消費者可以獲取到兩個服務提供者提供的服務。雖然兩個服務提供者的信息分別被兩個服務註冊中心所維護,但是由於服務註冊中心之間也互相註冊為服務,當服務提供者發送請求到一個服務註冊中心時,它會將該請求轉發給集群中相連的其他註冊中心,從而實現註冊中心之間的服務同步,通過服務同步,兩個服務提供者的服務信息我們就可以通過任意一臺註冊中心來獲取到。OK,下面我們來通過一個簡單的案例來驗證一下我們上面的理論:

eureka-server工程我們前面已經分別創建了application-peer1.properties和application-peer2.properties配置文件,如下:
application-peer1.properties:

spring.application.name=eureka-serverserver.port=1111eureka.instance.hostname=peer1eureka.client.register-with-eureka=trueeureka.client.service-url.defaultZone=http://peer2:1112/eureka/

application-peer2.properties:

spring.application.name=eureka-serverserver.port=1112eureka.instance.hostname=peer2eureka.client.register-with-eureka=trueeureka.client.service-url.defaultZone=http://peer1:1111/eureka/

然後我們通過下面兩行命令來啟動兩個服務註冊中心實例,如下:

java -jar eureka-server-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer1  java -jar eureka-server-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer2

然後我們給provider工程也創建兩個配置文件,分別為application-p1.properties和application-p2.properties,內容如下:

application-p1.properties:

spring.application.name=hello-serviceserver.port=8080eureka.client.service-url.defaultZone=http://peer1:1111/eureka

application-p2.properties:

spring.application.name=hello-serviceserver.port=8081eureka.client.service-url.defaultZone=http://peer2:1112/eureka

然後通過如下命令啟動兩個服務提供者的實例,如下:

java -jar provider-0.0.1-SNAPSHOT.jar --spring.profiles.active=p1  java -jar provider-0.0.1-SNAPSHOT.jar --spring.profiles.active=p2

OK,我們將8080這個服務註冊到1111這個服務註冊中心上去了,將8081這個服務註冊到1112這個服務註冊中心上去了。當兩個服務提供者都啟動成功之後,我們來看看兩個服務註冊中心的控制面板,如下:  、

 

 

最後我們再來看看ribbon-consumer的配置文件,如下:

spring.application.name=ribbon-consumerserver.port=9000eureka.client.service-url.defaultZone=http://peer1:1111/eureka

大家看到,我們運行消費端時只向1111那個服務註冊中心去獲取服務列表,但是在實際運行過程中8080和8081兩個服務提供者都有響應我們的請求,如下圖:

 

上面的日誌是8081列印的,下面的日誌是8080列印的,沒毛病。

服務續約

在註冊完服務之後,服務提供者會維護一個心跳來不停的告訴Eureka Server:「我還在運行」,以防止Eureka Server將該服務實例從服務列表中剔除,這個動作稱之為服務續約,和服務續約相關的屬性有兩個,如下:

eureka.instance.lease-expiration-duration-in-seconds=90  eureka.instance.lease-renewal-interval-in-seconds=30

第一個配置用來定義服務失效時間,默認為90秒,第二個用來定義服務續約的間隔時間,默認為30秒。

服務消費者

消費者主要是從服務註冊中心獲取服務列表,拿到服務提供者的列表之後,服務消費者就知道去哪裡調用它所需要的服務了,我們從下面幾點來進一步了解下服務消費者。

獲取服務

當我們啟動服務消費者的時候,它會發送一個REST請求給服務註冊中心來獲取服務註冊中心上面的服務提供者列表,而Eureka Server上則會維護一份只讀的服務清單來返回給客戶端,這個服務清單並不是實時數據,而是一份緩存數據,默認30秒更新一次,如果想要修改清單更新的時間間隔,可以通過eureka.client.registry-fetch-interval-seconds=30來修改,單位為秒(注意這個修改是在eureka-server上來修改)。另一方面,我們的服務消費端要確保具有獲取服務提供者的能力,此時要確保eureka.client.fetch-registry=true這個配置為true。

服務調用

服務消費者從服務註冊中心拿到服務提供者列表之後,通過服務名就可以獲取具體提供服務的實例名和該實例的元數據信息,客戶端將根據這些信息來決定調用哪個實例,我們之前採用了Ribbon,Ribbon中默認採用輪詢的方式去調用服務提供者,進而實現了客戶端的負載均衡。

服務下線

服務提供者在運行的過程中可能會發生關閉或者重啟,當服務進行正常關閉時,它會觸發一個服務下線的REST請求給Eureka Server,告訴服務註冊中心我要下線了,服務註冊中心收到請求之後,將該服務狀態置為DOWN,表示服務已下線,並將該事件傳播出去,這樣就可以避免服務消費者調用了一個已經下線的服務提供者了。

服務註冊中心

服務註冊中心就是Eureka提供的服務端,它提供了服務註冊與發現功能。

失效剔除

上面我們說到了服務下線問題,正常的服務下線發生流程有一個前提那就是服務正常關閉,但是在實際運行中服務有可能沒有正常關閉,比如系統故障、網絡故障等原因導致服務提供者非正常下線,那麼這個時候對於已經下線的服務Eureka採用了定時清除:Eureka Server在啟動的時候會創建一個定時任務,每隔60秒就去將當前服務提供者列表中超過90秒還沒續約的服務剔除出去,通過這種方式來避免服務消費者調用了一個無效的服務。

自我保護

我們在前三篇文章中給大家看的截圖上,都有這樣一個警告,如下圖:

   

這個警告實際上就是觸發了Eureka Server的自我保護機制。Eureka Server在運行期間會去統計心跳失敗比例在15分鐘之內是否低於85%,如果低於85%,Eureka Server會將這些實例保護起來,讓這些實例不會過期,但是在保護期內如果服務剛好這個服務提供者非正常下線了,此時服務消費者就會拿到一個無效的服務實例,此時會調用失敗,對於這個問題需要服務消費者端要有一些容錯機制,如重試,斷路器等。我們在單機測試的時候很容易滿足心跳失敗比例在15分鐘之內低於85%,這個時候就會觸發Eureka的保護機制,一旦開啟了保護機制,則服務註冊中心維護的服務實例就不是那麼準確了,此時我們可以使用eureka.server.enable-self-preservation=false來關閉保護機制,這樣可以確保註冊中心中不可用的實例被及時的剔除。

OK,以上就是我們對Eureka中服務註冊中心、服務提供者、服務消費者三個核心概念的一些理解,有問題歡迎留言討論。

更多JavaEE資料請關注公眾號:

 

以上。。

相關焦點

  • Spring Cloud學習筆記——Eureka Server服務搭建及集群部署
    服務治理在微服務架構中,服務治理是一個核心的內容。在git的配置倉庫中,新建兩個文件,eureka1-dev.yml和eureka2-dev.yml。eureka1-dev.yml內容如下:這說明,eurekaserver集群已經成功部署並運行。事實上,在本地開發中,我們可以通過一種更簡單的方式來消除單點的錯誤提醒,就是向自身註冊自己。application.yml中配置如下:
  • 以後的家務我承包了,eureka蒸汽清潔機SC3開箱評測
    今天開箱的這臺蒸汽拖把來自於eureka,eureka是一家來自美國的家居清潔品牌,成立於1909年。在這一個世紀中,eureka一直致力於深層清潔領域,在蒸汽吸塵器設計製造方面積澱了深厚的經驗。「eureka」這個品牌詞是古希臘語,字面意思是「我找到了!我發現了!」 或許eureka想和我們傳達的意思是:我終於找到這款清潔神器了!
  • eureka蒸汽清潔機評測:科技改變生活,還你潔淨
    隨著科技的進步,我們在家居生活中所使用的清掃工具也日新月異,各類高科技的清潔工具早已走進我們的生活之中,我們也在享受著科技進步帶給我們生活品質的提高。今天,小編在這裡要給大家帶來的則是一款全新的清潔工具:eureka蒸汽清潔機。eureka蒸汽清潔機是一款將現代科技與傳統動力相結合的家用清潔小幫手。
  • 「微服務架構」SpringCloud之Eureka(註冊中心集群篇)(三)
    eureka_register_service_master的application.properties配置如下server.port=7998 eureka.client.register-with-eureka
  • eureka蒸汽清潔機SC5測評:打造未來家,智能好幫手
    今天我就帶大家了解一款來自美國的eureka蒸汽清潔機SC5,eureka是一款來自於美國的品牌,已有百年以上歷史,專業做蒸汽清潔機,這款eureka蒸汽清潔機SC5也是在中國市場廣受好評。那麼蒸汽清潔機和普通的清潔用品有哪些不同呢?筆者下面帶大家一起去看看。
  • 一文搞懂註冊中心 zookeeper 和 eureka 中的CP和 AP
    前言在分布式架構中往往伴隨CAP的理論。因為分布式的架構,不再使用傳統的單機架構,多機為了提供可靠服務所以需要冗餘數據因而會存在分區容忍性P。冗餘數據的同時會在複製數據的同時伴隨著可用性A 和強一致性C的問題。是選擇停止可用性達到強一致性還是保留可用性選擇最終一致性。通常選擇後者。
  • eureka蒸汽清潔機SC5使用評測:還你一個潔淨的家
    恰巧筆者拿到了eureka蒸汽清潔機SC5,下面咱們就一起來體驗下~【開箱&外觀】eureka蒸汽清潔機SC5的包裝還是挺大氣的,採用沉穩的黑色為底色,正面印有產品示意圖以及一些產品賣點的宣傳標語,讓消費者直接從外包裝就能直觀了解到產品的特性。包裝箱側面印有的是SC5的一些基本參數。
  • 課題中核心概念的意思
    課題中核心概念的意思,就是對課題關鍵詞做一個解釋,可能是課題名稱中的特定概念,可能是課題名稱中的關鍵詞,也可能是課題名稱中公眾表述不清的詞組。課題中出現的核心概念,雖然在日常生活中看起來很熟悉,但要說出確切的意思又說不清楚。
  • 淺談考研英語閱讀中的核心概念
    而這種主題思想是以核心概念的形式體現出來的。我們在閱讀文章時,若能有意識地尋找核心概念,就會提高解題速度和準確率。  一、什麼是核心概念?  文章的核心概念,即全文論述的中心,又名中心詞,通常以名詞或名詞短語的形式出現。核心概念不一定是一個,有時是兩個,此時要注意兩個概念之間的區別和聯繫。  二、如何找核心概念?
  • 「份」核心概念
    發現份這個核心概念對低段的教師非常有用,其實很多很重要的核心概念,都是在一二年級讓學生直觀感受到的,真的非常贊。以下圖片是朱彥老師的繪製。      四年級出現了一道思維拓展題:一個蔬菜大棚新種了448株茄子和番茄,茄子的株樹是番茄的15倍。新種的茄子和番茄各多少株?
  • Eureka 源碼解析 —— 應用實例註冊發現(五)之過期
    EvictionTaskcom.netflix.eureka.registry.AbstractInstanceRegistry.EvictionTask,清理租約過期任務。evictionTaskRef.set(new EvictionTask());evictionTimer.schedule(evictionTaskRef.get(),serverConfig.getEvictionIntervalTimerInMs(),serverConfig.getEvictionIntervalTimerInMs());配置 eureka.evictionIntervalTimerInMs
  • 核心素養的概念與本質
    「核心素養」這個概念舶來於西方,英文詞是「Key ompetencies」。「Key」在英語中有「關鍵的」、「必不可少的」等含義。「Competencies」也可以直譯為「能力」,但從它所包含的內容看,譯成「素養」更為恰當。簡言之,「核心素養」就是「關鍵素養」。
  • 教育學核心概念的嬗變與重構
    在悠久的歷史文明發展進程中,中華民族形成了以學習、師表、民生等核心概念為主的「為學」「為師」和「為政」話語。教育學核心概念的嬗變與重構需要遵循文化邏輯、時代邏輯、實踐邏輯和學科邏輯。新時代的教育實踐需要進行教育學核心概念的重構,重新定義什麼是教育、什麼是學習、什麼是學校、什麼是教師。
  • 騰訊T9耗時69天整理出最全架構師進階核心知識點筆記
    Spring 中使用了哪些設計模式?AOP 核心概念解釋一下AOPAOP 主要應用場景有AOP源碼分析AOP使用哪種動態代理?>SpringMVCspringMVC流程:MybatisMybatis原理Mybatis一級緩存與二級緩存Zookeeper+eureka
  • 聽林培英老師核心概念的含義和梳理
    核心概念它有以下的特點:    首先,體現了這個學科的主要觀點和思維結構。其次是足以能夠組織或者解釋大量的現象或者數據,包含著大量的邏輯內容,有足夠的空間用於解釋概括或者推論推論。在學科教學中用於日常生活中常見的情況和環境,表達了學科在人類智力發展中所佔的地位。
  • 李松林:以大概念為核心的整合性教學
    首先,從認識論上看,大概念是在事實和經驗基礎上,對概念之間關係的抽象概括,是從事實、經驗和概念中簡明扼要地抽取和總括出來的共同本質特徵,因而常常是一門學科中處於更高層次的上位概念、居於中心地位的核心概念和藏於更深層次的本質概念。
  • 加快建構馬克思主義理論學科核心概念
    積極建構核心概念,是推動馬克思主義理論學科高質量發展的應有之義。核心概念是建構並形成社會科學學科體系的邏輯起點。正如經濟學的「商品」「成本—收益」、政治學的「權力」「國家」等核心概念在各自學科的學術研究中已成為共識。當下,馬克思主義理論學科研究關注的重點主要在理論創新、方法創新,而對核心概念建構的關注甚少,需要學界在這一領域不斷深化研究。
  • 幼兒數學核心概念(PDF+高清視頻)
    《幼兒數學核心概念》的作者,是一個由七人組成的埃裡克森兒童發展研究院的早期數學教育研究團隊。本書是該團隊長達七年的智慧的結晶。七年間,該團隊探索、開發出一組幼兒數學核心概念(Big Ideas of Early Mathematics)。
  • 化零為整:高中生物核心概念貫穿一線
    新課標倡導我們:在解決實際問題的過程中要深入理解生物學的核心概念。核心概念首先是科學概念,而不是可能錯誤的前科學概念。核心概念是位於學科中心的概念性知識。有人望文生義地把核心概念理解為重要的專有名詞,這是片面的。其實,核心概念包括了主幹概念、原理、理論、模型等的基本理解和認識,一般用陳述式命題表述更能反映對核心概念的理解。
  • 「學科核心素養」是個錯誤概念 ——兼談開展教育科研必須明確概念
    「核心素養是學生在接受相應學段的教育過程中,逐步形成的適應個人終生發展和社會發展需要的必備品格和關鍵能力」,「是所有學生應具有的共同素養,是最關鍵、最必要的共同素養」①,因此,它必然具有跨學科的性質。有很多人用起了「學科核心素養」這個概念,其中不少赫赫有名的專家。