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 无效服务删除代码
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.