當(dāng)我們的微服務(wù)優(yōu)雅停機(jī)時(shí),consul客戶端會(huì)自動(dòng)注銷當(dāng)前的微服務(wù)實(shí)例:
at org.springframework.cloud.consul.serviceregistry.ConsulServiceRegistry.deregister(ConsulServiceRegistry.java:86)
at org.springframework.cloud.consul.serviceregistry.ConsulServiceRegistry.deregister(ConsulServiceRegistry.java:41)
at org.springframework.cloud.client.serviceregistry.AbstractAutoServiceRegistration.deregister(AbstractAutoServiceRegistration.java:228)
at org.springframework.cloud.consul.serviceregistry.ConsulAutoServiceRegistration.deregister(ConsulAutoServiceRegistration.java:100)
at org.springframework.cloud.client.serviceregistry.AbstractAutoServiceRegistration.stop(AbstractAutoServiceRegistration.java:243)
at org.springframework.cloud.client.serviceregistry.AbstractAutoServiceRegistration.destroy(AbstractAutoServiceRegistration.java:180)
Spring提供2種方式:實(shí)現(xiàn)DisposableBean接口或者使用@PreDestroy注解,用于應(yīng)用程序退出時(shí)執(zhí)行某些操作,比如釋放資源等.
然而實(shí)際使用過程中,往往不是優(yōu)雅停機(jī)的,這就導(dǎo)致了consul服務(wù)器上存在了一些不可用的微服務(wù)實(shí)例.
這里使用consul agent暴露的端點(diǎn)來手動(dòng)注銷這些不可用的微服務(wù)實(shí)例.
- List Checks端點(diǎn),返回當(dāng)前agent下注冊(cè)的所有微服務(wù)實(shí)例以及相關(guān)檢測信息
- Deregister Service端點(diǎn):注銷當(dāng)前agent下的指定微服務(wù)實(shí)例
更多端點(diǎn)詳見Agent HTTP API
部分代碼:
@GetMapping("/deregister")
public String deregister() {
//由于自動(dòng)注入的ConsulClient為當(dāng)前微服務(wù)連接的consul agent,而注銷的時(shí)候只能在微服務(wù)實(shí)例注冊(cè)的agent下進(jìn)行注銷
//所以這里加了一個(gè)自定義的配置項(xiàng)配置consul集群地址 ip1:port1,ip2,ip3:port3.... 端口不配置默認(rèn)8500
//讀取并解析配置文件中配置的consul集群地址
Map<String, String> consulAddMap = this.getConsulAddress();
consulAddMap.forEach((host,port) -> {
//循環(huán)創(chuàng)建ConsulClient實(shí)例
ConsulClient client = new ConsulClient(host, Integer.valueOf(port));
//getAgentChecks 獲取到當(dāng)前agent下的所有注冊(cè)的微服務(wù)實(shí)例
client.getAgentChecks().getValue().values().forEach(check -> {
//注銷狀態(tài)不為PASSING的微服務(wù)實(shí)例
if (!check.getStatus().equals(Check.CheckStatus.PASSING)) {
client.agentServiceDeregister(check.getServiceId());
}
});
});
return "OK";
}
代碼詳見github中的工程sc-learn-service-deregister
當(dāng)然也可以手動(dòng)注銷某個(gè)微服務(wù)實(shí)例,比如:
PUT http://consulAgentIp:8500/v1/agent/service/deregister/微服務(wù)實(shí)例ID
參考文檔
【程序猿DD】Consul注銷實(shí)例時(shí)候的問題