Java Eureka探究細(xì)枝末節(jié)
1、Eureka元數(shù)據(jù)詳解
Eureka的元數(shù)據(jù)有兩種:標(biāo)準(zhǔn)元數(shù)據(jù)和自定義元數(shù)據(jù)。
標(biāo)準(zhǔn)元數(shù)據(jù):主機(jī)名、IP地址、端口號(hào)等信息,這些信息都會(huì)被發(fā)布在服務(wù)注冊(cè)表中,用于服務(wù)之間的調(diào)用。
自定義元數(shù)據(jù):可以使用eureka.instance.metadata-map配置,符合KEY/VALUE的存儲(chǔ)格式。這 些元數(shù)據(jù)可以在遠(yuǎn)程客戶端中訪問(wèn)。
類似于
eureka:
instance:
prefer-ip-address: true
metadata-map:
# 自定義元數(shù)據(jù)(kv自定義)
cluster: cl1
region: rn1
我們可以在程序中可以使用DiscoveryClient 獲取指定微服務(wù)的所有元數(shù)據(jù)信息
import com.lagou.edu.AutoDeliverApplication; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.discovery.DiscoveryClient; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import java.util.List; @SpringBootTest(classes = {AutoDeliverApplication.class}) @RunWith(SpringJUnit4ClassRunner.class) public class AutoDeliverApplicationTest { @Autowired private DiscoveryClient discoveryClient; @Test public void testInstanceMetadata() { // 從EurekaServer獲取指定微服務(wù)實(shí)例 List<ServiceInstance> instances = discoveryClient.getInstances("lagou-service-resume"); // 循環(huán)打印每個(gè)微服務(wù)實(shí)例的元數(shù)據(jù)信息 for (int i = 0; i < instances.size(); i++) { ServiceInstance serviceInstance = instances.get(i); System.out.println(serviceInstance); } } }
元數(shù)據(jù)查看如下
2、Eureka客戶端詳解
服務(wù)提供者(也是Eureka客戶端)要向EurekaServer注冊(cè)服務(wù),并完成服務(wù)續(xù)約等工作
服務(wù)注冊(cè)詳解(服務(wù)提供者)
- 當(dāng)我們導(dǎo)入了eureka-client依賴坐標(biāo),配置Eureka服務(wù)注冊(cè)中心地址
- 服務(wù)在啟動(dòng)時(shí)會(huì)向注冊(cè)中心發(fā)起注冊(cè)請(qǐng)求,攜帶服務(wù)元數(shù)據(jù)信息
- Eureka注冊(cè)中心會(huì)把服務(wù)的信息保存在Map中
服務(wù)續(xù)約詳解(服務(wù)提供者)
服務(wù)每隔30秒會(huì)向注冊(cè)中心續(xù)約(心跳)一次(也稱為報(bào)活),如果沒(méi)有續(xù)約,租約在90秒后到期,然后服務(wù)會(huì)被失效。每隔30秒的續(xù)約操作我們稱之為心跳檢測(cè)。
往往不需要我們調(diào)整這兩個(gè)配置
# 向Eureka服務(wù)中心集群注冊(cè)服務(wù)
eureka:
instance:
# 租約續(xù)約間隔時(shí)間,默認(rèn)30秒
lease-renewal-interval-in-seconds: 30
# 租約到期,服務(wù)時(shí)效時(shí)間,默認(rèn)值90秒,服務(wù)超過(guò)90秒沒(méi)有發(fā)生心跳,EurekaServer會(huì)將服務(wù)從列表移除
lease-expiration-duration-in-seconds: 90
獲取服務(wù)列表詳解(服務(wù)消費(fèi)者)
每隔30秒服務(wù)會(huì)從注冊(cè)中心中拉取一份服務(wù)列表,這個(gè)時(shí)間可以通過(guò)配置修改。往往不需要我們調(diào)整。
# 向Eureka服務(wù)中心集群注冊(cè)服務(wù)
eureka:
client:# 每隔多久拉取一次服務(wù)列表
registry-fetch-interval-seconds: 30
- 服務(wù)消費(fèi)者啟動(dòng)時(shí),從 EurekaServer服務(wù)列表獲取只讀備份,緩存到本地
- 每隔30秒,會(huì)重新獲取并更新數(shù)據(jù)
- 每隔30秒的時(shí)間可以通過(guò)配置eureka.client.registry-fetch-interval-seconds修改
3、Eureka服務(wù)端詳解
服務(wù)下線
- 當(dāng)服務(wù)正常關(guān)閉操作時(shí),會(huì)發(fā)送服務(wù)下線的REST請(qǐng)求給EurekaServer。
- 服務(wù)中心接受到請(qǐng)求后,將該服務(wù)置為下線狀態(tài)
失效剔除
Eureka Server會(huì)定時(shí)(間隔值是eureka.server.eviction-interval-timer-in-ms,默認(rèn)60s)進(jìn)行檢查,如果發(fā)現(xiàn)實(shí)例在在一定時(shí)間(此值由客戶端設(shè)置的eureka.instance.lease-expiration-duration-in-seconds定義,默認(rèn)值為90s)內(nèi)沒(méi)有收到心跳,則會(huì)注銷此實(shí)例。
自我保護(hù)
服務(wù)提供者 —> 注冊(cè)中心
定期的續(xù)約(服務(wù)提供者和注冊(cè)中心通信),假如服務(wù)提供者和注冊(cè)中心之間的網(wǎng)絡(luò)有點(diǎn)問(wèn)題,不代表服務(wù)提供者不可用,不代表服務(wù)消費(fèi)者無(wú)法訪問(wèn)服務(wù)提供者。如果在15分鐘內(nèi)超過(guò)85%的客戶端節(jié)點(diǎn)都沒(méi)有正常的心跳,那么Eureka就認(rèn)為客戶端與注冊(cè)中心出現(xiàn)了網(wǎng)絡(luò)故障,Eureka Server自動(dòng)進(jìn)入自我保護(hù)機(jī)制。
為什么會(huì)有自我保護(hù)機(jī)制?
默認(rèn)情況下,如果Eureka Server在一定時(shí)間內(nèi)(默認(rèn)90秒)沒(méi)有接收到某個(gè)微服務(wù)實(shí)例的心跳,Eureka Server將會(huì)移除該實(shí)例。但是當(dāng)網(wǎng)絡(luò)分區(qū)故障發(fā)?時(shí),微服務(wù)與Eureka Server之間?法正常通信,而微服務(wù)本身是正常運(yùn)行的,此時(shí)不應(yīng)該移除這個(gè)微服務(wù),所以引入了自我保護(hù)機(jī)制。
服務(wù)中心頁(yè)面會(huì)顯示如下提示信息
當(dāng)處于自我保護(hù)模式時(shí)
- 不會(huì)剔除任何服務(wù)實(shí)例(可能是服務(wù)提供者和EurekaServer之間網(wǎng)絡(luò)問(wèn)題),保證了大多數(shù)服務(wù)依然可用
- Eureka Server仍然能夠接受新服務(wù)的注冊(cè)和查詢請(qǐng)求,但是不會(huì)被同步到其它節(jié)點(diǎn)上,保證當(dāng)前節(jié)點(diǎn)依然可用,當(dāng)網(wǎng)絡(luò)穩(wěn)定時(shí),當(dāng)前Eureka Server新的注冊(cè)信息會(huì)被同步到其它節(jié)點(diǎn)中。
- 在Eureka Server工程中通過(guò)eureka.server.enable-self-preservation配置可用關(guān)停自我保護(hù),默認(rèn)值是打開(kāi)
eureka:
server:
enable-self-preservation: false # 關(guān)閉自我保護(hù)模式(缺省為打開(kāi))
經(jīng)驗(yàn):建議生產(chǎn)環(huán)境打開(kāi)自我保護(hù)機(jī)制
到此這篇關(guān)于Java Eureka探究細(xì)枝末節(jié)的文章就介紹到這了,更多相關(guān)Java Eureka內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java實(shí)現(xiàn)對(duì)視頻進(jìn)行截圖的方法【附ffmpeg下載】
這篇文章主要介紹了Java實(shí)現(xiàn)對(duì)視頻進(jìn)行截圖的方法,結(jié)合實(shí)例形式分析了Java使用ffmpeg針對(duì)視頻進(jìn)行截圖的相關(guān)操作技巧,并附帶ffmpeg.exe文件供讀者下載使用,需要的朋友可以參考下2018-01-01Spring?零基礎(chǔ)入門(mén)WebFlux框架體系
Spring5發(fā)布有兩年了,隨Spring5一起發(fā)布了一個(gè)和Spring?WebMvc同級(jí)的Spring?WebFlux。這是一個(gè)支持反應(yīng)式編程模型的新框架體系。反應(yīng)式模型區(qū)別于傳統(tǒng)的MVC最大的不同是異步的、事件驅(qū)動(dòng)的、非阻塞的,這使得應(yīng)用程序的并發(fā)性能會(huì)大大提高,單位時(shí)間能夠處理更多的請(qǐng)求2022-07-07Java判斷一個(gè)時(shí)間是否在當(dāng)前時(shí)間區(qū)間代碼示例
這篇文章主要給大家介紹了關(guān)于使用Java判斷一個(gè)時(shí)間是否在當(dāng)前時(shí)間區(qū)間的相關(guān)資料,在日常開(kāi)發(fā)中我們經(jīng)常會(huì)涉及到時(shí)間的大小比較或者是判斷某個(gè)時(shí)間是否在某個(gè)時(shí)間段內(nèi),需要的朋友可以參考下2023-07-07springboot中restful風(fēng)格請(qǐng)求的使用方法示例
RESTful是一種web軟件風(fēng)格,它不是標(biāo)準(zhǔn)也不是協(xié)議,它不一定要采用,只是一種風(fēng)格,它倡導(dǎo)的是一個(gè)資源定位(url)及資源操作的風(fēng)格,下面這篇文章主要給大家介紹了關(guān)于springboot中restful風(fēng)格請(qǐng)求的使用方法,需要的朋友可以參考下2023-02-02SpringMVC如何正確接收時(shí)間的請(qǐng)求示例分析
這篇文章主要為大家介紹了SpringMVC如何正確接收時(shí)間的請(qǐng)求示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09