package com.ethan.example.client.controller;
import com.ecwid.consul.v1.ConsulClient;
import com.ecwid.consul.v1.Response;
import com.ecwid.consul.v1.agent.model.Member;
import com.ecwid.consul.v1.agent.model.Service;
import com.ecwid.consul.v1.health.model.Check;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.*;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
@Api(description = "Unregister Invalid Service")
@RestController
@RequestMapping("/service")
public class ServiceManagerController {
Logger logger = LoggerFactory.getLogger(ServiceManagerController.class);
@Autowired
private ConsulClient consulClient;
@Autowired
private RestTemplate restTemplate;
@DeleteMapping("/unregister")
@ApiOperation(value = "Unregister Service Instance")
public boolean unregisterInvalidServices() {
logger.info("***********************consul上無效服務清理開始*******************************************");
//獲取所有的members的信息
List<Member> members = consulClient.getAgentMembers().getValue();
for (int i = 0; i < members.size(); i++) {
//獲取每個member的IP地址
String address = members.get(i).getAddress();
logger.info("member的IP地址爲:{}", address);
//創造對象
ConsulClient clearClient = new ConsulClient(address);
//根據clearClient,獲取當前IP下所有的服務 使用迭代方式 獲取map對象的值
Iterator<Map.Entry<String, Service>> it = clearClient.getAgentServices().getValue().entrySet().iterator();
while (it.hasNext()) {
Map.Entry<String, Service> serviceMap = it.next();
//獲得Service對象
Service service = serviceMap.getValue();
//獲取服務名稱
String serviceName = service.getService();
//獲取服務ID
String serviceId = service.getId();
logger.info("在{}客戶端上的服務名稱 :{}**服務ID:{}", address, serviceName, serviceId);
//根據服務名稱獲取服務的健康檢查信息
Response<List<Check>> checkList = consulClient.getHealthChecksForService(serviceName, null);
List<Check> checks = checkList.getValue();
//獲取健康狀態值 PASSING:正常 WARNING CRITICAL UNKNOWN:不正常
for (Check check : checks) {
Check.CheckStatus checkStatus = check.getStatus();
logger.info("在{}客戶端上的服務 :{},{} 的健康狀態值:{}", address, serviceName, serviceId, checkStatus);
if (check.getServiceId().equals(serviceId) && checkStatus != Check.CheckStatus.PASSING) {
logger.info("在{}客戶端上的服務 :{},{}爲無效服務,準備清理...................", address, serviceName, serviceId, serviceId);
//調用不了,PUT請求被封裝成GET請求了
//clearClient.agentServiceDeregister(serviceId);
boolean delete = deleteInvalidService(address, serviceId, restTemplate);
if (!delete) {
logger.error("unregister service id: " + serviceId + " failed.");
} else {
logger.info("unregister service id: " + serviceId + " success.");
}
}
}
}
}
logger.info("***********************consul上無效服務清理結束*******************************************");
return true;
}
private static boolean deleteInvalidService(String ip, String serviceId, RestTemplate restTemplate) {
String url = "http://" + ip + ":8500" + "/v1/agent/service/deregister/{serviceId}";
Map<String, String> params = new HashMap<>();
params.put("serviceId", serviceId);
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity httpEntity = new HttpEntity(null, headers);
ResponseEntity<String> responseEntity = restTemplate.exchange(url, HttpMethod.PUT, httpEntity, String.class, params);
int statusCode = responseEntity.getStatusCodeValue();
if (200 == statusCode) {
return true;
} else {
return false;
}
}
}
SpringBoot 無效服務刪除代碼
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.