package com.networknt.consul.client; import com.ecwid.consul.v1.QueryParams; import com.ecwid.consul.v1.Response; import com.ecwid.consul.v1.agent.model.NewService; import com.ecwid.consul.v1.health.model.HealthService; import com.ecwid.consul.v1.health.model.HealthService.Service; import com.ecwid.consul.v1.kv.model.GetValue; import com.networknt.consul.ConsulConstants; import com.networknt.consul.ConsulResponse; import com.networknt.consul.ConsulService; import com.networknt.consul.ConsulUtils; import org.apache.commons.codec.binary.Base64; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.ArrayList; import java.util.List; import static java.nio.charset.StandardCharsets.UTF_8; public class ConsulEcwidClient implements ConsulClient { private static final Logger logger = LoggerFactory.getLogger(ConsulEcwidClient.class); public static com.ecwid.consul.v1.ConsulClient client; String host; int port; /** * Construct ConsulEcwidClient with host and port. * * @param host * @param port */ public ConsulEcwidClient(String host, int port) { this.host = host; this.port = port; client = new com.ecwid.consul.v1.ConsulClient(host, port); if(logger.isInfoEnabled()) logger.info("ConsulEcwidClient init finish. client host:" + host + ", port:" + port); } @Override public void checkPass(String serviceId) { if(logger.isDebugEnabled()) logger.debug("checkPass serviceId = " + serviceId); client.agentCheckPass("service:" + serviceId); } @Override public void registerService(ConsulService service) { NewService newService = convertService(service); client.agentServiceRegister(newService); } @Override public void unregisterService(String serviceid) { client.agentServiceDeregister(serviceid); } @Override public ConsulResponse<List<ConsulService>> lookupHealthService( String serviceName, long lastConsulIndex) { QueryParams queryParams = new QueryParams( ConsulConstants.CONSUL_BLOCK_TIME_SECONDS, lastConsulIndex); Response<List<HealthService>> orgResponse = client.getHealthServices( serviceName, true, queryParams); ConsulResponse<List<ConsulService>> newResponse = null; if (orgResponse != null && orgResponse.getValue() != null && !orgResponse.getValue().isEmpty()) { List<HealthService> HealthServices = orgResponse.getValue(); List<ConsulService> ConsulServcies = new ArrayList<ConsulService>( HealthServices.size()); for (HealthService orgService : HealthServices) { try { ConsulService newService = convertToConsulService(orgService); ConsulServcies.add(newService); } catch (Exception e) { String servcieid = "null"; if (orgService.getService() != null) { servcieid = orgService.getService().getId(); } logger.error( "convert consul service fail. org consulservice:" + servcieid, e); } } if (!ConsulServcies.isEmpty()) { newResponse = new ConsulResponse<>(); newResponse.setValue(ConsulServcies); newResponse.setConsulIndex(orgResponse.getConsulIndex()); newResponse.setConsulLastContact(orgResponse .getConsulLastContact()); newResponse.setConsulKnownLeader(orgResponse .isConsulKnownLeader()); } } return newResponse; } @Override public String lookupCommand(String serviceName) { Response<GetValue> response = client.getKVValue(ConsulConstants.CONSUL_LIGHT_COMMAND + serviceName); GetValue value = response.getValue(); String command = ""; if (value == null) { if(logger.isInfoEnabled()) logger.info("no command in serviceName: " + serviceName); } else if (value.getValue() != null) { command = new String(Base64.decodeBase64(value.getValue()), UTF_8); } return command; } private NewService convertService(ConsulService service) { NewService newService = new NewService(); newService.setAddress(service.getAddress()); newService.setId(service.getId()); newService.setName(service.getName()); newService.setPort(service.getPort()); newService.setTags(service.getTags()); NewService.Check check = new NewService.Check(); check.setTtl(service.getTtl() + "s"); newService.setCheck(check); return newService; } private ConsulService convertToConsulService(HealthService healthService) { ConsulService service = new ConsulService(); Service org = healthService.getService(); service.setAddress(org.getAddress()); service.setId(org.getId()); service.setName(org.getService()); service.setPort(org.getPort()); service.setTags(org.getTags()); return service; } @Override public void checkFail(String serviceId) { if(logger.isDebugEnabled()) logger.debug("checkFail serviceId = " + serviceId); client.agentCheckFail("service:" + serviceId); } }