剔除consul上無效的服務例項
阿新 • • 發佈:2019-02-04
當我們在使用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); } } } } } }