SpringBoot 无效服务删除代码

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;
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章