Java Eureka探究細枝末節(jié)
1、Eureka元數(shù)據(jù)詳解
Eureka的元數(shù)據(jù)有兩種:標(biāo)準(zhǔn)元數(shù)據(jù)和自定義元數(shù)據(jù)。
標(biāo)準(zhǔn)元數(shù)據(jù):主機名、IP地址、端口號等信息,這些信息都會被發(fā)布在服務(wù)注冊表中,用于服務(wù)之間的調(diào)用。
自定義元數(shù)據(jù):可以使用eureka.instance.metadata-map配置,符合KEY/VALUE的存儲格式。這 些元數(shù)據(jù)可以在遠程客戶端中訪問。
類似于
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ù)約間隔時間,默認30秒
lease-renewal-interval-in-seconds: 30
# 租約到期,服務(wù)時效時間,默認值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,默認60s)進行檢查,如果發(fā)現(xiàn)實例在在一定時間(此值由客戶端設(shè)置的eureka.instance.lease-expiration-duration-in-seconds定義,默認值為90s)內(nèi)沒有收到心跳,則會注銷此實例。
自我保護
服務(wù)提供者 —> 注冊中心
定期的續(xù)約(服務(wù)提供者和注冊中心通信),假如服務(wù)提供者和注冊中心之間的網(wǎng)絡(luò)有點問題,不代表服務(wù)提供者不可用,不代表服務(wù)消費者無法訪問服務(wù)提供者。如果在15分鐘內(nèi)超過85%的客戶端節(jié)點都沒有正常的心跳,那么Eureka就認為客戶端與注冊中心出現(xiàn)了網(wǎng)絡(luò)故障,Eureka Server自動進入自我保護機制。
為什么會有自我保護機制?
默認情況下,如果Eureka Server在一定時間內(nèi)(默認90秒)沒有接收到某個微服務(wù)實例的心跳,Eureka Server將會移除該實例。但是當(dāng)網(wǎng)絡(luò)分區(qū)故障發(fā)?時,微服務(wù)與Eureka Server之間?法正常通信,而微服務(wù)本身是正常運行的,此時不應(yīng)該移除這個微服務(wù),所以引入了自我保護機制。
服務(wù)中心頁面會顯示如下提示信息

當(dāng)處于自我保護模式時
- 不會剔除任何服務(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)停自我保護,默認值是打開
eureka:
server:
enable-self-preservation: false # 關(guān)閉自我保護模式(缺省為打開)
經(jīng)驗:建議生產(chǎn)環(huán)境打開自我保護機制
到此這篇關(guān)于Java Eureka探究細枝末節(jié)的文章就介紹到這了,更多相關(guān)Java Eureka內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java自定義注解實現(xiàn)數(shù)據(jù)脫敏
在實際開發(fā)中經(jīng)常會遇到有一些信息不能全部展示用戶,需要隱藏(可以叫脫敏),所以本文為大家分享了利用自定義注解實現(xiàn)數(shù)據(jù)脫敏的示例代碼,需要的可以參考下2023-07-07
SSH框架網(wǎng)上商城項目第27戰(zhàn)之申請域名空間和項目部署及發(fā)布
這篇文章主要為大家詳細介紹了SSH框架網(wǎng)上商城項目第26戰(zhàn)之申請域名空間和項目部署及發(fā)布,感興趣的小伙伴們可以參考一下2016-06-06
java文件/圖片的上傳與下載以及MultipartFile詳解
文章介紹了MultipartFile類的使用,包括獲取文件名、文件類型、文件大小等方法,以及如何處理多文件上傳和文件大小限制,同時提供了文件上傳和下載的示例代碼2025-02-02
mybatis中的mapper.xml使用循環(huán)語句
這篇文章主要介紹了mybatis中的mapper.xml使用循環(huán)語句,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02
簡單介紹區(qū)分applet和application的方法
applet和application都是Java語言編寫出來的應(yīng)用程序,本文簡單介紹了二者的不同之處,需要的朋友可以參考下2017-09-09
SpringCache 分布式緩存的實現(xiàn)方法(規(guī)避redis解鎖的問題)
這篇文章主要介紹了SpringCache 分布式緩存的實現(xiàn)方法(規(guī)避redis解鎖的問題),本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-11-11

