Nacos的一些高階功能

燕子去了發表於2024-04-20

高階功能

臨時例項和持久例項

預設情況下,註冊給Nacos的例項都是臨時例項
臨時例項:會透過客戶端與伺服器之間的心跳來保活,預設情況下客戶端每隔5s傳送一次心跳

public static final long DEFAULT_HEAT_BEAT_INTERVAL = TimeUnit.SECONDS.toMillis(5);

在服務端如果超過15s沒有收到客戶端的心跳,就會把例項標記為不健康狀態

public static final long DEFAULT_HEAT_BEAT_TIMEOUT = TTimeUnit.SECONDS.toMillis(15);

在服務端,如果超過30s沒有收到客戶端的心跳,就會刪除例項

public static final long DEFAULT_IP_DEELTE_TIMEOUT = TTimeUnit.SECONDS.toMillis(30);

對於持久化例項,就算服務下線了,也不會被刪除
配置持久化例項,將例項資訊持久化到磁碟:

spring.cloud.nacos.discovery.ephemeral=false

持久例項會永遠線上,所以如果消費者在某種情況下想要拿到已經下線的例項的例項資訊,就可以將例項註冊為持久例項。

保護閾值

在使用的過程中,可以設定一個0-1的比例,表示如果服務的所有例項中,健康例項的比重低於這個比重就會觸發,一旦出發保護,在服務消費端就會不論是否健康把所有例項拉取下來,這樣就能起到保護的作用,正常情況下消費者只能拿到健康的例項,但是如果健康例項的比例過小,就會導致所有流量壓到那一點的健康例項上,這樣僅剩的幾個健康例項也會被壓垮,所以只要觸發了保護,消費者會拿到全部例項,雖然部分消費者會因為訪問到不健康的例項導致請求失敗,但是也有一部分的請求能訪問到健康例項,達到保護的作用。

在SpringCloud Tencent中這個功能叫“全死全活”。

權重,NacosRule配置權重

一個服務的多個例項,可能對應的機器配置不同,可以給不同的例項設定不同的權重
不過在消費一個服務時,通常是透過Ribbon負載均衡的,預設情況下Nacos配置的權重不生效

使用Nacos的權重:

@Bean
public IRule ribbonRule(){
	return new NacosRule();
}

Cluster就近訪問

一個服務下會有多個例項,nacos可以將這些例項指定到不同的叢集中
指定當前例項所屬的叢集:

spring.cloud.nacos.discovery.cluster-name=beijing

消費者也可以配置使服務呼叫者也在“beijing”叢集:

spring.cloud.nacos.discovery.cluster-name=beijing

這樣服務消費者就只會呼叫到“beijing”叢集的例項

如果沒有配置cluster-name就會預設使用所有叢集

相關文章