SpringCloud?Eureka服務(wù)治理之服務(wù)注冊服務(wù)發(fā)現(xiàn)
什么是Eureka
Netflix Eureka 是一款由 Netflix 開源的基于 REST 服務(wù)的注冊中心,用于提供服務(wù)發(fā)現(xiàn)功能。Spring Cloud Eureka 是 Spring Cloud Netflix 微服務(wù)套件的一部分,基于 Netflix Eureka 進行了二次封裝,主要負(fù)責(zé)完成微服務(wù)架構(gòu)中的服務(wù)治理功能。
Spring Cloud Eureka 是一個基于 REST 的服務(wù),并提供了基于 Java 的客戶端組件,能夠非常方便的將服務(wù)注冊到 Spring Cloud Eureka 中進行統(tǒng)一管理。
Eureka核心概念服務(wù)注冊和服務(wù)發(fā)現(xiàn)
服務(wù)注冊
- 注冊中心
拆開來看注冊和中心。注冊比如用戶注冊,就是將自己的信息注冊在某個平臺上。中心可以理解成一個統(tǒng)一管理信息的平臺。所以注冊中心顧名思義是統(tǒng)一管理所有注冊信息的平臺。
- 服務(wù)注冊
指的是服務(wù)在啟動時將自身的信息注冊到注冊中心中,方便信息進行統(tǒng)一管理。服務(wù)注冊是客戶端向注冊中心提交信息的動作。
服務(wù)發(fā)現(xiàn)
- 服務(wù)發(fā)現(xiàn)
指的是從注冊中心獲取對應(yīng)服務(wù)的信息,是客戶端向注冊中心拉取pull信息的動作。
Eureka實戰(zhàn)
- Eureka 的架構(gòu)主要分為 Eureka Server 和 Eureka Client 兩部分,Eureka Client 又分為 Applicaton Service 和 Application Client,Applicaton Service 就是服務(wù)提供者,Application Client 就是服務(wù)消費者。
- Eureka Client 會向 Eureka Server 發(fā)送請求,進行注冊,并將自己的一些信息發(fā)送給 Eureka Server。
- 注冊成功后,每隔一定的時間,Eureka Client 會向 Eureka Server 發(fā)送心跳來續(xù)約服務(wù),也就是匯報健康狀態(tài)。 如果客戶端長時間沒有續(xù)約,那么 Eureka Server 將在 90 秒(默認(rèn))內(nèi)從服務(wù)器注冊表中刪除客戶端的信息。
- Eureka Client 還會定期從 Eureka Server 拉取注冊表信息,然后通過Ribbon 組件根據(jù)負(fù)載均衡算法得到一個目標(biāo),并發(fā)起遠(yuǎn)程調(diào)用。
- 應(yīng)用正常停止時也會通知 Eureka Server 移除相關(guān)信息,信息成功移除后,其他客戶端會更新服務(wù)的信息,這樣就不會調(diào)用已經(jīng)下線的服務(wù)了,當(dāng)然這個會有延遲,有可能會調(diào)用到已經(jīng)失效的服務(wù),所以在客戶端會開啟失敗重試功能來避免這個問題。
- Eureka Server 會有多個節(jié)點組成一個集群,保證高可用。Eureka Server 沒有集成其他第三方存儲,而是存儲在內(nèi)存中,內(nèi)部維護一個注冊表的概念。
- 所以 Eureka Server 之間會將注冊信息復(fù)制到集群中的 Eureka Server 的所有節(jié)點。 這樣數(shù)據(jù)才是共享狀態(tài),任何的 Eureka Client 都可以在任何一個 Eureka Server 節(jié)點查找注冊表信息。
Eureka服務(wù)端單節(jié)點構(gòu)建
打開start.spring.io/ 或者阿里云的快速start start.aliyun.com/bootstrap.h… ,開始構(gòu)建對應(yīng)的服務(wù)端項目。推薦使用阿里云的快速start,因為訪問速度更快些。
自動生成完成后,在resource目錄下,新建application.yml
文件替換原來的application.properties
。內(nèi)容如下:
#應(yīng)用名稱 spring: application: name: eureka-server server: port: 8001 eureka: client: # 是否將自己實例注冊到Eureka Server中 register-with-eureka: false # 是否應(yīng)從Eureka Server獲取Eureka注冊表信息 fetch-registry: false
在SpringBoot的啟動類上添加@EnableEurekaServer 注解,表示是Eureka 服務(wù)端。 上述配置完成后,一個單節(jié)點的Eureka服務(wù)端就配置完成了,啟動效果如下:
訪問http://localhost:8761/ 可以進入eureka控制臺。
目前還沒有任何一個服務(wù)注冊到 Eureka 中,不過從上圖中,我們還是可以看到關(guān)于 Eureka 服務(wù)器內(nèi)存、CPU 、IP等的相關(guān)信息。
EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE。
圖中紅色警告翻譯為:緊急!Eureka已經(jīng)不能確認(rèn)這些已經(jīng)啟動的實例是否可用,由于最近的續(xù)訂次數(shù)小于續(xù)訂閾值(續(xù)訂期望值),為了安全起見(實例可用),當(dāng)前這些實例不會刪除。 這是因為Eureka進入自我保護模式(SELF PRESERVATION MODE)。
Eureka服務(wù)端集群構(gòu)建
單個 Eureka 服務(wù)可能存在的單點失效問題,我們通常都需要構(gòu)建一個 Eureka 服務(wù)器集群來確保注冊中心本身的可用性。與傳統(tǒng)的集群構(gòu)建方式不同,如果我們把 Eureka 也視為一個服務(wù),也就是說 Eureka服務(wù)自身也能注冊到其他 Eureka 服務(wù)上,從而實現(xiàn)相互注冊,并構(gòu)成一個集群。 同樣可以通過單節(jié)點構(gòu)建步驟構(gòu)建兩個Eureka Server服務(wù)A和B。對應(yīng)的yml配置如下:
server: port: 8761 eureka: instance: hostname: eurekaA client: serviceUrl: defaultZone: http:// eurekaB:8762/eureka/
server: port: 8762 eureka: instance: hostname: eurekaB client: serviceUrl: defaultZone: http://eurekaA:8761/eureka/
**eureka.instance.hostname **是Eureka 實例管理類配置項 ,用于指定當(dāng)前 Eureka 服務(wù)的主機名稱。 需要在本機的hosts文件中添加以下信息:
127.0.0.1 eurekaA
127.0.0.1 eurekaB
- 我們可以看到服務(wù)端A和B只調(diào)整了端口和地址的引用。構(gòu)建 Eureka 集群模式的關(guān)鍵點在于使用客戶端配置項
eureka.client.serviceUrl.defaultZone
用于指向集群中的其他 Eureka 服務(wù)器。 - 所以 Eureka 集群的構(gòu)建方式實際上就是將自己作為服務(wù)并向其他注冊中心注冊自己,這樣就形成了一組互相注冊的服務(wù)注冊中心以實現(xiàn)服務(wù)列表的同步。
- 這個場景下
register-with-eureka
(是否將自己實例注冊到Eureka Server中) 和fetch-registry
(是否應(yīng)從Eureka Server獲取Eureka注冊表信息)配置項應(yīng)該都使用其默認(rèn)的 true 值,我們不需要對其進行顯式的設(shè)置。 - 如果你嘗試使用本機搭建集群環(huán)境,顯然 eureka.instance.hostname 配置項中的 eureka1 和 eureka2 是無法訪問的,所以需要在本機hosts 文件中添加以下信息。
- 現(xiàn)在啟動這兩個 Eureka 服務(wù),然后分別打開 http://127.0.0.1:8761/ 和 http://127.0.0.1:8762/ 端點可以看到各自的服務(wù)注冊效果。
Eureka客戶端構(gòu)建
客戶端引入的pom坐標(biāo)有差異,需要引入客戶端坐標(biāo):
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
在啟動類上需要加@EnableDiscoveryClient
注解表示是Eureka客戶端。
@EnableDiscoveryClient @SpringBootApplication public class EurekaClientProviderApplication { public static void main(String[] args) { SpringApplication.run(EurekaClientProviderApplication.class, args); } }
yml配置如下:
spring: application: name: eureka-client server: port: 8081 eureka: client: serviceUrl: #指定eureka服務(wù)端地址,如果是集群則通過逗號分隔 defaultZone: http://localhost:8761/eureka/
配置完成后可以在eureka控制臺查看到相關(guān)注冊信息。
以上就是SpringCloud Eureka服務(wù)治理服務(wù)注冊和服務(wù)發(fā)現(xiàn)的詳細(xì)內(nèi)容,更多關(guān)于SpringCloud Eureka服務(wù)的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
基于EasyExcel實現(xiàn)百萬級數(shù)據(jù)導(dǎo)入導(dǎo)出詳解
大數(shù)據(jù)的導(dǎo)入和導(dǎo)出,相信大家在日常的開發(fā)、面試中都會遇到。本文將為大家詳細(xì)介紹一下如何利用EasyExcel實現(xiàn)百萬級數(shù)據(jù)導(dǎo)入導(dǎo)出,需要的可以參考一下2023-01-01jboss( WildFly)上運行 springboot程序的步驟詳解
這篇文章主要介紹了jboss( WildFly)上運行 springboot程序的步驟詳解,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-02-02java子類調(diào)用父類的方法中包含子類重寫的實例方法
在本篇文章里小編給大家整理了關(guān)于java子類調(diào)用父類的方法中包含子類重寫的實例方法以及相關(guān)知識點,需要的朋友們可以學(xué)習(xí)下。2019-09-09SpringBoot環(huán)境Druid數(shù)據(jù)源使用及特點
Druid 是目前比較流行的高性能的,分布式列存儲的OLAP框架(具體來說是MOLAP)。本文給大家分享SpringBoot環(huán)境Druid數(shù)據(jù)源使用及特點介紹,感興趣的朋友跟隨小編一起看看吧2021-07-07SpringBoot設(shè)置默認(rèn)主頁的方法步驟
這篇文章主要介紹了SpringBoot設(shè)置默認(rèn)主頁的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12