【Spring Cloud系列】- Eureka使用詳解
一、概述
Eureka2.0版本已經(jīng)停止維護,為什么要寫這篇博客重復(fù)已停止更新的中間件,其目的主要是:
- 認(rèn)識微服務(wù)注冊中心:雖然Eureka已經(jīng)停止維護,但微服務(wù)架構(gòu)在當(dāng)今非常流程,學(xué)習(xí)Eureka可以更好的理解微服務(wù)。
- 便于老舊系統(tǒng)維護:如果使用微服務(wù),公司一定會存在使用Eureka服務(wù)的應(yīng)用系統(tǒng),學(xué)習(xí)Eureka便于儲備老舊系統(tǒng)維護的能力。
二、Eureka簡介
Eureka是Netflix的一個子模塊,也是核心模塊之一。Eureka是一個基于REST的服務(wù),用于定位服務(wù),以實現(xiàn)云端中間層服務(wù)發(fā)現(xiàn)和故障轉(zhuǎn)移。
三、Eureka結(jié)構(gòu)與作用
Eureka結(jié)構(gòu)圖
Eureka采用CS(Client/Server,客戶端/服務(wù)器)架構(gòu),它包括以下兩大組件
- Eureka Server:Eureka 服務(wù)注冊中心,主要用于提供服務(wù)注冊功能。當(dāng)微服務(wù)啟動時,會將自己的服務(wù)注冊到 Eureka Server。Eureka Server 維護了一個可用服務(wù)列表,存儲了所有注冊到 Eureka Server 的可用服務(wù)的信息,這些可用服務(wù)可以在 Eureka Server 的管理界面中直觀看到。
- Eureka Client:Eureka 客戶端,通常指的是微服務(wù)系統(tǒng)中各個微服務(wù),主要用于和 Eureka Server 進行交互。在微服務(wù)應(yīng)用啟動后,Eureka Client 會向 Eureka Server 發(fā)送心跳(默認(rèn)周期為 30 秒)。若 Eureka Server 在多個心跳周期內(nèi)沒有接收到某個 Eureka Client 的心跳,Eureka Server 將它從可用服務(wù)列表中移除(默認(rèn) 90 秒)。
"心跳"是一段定時發(fā)送的自定義信息,讓對方知道自己"存活",以確保連接有效性,大部分CS架構(gòu)的應(yīng)用程序都采用心跳機制,服務(wù)端和客戶端都可以發(fā)送心跳。通常情況下客戶端發(fā)送請求心跳包給服務(wù)器端。服務(wù)器端判斷客戶端是否存活在線。
四、Eureka集群及與應(yīng)用關(guān)系
-
Eureka關(guān)系圖
-
Eureka 實現(xiàn)服務(wù)注冊與發(fā)現(xiàn)的流程
- 服務(wù)提供者(Eureka Client Provider)啟動時,把當(dāng)前服務(wù)器信息以服務(wù)名(spring.application.name)的方式注冊到注冊中心。
- 服務(wù)器消費者(Eureka Client Consumer)啟動時,也會注冊自己的服務(wù)名到注冊中心。
- 服務(wù)消費者(Consumer)注冊的同時會獲取一份可用的服務(wù)器列表。該列表中包含了所有注冊到服務(wù)注冊中心的服務(wù)信息(包含服務(wù)器提供者和自身服務(wù)信息)。
- 在獲得可用服務(wù)列表后,服務(wù)消費者通過HTTP或消息中間件遠程調(diào)用服務(wù)者提供服務(wù)。
服務(wù)中心(Eureka Server)是個十分重要的角色,他是服務(wù)提供者(Provider)和服務(wù)消費者(Consumer)之間的橋梁。服務(wù)提供者只有將自己的服務(wù)注冊到服務(wù)注冊中心才可能被服務(wù)消費者調(diào)用。而服務(wù)消費者也只有通過服務(wù)注冊中心獲取可用服務(wù)列表后,才能調(diào)用所需的服務(wù)。為保證應(yīng)用的高可用型;使用多個注冊中心,相互注冊保證任何一臺注冊中心故障不影響整個服務(wù)器中心向外提供服務(wù)。
五、Eureka注冊中心實現(xiàn)
-
pom.xml添加依賴
-
添加spring-boot-starter-parent依賴
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.6.RELEASE</version> <relativePath/> </parent>
-
添加依賴dependencyManagement
<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Hoxton.SR12</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
-
添加相關(guān)依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <version>3.0.5</version> <scope>test</scope> </dependency>
-
-
創(chuàng)建Eureka服務(wù)主類
package com.goyeer; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; //Eureka注冊中心注解 @EnableEurekaServer @SpringBootApplication public class EurekaService { public static void main(String[] args){ SpringApplication.run(EurekaService.class,args); } }
-
添加application配置信息
server: port: 30009 eureka: instance: #服務(wù)注冊中心實例的主機名 hostname: localhost client: #實例是否在eureka服務(wù)器上注冊自己的信息以供其他服務(wù)發(fā)現(xiàn),默認(rèn)為true register-with-eureka: false #此客戶端是否獲取eureka服務(wù)器注冊表上的注冊信息,默認(rèn)為true fetch-registry: false service-url: #與Eureka注冊服務(wù)中心的通信zone和url地址 defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ registerWithEureka: false fetchRegistry: false server: enable-self-preservation: false eviction-interval-timer-in-ms: 5000
六、Eureka客戶端
-
pom.xml添加依賴
pom文件可用直接使用Eureka服務(wù)端pom文件,只需要把spring-cloud-starter-netflix-eureka-server替換為spring-cloud-netflix-eureka-client
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-netflix-eureka-client</artifactId> </dependency>
-
創(chuàng)建Eureka服務(wù)主類
package com.awinic; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; @EnableEurekaClient @SpringBootApplication public class EurekaProviderClientApp { public static void main(String[] args){ SpringApplication.run(EurekaProviderClientApp.class,args); } }
-
添加application配置信息
server: port: 30001 eureka: instance: hostname: localhost client: #實例是否在eureka服務(wù)器上注冊自己的信息以供其他服務(wù)發(fā)現(xiàn),默認(rèn)為true register-with-eureka: true fetch-registry: false service-url: defaultZone: http://${eureka.instance.hostname}:30000/eureka/ registerWithEureka: false fetchRegistry: false
七、自我保護機制
Eureka在CAP理論當(dāng)中是屬于AP , 也就說當(dāng)產(chǎn)生網(wǎng)絡(luò)分區(qū)時,Eureka保證系統(tǒng)的可用性,但不保證系統(tǒng)里面數(shù)據(jù)的一致性,當(dāng)發(fā)生網(wǎng)絡(luò)分區(qū)的時候,Eureka-Server和Client端的通訊被終止,Eureka Server端接收不到Eureka Client續(xù)約請求,此時,如果直接將沒有收到心跳Eureka Client端自動剔除,那么就可能誤把正常的Eureka Client端給剔除。這個不符合AP理論,所有Eureka-Server會保留可能已宕機的Eureka Server端。從而保證了Eureka Server的健壯性,符合AP理論。
Eureka重要兩個變量:
this.expectedNumberOfRenewsPerMin = count * 2;
this.numberOfRenewsPerMinThreshold =(int) (this.expectedNumberOfRenewsPerMin * serverConfig.getRenewalPercentThreshold());
expectedNumberOfRenewsPerMin :每分鐘最大的續(xù)約數(shù)量,由于客戶端是每30秒續(xù)約一次,一分鐘就是續(xù)約2次, count代表的是客戶端數(shù)量。
所以這個變量的計算公式 : 客戶端數(shù)量*2
numberOfRenewsPerMinThreshold : 每分鐘最小續(xù)約數(shù)量, 使用expectedNumberOfRenewsPerMin * serverConfig.getRenewalPercentThreshold()。
serverConfig.getRenewalPercentThreshold()的默認(rèn)值為0.85 , 也就是說每分鐘的續(xù)約數(shù)量要大于85% 。
Eureka的自我保護機制,都是圍繞以上兩個變量實現(xiàn)的,如果每分鐘的續(xù)約數(shù)量小于numberOfRenewsPerMinThreshold,此時就會開啟自動保護機制。
在此期間,Eureka Server不會主動剔除任何一個客戶端。
八、總結(jié)
Eureka 是Spring Cloud核心它提供一下幾個主要的服務(wù):文章來源:http://www.zghlxwxcb.cn/news/detail-488659.html
- 服務(wù)注冊和發(fā)現(xiàn):eureka 分客戶端(Eureka Client)和服務(wù)端(Eureka Server),服務(wù)端即為注冊中心,提供服務(wù)注冊和發(fā)現(xiàn)的功能。所有客戶端將自己注冊到注冊中心上,服務(wù)端使用 Map 結(jié)構(gòu)基于內(nèi)存保存所有客戶端信息(IP、端口、續(xù)約等信息)??蛻舳硕〞r從注冊中心拉取注冊表到本地,就可以通過負(fù)載均衡的方式進行服務(wù)間的調(diào)用。
- 服務(wù)注冊(Register):Eureka Client 啟動時向 Eureka Server 注冊,并提供自身的元數(shù)據(jù)、IP地址、端口、狀態(tài)等信息。
-
服務(wù)續(xù)約(Renew):Eureka Client 默認(rèn)每隔
30秒
向 Eureka Server 發(fā)送一次心跳進行服務(wù)續(xù)約,通過續(xù)約告知 Eureka Server 自己是正常的。如果 Eureka Server180秒
沒有收到客戶端的續(xù)約,就會認(rèn)為客戶端故障,并將其剔除。 -
抓取注冊表(Fetch Registry):Eureka Client 啟動時會向 Eureka Server 全量抓取一次注冊表到本地,之后會每隔
30秒
增量抓取注冊表合并到本地注冊表。如果合并后的本地注冊表與 Eureka Server 端的注冊表不一致(hash 比對),就全量抓取注冊表覆蓋本地的注冊表。 - 服務(wù)下線(Cancel):Eureka Client 程序正常關(guān)閉時,會向 Eureka Server 發(fā)送下線請求,之后 Eureka Server 將這個實例從注冊表中剔除。
-
故障剔除(Eviction):默認(rèn)情況下,Eureka Client 連續(xù)
180秒
沒有向 Eureka Server 發(fā)送續(xù)約請求,就會被認(rèn)為實例故障,然后從注冊表剔除。 -
Eureka Server 集群:Eureka Server 采用對等復(fù)制模式(
Peer to Peer
)來進行副本之間的數(shù)據(jù)同步,集群中每個 Server 節(jié)點都可以接收寫操作和讀操作。Server 節(jié)點接收到寫操作后(注冊、續(xù)約、下線、狀態(tài)更新)會通過后臺任務(wù)打包成批量任務(wù)發(fā)送到集群其它 Server 節(jié)點進行數(shù)據(jù)同步。Eureka Server 集群副本之間的數(shù)據(jù)會有短暫的不一致性,它是滿足 CAP 中的 AP,即 高可用性和分區(qū)容錯性
。
后面將陸續(xù)介紹Eureka配置項、Eureka服務(wù)集群、Eureka源碼解析…文章來源地址http://www.zghlxwxcb.cn/news/detail-488659.html
到了這里,關(guān)于【Spring Cloud系列】- Eureka使用詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!