package com.weibo.service.impl; import com.alibaba.fastjson.JSONObject; import com.ecwid.consul.v1.ConsulClient; import com.ecwid.consul.v1.QueryParams; import com.ecwid.consul.v1.catalog.model.CatalogService; import com.ecwid.consul.v1.health.model.Check; import com.weibo.service.RegistryService; import com.weibo.utils.ConsulClientWrapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import javax.annotation.PostConstruct; import java.util.*; @Service @Lazy public class ConsulRegistryService implements RegistryService { @Autowired private ConsulClientWrapper clientWrapper; private ConsulClient consulClient; public ConsulRegistryService() { } /** * Unit Test中使用 * * @param consulClient */ public ConsulRegistryService(ConsulClient consulClient) { this.consulClient = consulClient; } @PostConstruct public void init() { consulClient = clientWrapper.getConsulClient(); } public List<String> getDatacenters() { return consulClient.getCatalogDatacenters().getValue(); } @Override public List<String> getGroups() { List<String> groups = new ArrayList<String>(); for (String dc : getDatacenters()) { QueryParams queryParams = new QueryParams(dc); Map<String, List<String>> serviceMap = consulClient.getCatalogServices(queryParams).getValue(); serviceMap.remove("consul"); for (String service : serviceMap.keySet()) { groups.add(formatGroupName(dc, service)); } } return groups; } @Override public List<String> getServicesByGroup(String dcGroup) { Set<String> services = new HashSet<String>(); List<CatalogService> serviceList = getCatalogServicesByGroup(dcGroup); for (CatalogService service : serviceList) { services.add(formatServiceName(service)); } return new ArrayList<String>(services); } private List<CatalogService> getCatalogServicesByGroup(String dcGroup) { QueryParams queryParams = new QueryParams(getDcName(dcGroup)); return consulClient.getCatalogService(getGroupName(dcGroup), queryParams).getValue(); } @Override public List<JSONObject> getNodes(String dcGroup, String service, String nodeType) { List<JSONObject> results = new ArrayList<JSONObject>(); List<Check> checks = consulClient.getHealthChecksForService(getGroupName(dcGroup), new QueryParams(getDcName(dcGroup))).getValue(); for (Check check : checks) { String serviceId = check.getServiceId(); String[] strings = serviceId.split("-"); if (strings[1].equals(service)) { Check.CheckStatus status = check.getStatus(); JSONObject node = new JSONObject(); if (nodeType.equals(status.toString())) { node.put("host", strings[0]); node.put("info", null); results.add(node); } } } return results; } @Override public List<JSONObject> getAllNodes(String dcGroup) { List<JSONObject> results = new ArrayList<JSONObject>(); List<String> serviceNameSet = getServicesByGroup(dcGroup); for (String dcServiceName : serviceNameSet) { JSONObject service = new JSONObject(); service.put("service", dcServiceName); List<JSONObject> availableServer = getNodes(dcGroup, dcServiceName, "PASSING"); service.put("server", availableServer); List<JSONObject> unavailableServer = getNodes(dcGroup, dcServiceName, "CRITICAL"); service.put("unavailableServer", unavailableServer); service.put("client", null); results.add(service); } return results; } private String formatGroupName(String dc, String groupName) { return dc + ":" + groupName; } private String formatServiceName(CatalogService catalogService) { return catalogService.getServiceId().split("-")[1]; } private String getDcName(String dcString) { return dcString.substring(0, dcString.indexOf(":")); } private String getGroupName(String dcGroup) { return dcGroup.substring(dcGroup.indexOf(":") + 1); } }