1. 程式人生 > >剔除consul上無效的服務例項

剔除consul上無效的服務例項

      當我們在使用consul的過程中,可能會因為我們的一些操作,致使我們在consul上面註冊一些無效的(非PASSING)服務例項。雖然這些無效的服務並不會影響我們服務的正常進行,但是consul並不會自動把無效的服務剔除掉,他們會干擾我們的使用,監控,對於一些‘強迫症‘更是無法忍受~大笑大笑


package com.ccb.clean.consul.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 com.ecwid.consul.v1.health.model.HealthService;
import io.swagger.annotations.ApiOperation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import java.util.Iterator;
import java.util.List;
import java.util.Map;


@RestController
public class ApiController {
	private static  Logger log = LoggerFactory.getLogger(ApiController.class);
	@Autowired
	private ConsulClient consulClient;



        /**
	 * 獲取所有服務
	 */
	@ApiOperation(value="剔除所有無效的服務例項", notes="剔除所有無效的服務例項")
	@RequestMapping(value="/allservicer",method=RequestMethod.GET)
	public void getAllServicer(){
		log.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();
			log.info("member的IP地址為:{}",address);
			//根據role變數獲取每個member的角色  role:consul---代表服務端   role:node---代表客戶端
			String role =  members.get(i).getTags().get("role");
			log.info("{}機器的role為:{}=====註釋*role為consul代表服務端   role為node代表客戶端",address,role);
			//判斷是否為client
			if (role.equals("node")){
				//將IP地址傳給ConsulClient的構造方法,獲取物件
				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();
					log.info("在{}客戶端上的服務名稱 :{}**服務ID:{}",address,serviceName,serviceId);
					//根據服務名稱獲取服務的健康檢查資訊
					Response<List<Check>> checkList =consulClient.getHealthChecksForService(serviceName,null);
					List<Check> checks = checkList.getValue();
					//獲取健康狀態值  PASSING:正常  WARNING  CRITICAL  UNKNOWN:不正常
					Check.CheckStatus checkStatus = checks.get(0).getStatus();
					log.info("在{}客戶端上的服務 :{}的健康狀態值:{}",address,serviceName,checkStatus);
					if (checkStatus != Check.CheckStatus.PASSING){
						log.info("在{}客戶端上的服務 :{}為無效服務,準備清理...................",address,serviceName);
						clearClient.agentServiceDeregister(serviceId);
					}
				}
			}
		}
	}
}