高階功能
臨時例項和持久例項
預設情況下,註冊給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
就會預設使用所有叢集