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