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地址、端口號等信息,這些信息都會被發(fā)布在服務(wù)注冊表中,用于服務(wù)之間的調(diào)用。
自定義元數(shù)據(jù):可以使用eureka.instance.metadata-map配置,符合KEY/VALUE的存儲格式。這 些元數(shù)據(jù)可以在遠(yuǎ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ù)實例 List<ServiceInstance> instances = discoveryClient.getInstances("lagou-service-resume"); // 循環(huán)打印每個微服務(wù)實例的元數(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注冊服務(wù),并完成服務(wù)續(xù)約等工作
服務(wù)注冊詳解(服務(wù)提供者)
- 當(dāng)我們導(dǎo)入了eureka-client依賴坐標(biāo),配置Eureka服務(wù)注冊中心地址
- 服務(wù)在啟動時會向注冊中心發(fā)起注冊請求,攜帶服務(wù)元數(shù)據(jù)信息
- Eureka注冊中心會把服務(wù)的信息保存在Map中
服務(wù)續(xù)約詳解(服務(wù)提供者)
服務(wù)每隔30秒會向注冊中心續(xù)約(心跳)一次(也稱為報活),如果沒有續(xù)約,租約在90秒后到期,然后服務(wù)會被失效。每隔30秒的續(xù)約操作我們稱之為心跳檢測。
往往不需要我們調(diào)整這兩個配置
# 向Eureka服務(wù)中心集群注冊服務(wù)
eureka:
instance:
# 租約續(xù)約間隔時間,默認(rèn)30秒
lease-renewal-interval-in-seconds: 30
# 租約到期,服務(wù)時效時間,默認(rèn)值90秒,服務(wù)超過90秒沒有發(fā)生心跳,EurekaServer會將服務(wù)從列表移除
lease-expiration-duration-in-seconds: 90
獲取服務(wù)列表詳解(服務(wù)消費者)
每隔30秒服務(wù)會從注冊中心中拉取一份服務(wù)列表,這個時間可以通過配置修改。往往不需要我們調(diào)整。
# 向Eureka服務(wù)中心集群注冊服務(wù)
eureka:
client:# 每隔多久拉取一次服務(wù)列表
registry-fetch-interval-seconds: 30
- 服務(wù)消費者啟動時,從 EurekaServer服務(wù)列表獲取只讀備份,緩存到本地
- 每隔30秒,會重新獲取并更新數(shù)據(jù)
- 每隔30秒的時間可以通過配置eureka.client.registry-fetch-interval-seconds修改
3、Eureka服務(wù)端詳解
服務(wù)下線
- 當(dāng)服務(wù)正常關(guān)閉操作時,會發(fā)送服務(wù)下線的REST請求給EurekaServer。
- 服務(wù)中心接受到請求后,將該服務(wù)置為下線狀態(tài)
失效剔除
Eureka Server會定時(間隔值是eureka.server.eviction-interval-timer-in-ms,默認(rèn)60s)進(jìn)行檢查,如果發(fā)現(xiàn)實例在在一定時間(此值由客戶端設(shè)置的eureka.instance.lease-expiration-duration-in-seconds定義,默認(rèn)值為90s)內(nèi)沒有收到心跳,則會注銷此實例。
自我保護(hù)
服務(wù)提供者 —> 注冊中心
定期的續(xù)約(服務(wù)提供者和注冊中心通信),假如服務(wù)提供者和注冊中心之間的網(wǎng)絡(luò)有點問題,不代表服務(wù)提供者不可用,不代表服務(wù)消費者無法訪問服務(wù)提供者。如果在15分鐘內(nèi)超過85%的客戶端節(jié)點都沒有正常的心跳,那么Eureka就認(rèn)為客戶端與注冊中心出現(xiàn)了網(wǎng)絡(luò)故障,Eureka Server自動進(jìn)入自我保護(hù)機(jī)制。
為什么會有自我保護(hù)機(jī)制?
默認(rèn)情況下,如果Eureka Server在一定時間內(nèi)(默認(rèn)90秒)沒有接收到某個微服務(wù)實例的心跳,Eureka Server將會移除該實例。但是當(dāng)網(wǎng)絡(luò)分區(qū)故障發(fā)?時,微服務(wù)與Eureka Server之間?法正常通信,而微服務(wù)本身是正常運行的,此時不應(yīng)該移除這個微服務(wù),所以引入了自我保護(hù)機(jī)制。
服務(wù)中心頁面會顯示如下提示信息
當(dāng)處于自我保護(hù)模式時
- 不會剔除任何服務(wù)實例(可能是服務(wù)提供者和EurekaServer之間網(wǎng)絡(luò)問題),保證了大多數(shù)服務(wù)依然可用
- Eureka Server仍然能夠接受新服務(wù)的注冊和查詢請求,但是不會被同步到其它節(jié)點上,保證當(dāng)前節(jié)點依然可用,當(dāng)網(wǎng)絡(luò)穩(wěn)定時,當(dāng)前Eureka Server新的注冊信息會被同步到其它節(jié)點中。
- 在Eureka Server工程中通過eureka.server.enable-self-preservation配置可用關(guān)停自我保護(hù),默認(rèn)值是打開
eureka:
server:
enable-self-preservation: false # 關(guān)閉自我保護(hù)模式(缺省為打開)
經(jīng)驗:建議生產(chǎn)環(huán)境打開自我保護(hù)機(jī)制
到此這篇關(guān)于Java Eureka探究細(xì)枝末節(jié)的文章就介紹到這了,更多相關(guān)Java Eureka內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java實現(xiàn)對視頻進(jìn)行截圖的方法【附ffmpeg下載】
這篇文章主要介紹了Java實現(xiàn)對視頻進(jìn)行截圖的方法,結(jié)合實例形式分析了Java使用ffmpeg針對視頻進(jìn)行截圖的相關(guān)操作技巧,并附帶ffmpeg.exe文件供讀者下載使用,需要的朋友可以參考下2018-01-01Java判斷一個時間是否在當(dāng)前時間區(qū)間代碼示例
這篇文章主要給大家介紹了關(guān)于使用Java判斷一個時間是否在當(dāng)前時間區(qū)間的相關(guān)資料,在日常開發(fā)中我們經(jīng)常會涉及到時間的大小比較或者是判斷某個時間是否在某個時間段內(nèi),需要的朋友可以參考下2023-07-07springboot中restful風(fēng)格請求的使用方法示例
RESTful是一種web軟件風(fēng)格,它不是標(biāo)準(zhǔn)也不是協(xié)議,它不一定要采用,只是一種風(fēng)格,它倡導(dǎo)的是一個資源定位(url)及資源操作的風(fēng)格,下面這篇文章主要給大家介紹了關(guān)于springboot中restful風(fēng)格請求的使用方法,需要的朋友可以參考下2023-02-02