2 * Copyright 2016-2017 ZTE, Inc. and others.
4 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
5 * in compliance with the License. You may obtain a copy of the License at
7 * http://www.apache.org/licenses/LICENSE-2.0
9 * Unless required by applicable law or agreed to in writing, software distributed under the License
10 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
11 * or implied. See the License for the specific language governing permissions and limitations under
14 package org.onap.msb.sdclient.wrapper;
16 import java.util.ArrayList;
17 import java.util.HashMap;
18 import java.util.HashSet;
19 import java.util.List;
23 import org.apache.commons.lang3.StringUtils;
24 import org.onap.msb.sdclient.core.AgentService;
25 import org.onap.msb.sdclient.core.CatalogService;
26 import org.onap.msb.sdclient.core.Check;
27 import org.onap.msb.sdclient.core.ConsulResponse;
28 import org.onap.msb.sdclient.core.HealthService;
29 import org.onap.msb.sdclient.core.HealthService.Service;
30 import org.onap.msb.sdclient.core.KeyVaulePair;
31 import org.onap.msb.sdclient.core.MicroServiceFullInfo;
32 import org.onap.msb.sdclient.core.MicroServiceInfo;
33 import org.onap.msb.sdclient.core.Node;
34 import org.onap.msb.sdclient.core.NodeAddress;
35 import org.onap.msb.sdclient.core.NodeInfo;
36 import org.onap.msb.sdclient.core.exception.ExtendedInternalServerErrorException;
37 import org.onap.msb.sdclient.core.exception.ExtendedNotFoundException;
38 import org.onap.msb.sdclient.core.exception.UnprocessableEntityException;
39 import org.onap.msb.sdclient.wrapper.util.ConfigUtil;
40 import org.onap.msb.sdclient.wrapper.util.DiscoverUtil;
41 import org.onap.msb.sdclient.wrapper.util.HttpClientUtil;
42 import org.onap.msb.sdclient.wrapper.util.JacksonJsonUtil;
43 import org.onap.msb.sdclient.wrapper.util.RegExpTestUtil;
44 import org.slf4j.Logger;
45 import org.slf4j.LoggerFactory;
47 import com.fasterxml.jackson.core.type.TypeReference;
49 public class ConsulServiceWrapper {
52 private static ConsulServiceWrapper instance = new ConsulServiceWrapper();
55 private ConsulServiceWrapper() {}
57 public static ConsulServiceWrapper getInstance() {
61 private static final Logger LOGGER = LoggerFactory.getLogger(ConsulServiceWrapper.class);
64 * Title: getAllMicroServiceInstances Description: 获取全部服务
67 * @see com.zte.ums.nfv.eco.hsif.msb.core.IMSBService#getAllMicroServiceInstances()
69 public List<MicroServiceFullInfo> getAllMicroServiceInstances() {
71 String consulServiceUrl =
72 (new StringBuilder().append("http://").append(ConfigUtil.getInstance().getConsulAddress())
73 .append(DiscoverUtil.CONSUL_CATALOG_URL).append("/services")).toString();
75 String resultJson = HttpClientUtil.httpGet(consulServiceUrl);
76 Map<String, String[]> catalogServiceMap = (Map<String, String[]>) JacksonJsonUtil.jsonToMapBean(resultJson);
78 List<MicroServiceFullInfo> microServiceFullInfoArray = new ArrayList<MicroServiceFullInfo>();
80 if (catalogServiceMap.isEmpty()) {
81 return microServiceFullInfoArray;
84 for (Map.Entry<String, String[]> entry : catalogServiceMap.entrySet()) {
85 Set<String> versionSet = new HashSet<String>();
87 Set<String> nsSet = new HashSet<String>();
90 String consul_serviceName = entry.getKey().toString();
91 String[] tagList = entry.getValue();
93 for (String tag : tagList) {
95 if (tag.startsWith("\"base\"")) {
96 String ms_base_json = tag.split("\"base\":")[1];
99 Map<String, String> baseMap =
100 (Map<String, String>) JacksonJsonUtil.jsonToBean(ms_base_json, Map.class);
101 if (baseMap.get("version") != null) {
102 versionSet.add(baseMap.get("version"));
106 } catch (Exception e) {
107 LOGGER.error(e.getMessage());
114 if (tag.startsWith("\"ns\"")) {
115 String ms_ns_json = tag.split("\"ns\":")[1];
118 Map<String, String> namespaceMap =
119 (Map<String, String>) JacksonJsonUtil.jsonToBean(ms_ns_json, Map.class);
120 if (namespaceMap.get("namespace") != null) {
121 nsSet.add(namespaceMap.get("namespace"));
128 } catch (Exception e) {
129 // TODO Auto-generated catch block
130 LOGGER.error(e.getMessage());
140 for (String ms_version : versionSet) {
141 for (String ns : nsSet) {
142 MicroServiceFullInfo microServiceFullInfo =
143 getMicroServiceInstanceForAll(consul_serviceName, ms_version, ns);
144 if (microServiceFullInfo != null && !"consul".equals(microServiceFullInfo.getServiceName())) {
146 microServiceFullInfoArray.add(microServiceFullInfo);
155 return microServiceFullInfoArray;
161 * @Title getMicroServiceInstanceForAll
162 * @Description TODO(通过列表遍历获取单个服务信息)
163 * @param consul_serviceName
167 * @return MicroServiceFullInfo
169 public MicroServiceFullInfo getMicroServiceInstanceForAll(String consul_serviceName, String version,
173 ConsulResponse consulResponse = getHealthServices(consul_serviceName, false, "", "");
174 if (consulResponse == null) {
175 LOGGER.error("microservice not found: serviceName-" + consul_serviceName + ", namespace-" + namespace);
179 String serviceName = consul_serviceName;
180 if (StringUtils.isNotBlank(namespace)) {
181 if (consul_serviceName.endsWith("-" + namespace)) {
182 serviceName = consul_serviceName.substring(0, consul_serviceName.length() - namespace.length() - 1);
187 ConsulResponse serviceResponse =
188 getMicroServiceInfo(consulResponse, serviceName, version, false, "", namespace);
189 return (MicroServiceFullInfo) serviceResponse.getResponse();
190 } catch (Exception e) {
191 if (StringUtils.isNotBlank(namespace)) {
192 LOGGER.error("get service List have error:serviceName[" + consul_serviceName + "],version[" + version
193 + "],namespace[" + namespace + "]:" + e.getMessage());
202 * @Title getMicroServiceInstance
203 * @Description TODO(通过Rest接口获取单个服务信息)
206 * @param ifPassStatus
212 * @return ConsulResponse
214 public ConsulResponse getMicroServiceInstance(String serviceName, String version, boolean ifPassStatus, String wait,
215 String index, String labels, String namespace) {
217 if ("null".equals(version)) {
222 checkServiceNameAndVersion(serviceName, version);
224 if (!RegExpTestUtil.labelRegExpTest(labels)) {
225 throw new UnprocessableEntityException(
226 "get MicroServiceInfo FAIL: The label query parameter format is wrong (key:value)");
229 String consul_serviceName = getServiceName4Consul(serviceName, namespace);
231 ConsulResponse consulResponse = getHealthServices(consul_serviceName, ifPassStatus, wait, index);
232 if (consulResponse == null) {
233 String errInfo = "microservice not found: serviceName-" + serviceName + ", namespace-" + namespace;
234 throw new ExtendedNotFoundException(errInfo);
237 return getMicroServiceInfo(consulResponse, serviceName, version, ifPassStatus, labels, namespace);
244 * Title: getMicroServiceInstance Description:获取指定服务信息
249 * @see com.zte.ums.nfv.eco.hsif.msb.core.IMSBService#getMicroServiceInstance(java.lang.String,
253 public ConsulResponse getMicroServiceInfo(ConsulResponse consulResponse, String serviceName, String version,
254 boolean ifPassStatus, String labels, String namespace) {
255 // TODO Auto-generated method stub
259 String resultJson = (String) consulResponse.getResponse();
260 List<HealthService> healthServiceList =
261 JacksonJsonUtil.jsonToListBean(resultJson, new TypeReference<List<HealthService>>() {});
264 if (healthServiceList == null || healthServiceList.size() == 0) {
265 String errInfo = "microservice not found: serviceName-" + serviceName + ", namespace-" + namespace;
266 throw new ExtendedNotFoundException(errInfo);
272 // label query,format key:value|value2,key2:value2
273 boolean islabelQuery = false;
274 Map<String, String> query_labelMap = new HashMap<String, String>();
275 if (StringUtils.isNotBlank(labels)) {
277 String[] routeLabels = StringUtils.split(labels, ",");
279 for (int i = 0; i < routeLabels.length; i++) {
280 String[] labelArray = StringUtils.split(routeLabels[i], ":");
281 query_labelMap.put(labelArray[0], labelArray[1]);
286 MicroServiceFullInfo microServiceInfo = new MicroServiceFullInfo();
287 Set<NodeInfo> nodes = new HashSet<NodeInfo>();
288 Set<String> serviceLabels = new HashSet<String>();
289 Set<KeyVaulePair> serviceMetadatas = new HashSet<KeyVaulePair>();
290 Set<String> serviceNetworkPlane = new HashSet<String>();
291 String nodeNamespace = "";
295 for (HealthService healthService : healthServiceList) {
296 Service service = healthService.getService();
297 List<String> tagList = service.getTags();
299 String ms_url = "", ms_version = "", ms_protocol = "", ms_status = "", ms_publish_port = "",
300 ms_is_manual = "", ms_visualRange = "1", ms_network_plane_type = "", ms_lb_policy = "",
301 ms_host = "", ms_path = "";
302 List<KeyVaulePair> ms_metadata = new ArrayList<KeyVaulePair>();
304 List<String> nodeLabels = new ArrayList<String>();
305 Map<String, String> labelMap = new HashMap<String, String>();
307 NodeInfo node = new NodeInfo();
309 node.setIp(service.getAddress());
310 node.setPort(String.valueOf(service.getPort()));
311 node.setNodeId(service.getId());
317 for (String tag : tagList) {
320 if (tag.startsWith("\"base\"")) {
321 String ms_base_json = tag.split("\"base\":")[1];
323 Map<String, String> baseMap =
324 (Map<String, String>) JacksonJsonUtil.jsonToBean(ms_base_json, Map.class);
325 ms_url = (baseMap.get("url") == null ? "" : baseMap.get("url"));
326 ms_version = (baseMap.get("version") == null ? "" : baseMap.get("version"));
327 ms_protocol = (baseMap.get("protocol") == null ? "" : baseMap.get("protocol"));
328 ms_status = (baseMap.get("status") == null ? "1" : baseMap.get("status"));
330 if (baseMap.get("publish_port") != null) {
331 ms_publish_port = (baseMap.get("publish_port"));
334 if (baseMap.get("is_manual") != null) {
335 ms_is_manual = baseMap.get("is_manual");
339 if (baseMap.get("ha_role") != null) {
340 node.setHa_role(baseMap.get("ha_role"));
343 if (baseMap.get("host") != null) {
344 ms_host = baseMap.get("host");
347 if (baseMap.get("path") != null) {
348 ms_path = baseMap.get("path");
354 if (tag.startsWith("\"labels\"")) {
355 String ms_labels_json = "{" + tag.split("\"labels\":\\{")[1];
356 labelMap = (Map<String, String>) JacksonJsonUtil.jsonToBean(ms_labels_json, Map.class);
360 for (Map.Entry<String, String> labelEntry : labelMap.entrySet()) {
361 if ("visualRange".equals(labelEntry.getKey())) {
362 ms_visualRange = labelEntry.getValue();
363 } else if ("network_plane_type".equals(labelEntry.getKey())) {
364 ms_network_plane_type = labelEntry.getValue();
366 nodeLabels.add(labelEntry.getKey() + ":" + labelEntry.getValue());
375 if (tag.startsWith("\"ns\"")) {
376 String ms_namespace_json = tag.split("\"ns\":")[1];
377 Map<String, String> namespaceMap = (Map<String, String>) JacksonJsonUtil
378 .jsonToBean(ms_namespace_json, Map.class);
380 if (namespaceMap.get("namespace") != null) {
381 nodeNamespace = namespaceMap.get("namespace");
389 if (tag.startsWith("\"lb\"")) {
390 String ms_lb_json = tag.split("\"lb\":")[1];
391 Map<String, String> lbMap =
392 (Map<String, String>) JacksonJsonUtil.jsonToBean(ms_lb_json, Map.class);
394 if (lbMap.get("lb_policy") != null) {
395 ms_lb_policy = lbMap.get("lb_policy");
396 if (ms_lb_policy.startsWith("hash") || ms_lb_policy.equals("ip_hash")) {
397 ms_lb_policy = "ip_hash";
402 if (lbMap.get("lb_server_params") != null) {
403 node.setLb_server_params(lbMap.get("lb_server_params").replace(" ", ","));
409 if (tag.startsWith("\"checks\"")) {
410 String ms_check_json = tag.split("\"checks\":")[1];
411 Map<String, String> checkMap =
412 (Map<String, String>) JacksonJsonUtil.jsonToBean(ms_check_json, Map.class);
416 if (StringUtils.isNotBlank(checkMap.get("ttl"))) {
417 node.setCheckType("TTL");
418 node.setTtl(checkMap.get("ttl"));
419 } else if (StringUtils.isNotBlank(checkMap.get("http"))) {
420 node.setCheckType("HTTP");
421 node.setCheckUrl(checkMap.get("http"));
422 if (checkMap.get("interval") != null)
423 node.setCheckInterval(checkMap.get("interval"));
424 if (checkMap.get("timeout") != null)
425 node.setCheckTimeOut(checkMap.get("timeout"));
426 } else if (StringUtils.isNotBlank(checkMap.get("tcp"))) {
427 node.setCheckType("TCP");
428 node.setCheckUrl(checkMap.get("tcp"));
429 if (checkMap.get("interval") != null)
430 node.setCheckInterval(checkMap.get("interval"));
431 if (checkMap.get("timeout") != null)
432 node.setCheckTimeOut(checkMap.get("timeout"));
438 if (tag.startsWith("\"metadata\"")) {
439 String ms_metadata_json = "{" + tag.split("\"metadata\":\\{")[1];
440 Map<String, String> metadataMap = (Map<String, String>) JacksonJsonUtil
441 .jsonToBean(ms_metadata_json, Map.class);
445 for (Map.Entry<String, String> entry : metadataMap.entrySet()) {
446 KeyVaulePair keyVaulePair = new KeyVaulePair();
447 keyVaulePair.setKey(entry.getKey());
448 keyVaulePair.setValue(entry.getValue());
449 ms_metadata.add(keyVaulePair);
459 } catch (Exception e) {
460 LOGGER.error(serviceName + " read tag throw exception", e);
464 List<Check> checks = healthService.getChecks();
465 node.setStatus("passing");
466 for (Check check : checks) {
467 if (!"passing".equals(check.getStatus())) {
468 node.setStatus(check.getStatus());
473 if (!ms_version.equals(version)) {
478 if (!namespace.equals(nodeNamespace)) {
484 boolean ifMatchLabel = false;
485 for (Map.Entry<String, String> query_entry : query_labelMap.entrySet()) {
486 String key = query_entry.getKey();
487 String value = query_entry.getValue();
488 if (StringUtils.isBlank(labelMap.get(key))) {
492 String[] queryTagArray = StringUtils.split(value, "|");
493 String[] serviceTagArray = StringUtils.split(labelMap.get(key), "|");
494 if (DiscoverUtil.contain(queryTagArray, serviceTagArray)) {
508 serviceLabels.addAll(nodeLabels);
509 serviceMetadatas.addAll(ms_metadata);
511 String[] network_plane_array = StringUtils.split(ms_network_plane_type, "|");
512 for (int i = 0; i < network_plane_array.length; i++) {
513 serviceNetworkPlane.add(network_plane_array[i]);
518 microServiceInfo.setServiceName(serviceName);
519 microServiceInfo.setUrl(ms_url);
520 microServiceInfo.setVersion(ms_version);
521 microServiceInfo.setProtocol(ms_protocol);
522 microServiceInfo.setStatus(ms_status);
523 microServiceInfo.setPublish_port(ms_publish_port);
524 microServiceInfo.setIs_manual(Boolean.parseBoolean(ms_is_manual));
525 microServiceInfo.setVisualRange(ms_visualRange);
527 microServiceInfo.setLb_policy(ms_lb_policy);
528 microServiceInfo.setNamespace(namespace);
529 microServiceInfo.setHost(ms_host);
530 microServiceInfo.setPath(ms_path);
534 if (nodes.isEmpty()) {
537 String errInfo = "microservice not found: serviceName-" + serviceName + ",version-" + version
538 + ",namespace-" + namespace + ",labels-" + labels;
539 throw new ExtendedNotFoundException(errInfo);
545 microServiceInfo.setLabels(new ArrayList<String>(serviceLabels));
546 microServiceInfo.setMetadata(new ArrayList<KeyVaulePair>(serviceMetadatas));
547 microServiceInfo.setNodes(nodes);
548 microServiceInfo.setNetwork_plane_type(StringUtils.join(serviceNetworkPlane.toArray(), "|"));
552 return new ConsulResponse(microServiceInfo, consulResponse.getIndex());
555 } catch (ExtendedNotFoundException e) {
557 } catch (Exception e) {
558 throw new ExtendedInternalServerErrorException(e.getMessage());
566 public MicroServiceFullInfo updateMicroServiceInstance(String serviceName, String version, String namespace,
567 MicroServiceInfo microServiceInfo, String requestIP, boolean is_manual) {
569 checkMicroServiceInfo(microServiceInfo);
570 deleteMicroService(serviceName, version, namespace);
571 return saveMicroServiceInstance(microServiceInfo, true, requestIP, is_manual);
575 * Title: saveMicroServiceInstance Description: 保存服务信息
577 * @param microServiceInfo
578 * @param createOrUpdate true:添加或追加更新 false:覆盖
579 * @param requestIP 访问请求IP地址
581 * @see com.zte.ums.nfv.eco.hsif.msb.core.IMSBService#saveMicroServiceInstance(org.onap.msb.sdclient.core.MicroServiceInfo,
582 * boolean, java.lang.String)
584 public MicroServiceFullInfo saveMicroServiceInstance(MicroServiceInfo microServiceInfo, boolean createOrUpdate,
585 String requestIP, boolean is_manual) {
588 checkMicroServiceInfo(microServiceInfo);
590 String serviceName = microServiceInfo.getServiceName().trim();
592 if (createOrUpdate == false) {
595 deleteMicroService(microServiceInfo.getServiceName(), microServiceInfo.getVersion(),
596 microServiceInfo.getNamespace());
597 } catch (ExtendedNotFoundException e) {
598 String errInfo = "microservice not found: serviceName-" + microServiceInfo.getServiceName()
599 + ",version-" + microServiceInfo.getVersion() + " ,namespace-"
600 + microServiceInfo.getNamespace();
601 LOGGER.warn(errInfo);
608 Set<Node> nodes = microServiceInfo.getNodes();
609 String[] visualRangeArray = StringUtils.split(microServiceInfo.getVisualRange(), "|");
613 for (Node node : nodes) {
614 AgentService agentService = new AgentService();
616 if (StringUtils.isBlank(node.getIp())) {
617 node.setIp(requestIP);
620 String serverId = microServiceInfo.getNamespace() + "_" + serviceName + "_" + node.getIp() + "_"
624 List<String> tags = new ArrayList<String>();
626 Map<String, String> baseMap = new HashMap<String, String>();
627 Map<String, String> lbMap = new HashMap<String, String>();
628 Map<String, String> labelMap = new HashMap<String, String>();
629 Map<String, String> metadataMap = new HashMap<String, String>();
630 Map<String, String> checkMap = new HashMap<String, String>();
631 Map<String, String> nsMap = new HashMap<String, String>();
632 // Map<String, String> nodeMap = new HashMap<String, String>();
634 baseMap.put("url", microServiceInfo.getUrl());
635 baseMap.put("protocol", microServiceInfo.getProtocol());
636 baseMap.put("version", microServiceInfo.getVersion());
638 baseMap.put("status", "1");
639 baseMap.put("is_manual", Boolean.toString(is_manual));
641 // TCP和UDP协议保存 nginx端口和负载均衡策略
642 if (StringUtils.isNotBlank(microServiceInfo.getPublish_port())) {
643 baseMap.put("publish_port", microServiceInfo.getPublish_port());
645 String lb_policy = microServiceInfo.getLb_policy();
648 if (StringUtils.isNotBlank(lb_policy)) {
653 if ("TCP".equals(microServiceInfo.getProtocol())
654 || "UDP".equals(microServiceInfo.getProtocol())) {
655 lbMap.put("lb_policy", "hash $remote_addr");
657 lbMap.put("lb_policy", "ip_hash");
661 lbMap.put("lb_policy", lb_policy);
667 if (StringUtils.isNotBlank(node.getLb_server_params())) {
668 lbMap.put("lb_server_params", node.getLb_server_params().trim().replace(",", " "));
672 if (StringUtils.isNotBlank(node.getHa_role())) {
673 baseMap.put("ha_role", node.getHa_role());
676 if (StringUtils.isNotBlank(microServiceInfo.getHost())) {
677 baseMap.put("host", microServiceInfo.getHost().toLowerCase());
680 if (StringUtils.isNotBlank(microServiceInfo.getPath())) {
681 baseMap.put("path", microServiceInfo.getPath());
685 if (StringUtils.isNotBlank(node.getCheckType())) {
687 AgentService.Check check = agentService.createCheck();
689 if ("TTL".equals(node.getCheckType())) {
690 check.setTtl(node.getTtl());
691 checkMap.put("ttl", node.getTtl());
693 } else if ("HTTP".equals(node.getCheckType())) {
694 check.setInterval(node.getCheckInterval());
695 check.setHttp(node.getCheckUrl());
696 check.setTimeout(node.getCheckTimeOut());
698 checkMap.put("http", node.getCheckUrl());
699 checkMap.put("interval", node.getCheckInterval());
700 checkMap.put("timeout", node.getCheckTimeOut());
701 } else if ("TCP".equals(node.getCheckType())) {
702 check.setInterval(node.getCheckInterval());
703 check.setTcp(node.getCheckUrl());
704 check.setTimeout(node.getCheckTimeOut());
706 checkMap.put("tcp", node.getCheckUrl());
707 checkMap.put("interval", node.getCheckInterval());
708 checkMap.put("timeout", node.getCheckTimeOut());
711 agentService.setCheck(check);
715 List<KeyVaulePair> keyVaulePairs = microServiceInfo.getMetadata();
717 if (keyVaulePairs != null && keyVaulePairs.size() > 0) {
718 for (KeyVaulePair keyVaulePair : keyVaulePairs) {
719 metadataMap.put(keyVaulePair.getKey(), keyVaulePair.getValue());
724 labelMap.put("visualRange", StringUtils.join(visualRangeArray, "|"));
726 if (StringUtils.isNotBlank(microServiceInfo.getNetwork_plane_type())) {
727 labelMap.put("network_plane_type", microServiceInfo.getNetwork_plane_type());
729 if (microServiceInfo.getLabels() != null) {
730 for (String label : microServiceInfo.getLabels()) {
731 String[] labelArray = StringUtils.split(label, ":");
732 if (labelArray.length == 2) {
733 labelMap.put(labelArray[0], labelArray[1]);
738 if (StringUtils.isNotBlank(microServiceInfo.getNamespace())) {
739 nsMap.put("namespace", microServiceInfo.getNamespace());
744 tags.add("\"base\":" + JacksonJsonUtil.beanToJson(baseMap));
745 if (!lbMap.isEmpty())
746 tags.add("\"lb\":" + JacksonJsonUtil.beanToJson(lbMap));
747 if (!checkMap.isEmpty())
748 tags.add("\"checks\":" + JacksonJsonUtil.beanToJson(checkMap));
749 if (!labelMap.isEmpty())
750 tags.add("\"labels\":" + JacksonJsonUtil.beanToJson(labelMap));
751 if (!metadataMap.isEmpty())
752 tags.add("\"metadata\":" + JacksonJsonUtil.beanToJson(metadataMap));
753 if (!nsMap.isEmpty())
754 tags.add("\"ns\":" + JacksonJsonUtil.beanToJson(nsMap));
756 agentService.setTags(tags);
758 agentService.setAddress(node.getIp());
759 agentService.setId(serverId);
760 agentService.setPort(Integer.parseInt(node.getPort()));
762 String consul_serviceName = getServiceName4Consul(serviceName, microServiceInfo.getNamespace());
765 agentService.setName(consul_serviceName);
768 if (DiscoverUtil.CONSUL_REGISTER_MODE.equals(ConfigUtil.getInstance().getConsulRegisterMode())) {
769 registerResult = ConsulCatalogServiceWrapper.getInstance().saveService(agentService);
771 registerResult = ConsulAgentServiceWrapper.getInstance().saveService(agentService);
774 if (registerResult != 200) {
775 throw new Exception("register consul service fail:" + registerResult);
782 LOGGER.info("save microservice success: serviceName-" + microServiceInfo.getServiceName() + ",version-"
783 + microServiceInfo.getVersion() + " ,namespace-" + microServiceInfo.getNamespace());
785 return getMicroServiceInstance(serviceName, microServiceInfo.getVersion(), microServiceInfo.getNamespace());
788 } catch (ExtendedNotFoundException e) {
790 } catch (Exception e) {
791 LOGGER.error("register consul service throw exception", e);
792 throw new ExtendedInternalServerErrorException(e.getMessage());
800 public MicroServiceFullInfo getMicroServiceInstance(String serviceName, String version, String namespace) {
801 ConsulResponse serviceResponse = getMicroServiceInstance(serviceName, version, false, "", "", "", namespace);
802 return (MicroServiceFullInfo) serviceResponse.getResponse();
807 * Title: deleteMicroService Description: 删除服务信息
811 * @see com.zte.ums.nfv.eco.hsif.msb.core.IMSBService#deleteMicroService(java.lang.String,
814 public void deleteMicroService(String serviceName, String version, String namespace) {
817 if ("null".equals(version)) {
821 checkServiceNameAndVersion(serviceName, version);
824 String consul_serviceName = getServiceName4Consul(serviceName, namespace);
826 List<CatalogService> catalogServiceList = getConsulServices(consul_serviceName, version);
829 if (catalogServiceList == null || catalogServiceList.size() == 0) {
830 String errInfo = "microservice not found: serviceName-" + serviceName + ",version-" + version
831 + " ,namespace-" + namespace;
832 throw new ExtendedNotFoundException(errInfo);
836 boolean ifFindServiceForNS = false;
838 for (CatalogService catalogService : catalogServiceList) {
840 List<String> tagList = catalogService.getServiceTags();
841 String serviceNamespace = "", serviceVersion = "";
844 for (String tag : tagList) {
846 if (tag.startsWith("\"ns\"")) {
847 String ms_ns_json = tag.split("\"ns\":")[1];
850 Map<String, String> nsMap =
851 (Map<String, String>) JacksonJsonUtil.jsonToBean(ms_ns_json, Map.class);
852 if (nsMap.get("namespace") != null) {
853 serviceNamespace = nsMap.get("namespace");
859 if (tag.startsWith("\"base\"")) {
860 String ms_base_json = tag.split("\"base\":")[1];
863 Map<String, String> baseMap =
864 (Map<String, String>) JacksonJsonUtil.jsonToBean(ms_base_json, Map.class);
865 if (baseMap.get("version") != null) {
866 serviceVersion = baseMap.get("version");
876 } catch (Exception e) {
877 LOGGER.error(serviceName + " read tag throw exception", e);
880 if (!serviceNamespace.equals(namespace)) {
884 if (!serviceVersion.equals(version)) {
887 ifFindServiceForNS = true;
888 String serviceID = catalogService.getServiceId();
892 if (DiscoverUtil.CONSUL_REGISTER_MODE.equals(ConfigUtil.getInstance().getConsulRegisterMode())) {
893 delResult = ConsulCatalogServiceWrapper.getInstance().deleteService(serviceID);
895 delResult = ConsulAgentServiceWrapper.getInstance().deleteService(serviceID);
898 if (delResult != 200) {
899 throw new Exception("delete consul service fail:" + delResult);
903 } catch (Exception e) {
904 LOGGER.error("delete consul service throw exception", e);
905 throw new ExtendedInternalServerErrorException(e.getMessage());
912 if (!ifFindServiceForNS) {
913 String errInfo = "microservice not found: serviceName-" + serviceName + ",version-" + version
914 + ",namespace-" + namespace;
915 throw new ExtendedNotFoundException(errInfo);
918 LOGGER.info("microservice delete success: serviceName-" + serviceName + ",version-" + version + ",namespace-"
924 * Title: deleteMicroServiceInstance Description: 刪除服务的节点信息
930 * @see com.zte.ums.nfv.eco.hsif.msb.core.IMSBService#deleteMicroServiceInstance(java.lang.String,
931 * java.lang.String, java.lang.String, java.lang.String)
933 public void deleteMicroServiceInstance(String serviceName, String version, String namespace, String ip,
935 if ("null".equals(version)) {
939 checkServiceNameAndVersion(serviceName, version);
942 if (!RegExpTestUtil.ipRegExpTest(ip)) {
943 throw new UnprocessableEntityException(
944 "delete MicroServiceInfo FAIL:IP(" + ip + ")is not a valid IP address");
947 if (!RegExpTestUtil.portRegExpTest(port)) {
948 throw new UnprocessableEntityException(
949 "delete MicroServiceInfo FAIL:Port(" + port + ")is not a valid Port address");
952 String consul_serviceName = getServiceName4Consul(serviceName, namespace);
954 List<CatalogService> catalogServiceList = getConsulServices(consul_serviceName, version);
957 if (catalogServiceList == null || catalogServiceList.size() == 0) {
958 String errInfo = "microservice not found: serviceName-" + serviceName + ",version-" + version;
959 LOGGER.warn(errInfo);
960 throw new ExtendedNotFoundException(errInfo);
964 String node = "", serviceID = "";
965 boolean ifFindBNode = false;
968 for (CatalogService catalogService : catalogServiceList) {
970 String serviceAddress = catalogService.getServiceAddress();
971 String servicePort = String.valueOf(catalogService.getServicePort());
975 List<String> tagList = catalogService.getServiceTags();
976 String ms_version = "", ms_namespace = "";
979 for (String tag : tagList) {
981 if (tag.startsWith("\"base\"")) {
982 String ms_base_json = tag.split("\"base\":")[1];
986 Map<String, String> baseMap =
987 (Map<String, String>) JacksonJsonUtil.jsonToBean(ms_base_json, Map.class);
988 if (baseMap.get("version") != null) {
989 ms_version = baseMap.get("version");
995 if (tag.startsWith("\"ns\"")) {
996 String ms_ns_json = tag.split("\"ns\":")[1];
1000 Map<String, String> nsMap =
1001 (Map<String, String>) JacksonJsonUtil.jsonToBean(ms_ns_json, Map.class);
1002 if (nsMap.get("namespace") != null) {
1003 ms_namespace = nsMap.get("namespace");
1010 } catch (Exception e) {
1011 LOGGER.error(serviceName + " read tag throw exception", e);
1013 if (serviceAddress.equals(ip) && servicePort.equals(port) && ms_version.equals(version)
1014 && ms_namespace.equals(namespace)) {
1015 node = catalogService.getNode();
1016 serviceID = catalogService.getServiceId();
1025 throw new ExtendedNotFoundException("delete MicroServiceInfo FAIL: node-" + ip + ":" + port + " namespace-"
1026 + namespace + " not found ");
1033 if (DiscoverUtil.CONSUL_REGISTER_MODE.equals(ConfigUtil.getInstance().getConsulRegisterMode())) {
1034 delResult = ConsulCatalogServiceWrapper.getInstance().deleteService(serviceID);
1036 delResult = ConsulAgentServiceWrapper.getInstance().deleteService(serviceID);
1039 if (delResult != 200) {
1040 throw new Exception("delete consul service fail:" + delResult);
1044 } catch (Exception e) {
1045 LOGGER.error("delete consul service throw exception", e);
1046 throw new ExtendedInternalServerErrorException(e.getMessage());
1053 * @Title getConsulServices
1054 * @Description TODO(通过方法:根据服务名\版本号获取consul服务信息)
1055 * @param serviceName
1057 * @return List<CatalogService>
1059 private List<CatalogService> getConsulServices(String serviceName, String version) {
1060 // serviceName = serviceName.replace("/", "*");
1061 String consulServiceUrl = (new StringBuilder().append("http://")
1062 .append(ConfigUtil.getInstance().getConsulAddress()).append(DiscoverUtil.CONSUL_CATALOG_URL)
1063 .append("/service/").append(serviceName)).toString();
1065 String resultJson = HttpClientUtil.httpGet(consulServiceUrl);
1066 List<CatalogService> catalogServiceList = (List<CatalogService>) JacksonJsonUtil.jsonToListBean(resultJson);
1068 for (CatalogService catalogService : catalogServiceList) {
1071 List<String> tagList = catalogService.getServiceTags();
1072 String ms_version = "";
1074 for (String tag : tagList) {
1076 if (tag.startsWith("\"base\"")) {
1077 String ms_base_json = tag.split("\"base\":")[1];
1080 Map<String, String> baseMap =
1081 (Map<String, String>) JacksonJsonUtil.jsonToBean(ms_base_json, Map.class);
1082 if (baseMap.get("version") != null) {
1083 ms_version = baseMap.get("version");
1090 } catch (Exception e) {
1091 LOGGER.error(serviceName + " read tag throw exception", e);
1093 if (!ms_version.equals(version)) {
1094 catalogServiceList.remove(catalogService);
1100 return catalogServiceList;
1104 * @Title getHealthServices
1105 * @Description TODO(通过方法:根据服务名获取consul服务健康检查信息)
1106 * @param serviceName
1107 * @return List<HealthService>
1109 private ConsulResponse getHealthServices(String serviceName, boolean ifPassStatus, String wait, String index) {
1110 // serviceName = serviceName.replace("/", "*");
1111 StringBuilder healthServiceUrlBuilder =
1112 new StringBuilder().append("http://").append(ConfigUtil.getInstance().getConsulAddress())
1113 .append(DiscoverUtil.CONSUL_HEALTH_URL).append(serviceName);
1116 healthServiceUrlBuilder.append("?passing");
1119 if (StringUtils.isNotBlank(wait) && StringUtils.isNotBlank(index)) {
1121 healthServiceUrlBuilder.append("&wait=").append(wait).append("&index=").append(index);
1123 healthServiceUrlBuilder.append("?wait=").append(wait).append("&index=").append(index);
1127 return HttpClientUtil.httpWaitGet(healthServiceUrlBuilder.toString());
1133 public void healthCheckbyTTL(String serviceName, String version, String namespace, NodeAddress checkNode) {
1134 // TODO Auto-generated method stub
1135 if ("null".equals(version)) {
1139 checkServiceNameAndVersion(serviceName, version);
1142 if (!RegExpTestUtil.ipRegExpTest(checkNode.getIp())) {
1143 throw new UnprocessableEntityException(
1144 "healthCheck by TTL FAIL:IP(" + checkNode.getIp() + ")is not a valid IP address");
1147 if (!RegExpTestUtil.portRegExpTest(checkNode.getPort())) {
1148 throw new UnprocessableEntityException(
1149 "healthCheck by TTL FAIL:Port(" + checkNode.getPort() + ")is not a valid Port address");
1152 String consul_serviceName = getServiceName4Consul(serviceName, namespace);
1154 List<CatalogService> catalogServiceList = getConsulServices(consul_serviceName, version);
1157 if (catalogServiceList == null || catalogServiceList.size() == 0) {
1158 String errInfo = "microservice not found: serviceName-" + serviceName + ",version-" + version;
1159 LOGGER.warn(errInfo);
1160 throw new ExtendedNotFoundException(errInfo);
1165 boolean ifFindBNode = false;
1168 for (CatalogService catalogService : catalogServiceList) {
1170 String serviceAddress = catalogService.getServiceAddress();
1171 String servicePort = String.valueOf(catalogService.getServicePort());
1172 boolean ifttlCheck = false;
1175 List<String> tagList = catalogService.getServiceTags();
1176 String ms_version = "", ms_namespace = "";
1179 for (String tag : tagList) {
1181 if (tag.startsWith("\"base\"")) {
1182 String ms_base_json = tag.split("\"base\":")[1];
1184 Map<String, String> baseMap =
1185 (Map<String, String>) JacksonJsonUtil.jsonToBean(ms_base_json, Map.class);
1186 if (baseMap.get("version") != null) {
1187 ms_version = baseMap.get("version");
1191 if (tag.startsWith("\"ns\"")) {
1192 String ms_ns_json = tag.split("\"ns\":")[1];
1194 Map<String, String> nsMap =
1195 (Map<String, String>) JacksonJsonUtil.jsonToBean(ms_ns_json, Map.class);
1196 if (nsMap.get("namespace") != null) {
1197 ms_namespace = nsMap.get("namespace");
1202 if (tag.startsWith("\"checks\"")) {
1203 String ms_check_json = tag.split("\"checks\":")[1];
1204 Map<String, String> checkMap =
1205 (Map<String, String>) JacksonJsonUtil.jsonToBean(ms_check_json, Map.class);
1208 if (StringUtils.isNotBlank(checkMap.get("ttl"))) {
1214 } catch (Exception e) {
1215 LOGGER.error(serviceName + " read tag throw exception", e);
1220 if (serviceAddress.equals(checkNode.getIp()) && servicePort.equals(checkNode.getPort())
1221 && ms_version.equals(version) && ms_namespace.equals(namespace)) {
1223 throw new ExtendedNotFoundException(
1224 "healthCheck by TTL FAIL: Service is not enabled TTL health check ");
1236 throw new ExtendedNotFoundException("healthCheck by TTL FAIL: node-" + checkNode.getIp() + ":"
1237 + checkNode.getPort() + " namespace-" + namespace + " not found ");
1243 String checkID = (new StringBuilder().append("service:").append(namespace).append("_").append(serviceName)
1244 .append("_").append(checkNode.getIp()).append("_").append(checkNode.getPort())).toString();
1246 String consulServiceUrl =
1247 (new StringBuilder().append("http://").append(ConfigUtil.getInstance().getConsulAddress())
1248 .append(DiscoverUtil.CONSUL_AGENT_TTL_URL).append(checkID)).toString();
1250 String result = HttpClientUtil.httpGet(consulServiceUrl);
1251 if ("CheckID does not have associated TTL".equals(result)) {
1252 throw new ExtendedNotFoundException(
1253 "healthCheck by TTL FAIL: Service is not enabled TTL health check ");
1256 } catch (ExtendedInternalServerErrorException e) {
1258 } catch (Exception e) {
1259 throw new ExtendedInternalServerErrorException("healthCheck by TTL FAIL:" + e.getMessage());
1266 // public MicroServiceFullInfo getApigatewayServiceInfo4Host(String namespace){
1267 // return getMicroServiceInstance(DiscoverUtil.APIGATEWAY_SERVINCE, "v1", namespace);
1273 public List<MicroServiceFullInfo> getMicroServiceForNodes(String serviceName, String version, boolean ifPassStatus,
1274 String labels, String namespace) {
1275 // TODO Auto-generated method stub
1276 if ("null".equals(version)) {
1280 checkServiceNameAndVersion(serviceName, version);
1282 if (!RegExpTestUtil.labelRegExpTest(labels)) {
1283 throw new UnprocessableEntityException(
1284 "get MicroServiceInfo FAIL: The label query parameter format is wrong (key:value)");
1288 String consul_serviceName = getServiceName4Consul(serviceName, namespace);
1290 ConsulResponse consulResponse = getHealthServices(consul_serviceName, ifPassStatus, "", "");
1291 if (consulResponse == null) {
1292 String errInfo = "microservice not found: serviceName-" + serviceName;
1293 throw new ExtendedNotFoundException(errInfo);
1295 String resultJson = (String) consulResponse.getResponse();
1296 List<HealthService> healthServiceList =
1297 JacksonJsonUtil.jsonToListBean(resultJson, new TypeReference<List<HealthService>>() {});
1300 if (healthServiceList == null || healthServiceList.size() == 0) {
1301 String errInfo = "microservice not found: serviceName-" + serviceName;
1302 throw new ExtendedNotFoundException(errInfo);
1307 // label query,format key:value|value2,key2:value2
1308 boolean islabelQuery = false;
1309 Map<String, String> query_labelMap = new HashMap<String, String>();
1310 if (StringUtils.isNotBlank(labels)) {
1311 islabelQuery = true;
1312 String[] routeLabels = StringUtils.split(labels, ",");
1314 for (int i = 0; i < routeLabels.length; i++) {
1315 String[] labelArray = StringUtils.split(routeLabels[i], ":");
1316 query_labelMap.put(labelArray[0], labelArray[1]);
1320 List<MicroServiceFullInfo> microServiceInfoList = new ArrayList<MicroServiceFullInfo>();
1324 for (HealthService healthService : healthServiceList) {
1326 Set<NodeInfo> nodes = new HashSet<NodeInfo>();
1327 Set<String> serviceLabels = new HashSet<String>();
1328 String nodeNamespace = "";
1329 MicroServiceFullInfo microServiceInfo = new MicroServiceFullInfo();
1331 Service service = healthService.getService();
1332 List<String> tagList = service.getTags();
1334 String ms_url = "", ms_version = "", ms_protocol = "", ms_status = "", ms_publish_port = "",
1335 ms_is_manual = "", ms_visualRange = "1", ms_network_plane_type = "", ms_lb_policy = "",
1336 ms_host = "", ms_path = "";
1337 List<KeyVaulePair> ms_metadata = new ArrayList<KeyVaulePair>();
1339 List<String> nodeLabels = new ArrayList<String>();
1340 Map<String, String> labelMap = new HashMap<String, String>();
1342 NodeInfo node = new NodeInfo();
1344 node.setIp(service.getAddress());
1345 node.setPort(String.valueOf(service.getPort()));
1346 node.setNodeId(service.getId());
1352 for (String tag : tagList) {
1355 if (tag.startsWith("\"base\"")) {
1356 String ms_base_json = tag.split("\"base\":")[1];
1358 Map<String, String> baseMap =
1359 (Map<String, String>) JacksonJsonUtil.jsonToBean(ms_base_json, Map.class);
1360 ms_url = (baseMap.get("url") == null ? "" : baseMap.get("url"));
1361 ms_version = (baseMap.get("version") == null ? "" : baseMap.get("version"));
1362 ms_protocol = (baseMap.get("protocol") == null ? "" : baseMap.get("protocol"));
1363 ms_status = (baseMap.get("status") == null ? "1" : baseMap.get("status"));
1365 if (baseMap.get("publish_port") != null) {
1366 ms_publish_port = (baseMap.get("publish_port"));
1369 if (baseMap.get("is_manual") != null) {
1370 ms_is_manual = baseMap.get("is_manual");
1374 if (baseMap.get("ha_role") != null) {
1375 node.setHa_role(baseMap.get("ha_role"));
1378 if (baseMap.get("host") != null) {
1379 ms_host = baseMap.get("host");
1382 if (baseMap.get("path") != null) {
1383 ms_path = baseMap.get("path");
1389 if (tag.startsWith("\"labels\"")) {
1390 String ms_labels_json = "{" + tag.split("\"labels\":\\{")[1];
1391 labelMap = (Map<String, String>) JacksonJsonUtil.jsonToBean(ms_labels_json, Map.class);
1395 for (Map.Entry<String, String> labelEntry : labelMap.entrySet()) {
1396 if ("visualRange".equals(labelEntry.getKey())) {
1397 ms_visualRange = labelEntry.getValue();
1398 } else if ("network_plane_type".equals(labelEntry.getKey())) {
1399 ms_network_plane_type = labelEntry.getValue();
1401 nodeLabels.add(labelEntry.getKey() + ":" + labelEntry.getValue());
1410 if (tag.startsWith("\"ns\"")) {
1411 String ms_namespace_json = tag.split("\"ns\":")[1];
1412 Map<String, String> namespaceMap = (Map<String, String>) JacksonJsonUtil
1413 .jsonToBean(ms_namespace_json, Map.class);
1415 if (namespaceMap.get("namespace") != null) {
1416 nodeNamespace = namespaceMap.get("namespace");
1424 if (tag.startsWith("\"lb\"")) {
1425 String ms_lb_json = tag.split("\"lb\":")[1];
1426 Map<String, String> lbMap =
1427 (Map<String, String>) JacksonJsonUtil.jsonToBean(ms_lb_json, Map.class);
1429 if (lbMap.get("lb_policy") != null) {
1430 ms_lb_policy = lbMap.get("lb_policy");
1431 if (ms_lb_policy.startsWith("hash") || ms_lb_policy.equals("ip_hash")) {
1432 ms_lb_policy = "ip_hash";
1437 if (lbMap.get("lb_server_params") != null) {
1438 node.setLb_server_params(lbMap.get("lb_server_params").replace(" ", ","));
1444 if (tag.startsWith("\"checks\"")) {
1445 String ms_check_json = tag.split("\"checks\":")[1];
1446 Map<String, String> checkMap =
1447 (Map<String, String>) JacksonJsonUtil.jsonToBean(ms_check_json, Map.class);
1451 if (StringUtils.isNotBlank(checkMap.get("ttl"))) {
1452 node.setCheckType("TTL");
1453 node.setTtl(checkMap.get("ttl"));
1454 } else if (StringUtils.isNotBlank(checkMap.get("http"))) {
1455 node.setCheckType("HTTP");
1456 node.setCheckUrl(checkMap.get("http"));
1457 if (checkMap.get("interval") != null)
1458 node.setCheckInterval(checkMap.get("interval"));
1459 if (checkMap.get("timeout") != null)
1460 node.setCheckTimeOut(checkMap.get("timeout"));
1461 } else if (StringUtils.isNotBlank(checkMap.get("tcp"))) {
1462 node.setCheckType("TCP");
1463 node.setCheckUrl(checkMap.get("tcp"));
1464 if (checkMap.get("interval") != null)
1465 node.setCheckInterval(checkMap.get("interval"));
1466 if (checkMap.get("timeout") != null)
1467 node.setCheckTimeOut(checkMap.get("timeout"));
1473 if (tag.startsWith("\"metadata\"")) {
1474 String ms_metadata_json = "{" + tag.split("\"metadata\":\\{")[1];
1475 Map<String, String> metadataMap = (Map<String, String>) JacksonJsonUtil
1476 .jsonToBean(ms_metadata_json, Map.class);
1480 for (Map.Entry<String, String> entry : metadataMap.entrySet()) {
1481 KeyVaulePair keyVaulePair = new KeyVaulePair();
1482 keyVaulePair.setKey(entry.getKey());
1483 keyVaulePair.setValue(entry.getValue());
1484 ms_metadata.add(keyVaulePair);
1494 } catch (Exception e) {
1495 LOGGER.error(serviceName + " read tag throw exception", e);
1499 List<Check> checks = healthService.getChecks();
1500 node.setStatus("passing");
1501 for (Check check : checks) {
1502 if (!"passing".equals(check.getStatus())) {
1503 node.setStatus(check.getStatus());
1508 if (!ms_version.equals(version)) {
1513 if (!namespace.equals(nodeNamespace)) {
1519 boolean ifMatchLabel = false;
1520 for (Map.Entry<String, String> query_entry : query_labelMap.entrySet()) {
1521 String key = query_entry.getKey();
1522 String value = query_entry.getValue();
1523 if (StringUtils.isBlank(labelMap.get(key))) {
1527 String[] queryTagArray = StringUtils.split(value, "|");
1528 String[] serviceTagArray = StringUtils.split(labelMap.get(key), "|");
1529 if (DiscoverUtil.contain(queryTagArray, serviceTagArray)) {
1530 ifMatchLabel = true;
1536 if (!ifMatchLabel) {
1543 serviceLabels.addAll(nodeLabels);
1545 microServiceInfo.setServiceName(serviceName);
1546 microServiceInfo.setUrl(ms_url);
1547 microServiceInfo.setVersion(ms_version);
1548 microServiceInfo.setProtocol(ms_protocol);
1549 microServiceInfo.setStatus(null);
1550 microServiceInfo.setPublish_port(ms_publish_port);
1551 microServiceInfo.setIs_manual(Boolean.parseBoolean(ms_is_manual));
1552 microServiceInfo.setVisualRange(ms_visualRange);
1553 microServiceInfo.setNetwork_plane_type(ms_network_plane_type);
1554 microServiceInfo.setLb_policy(ms_lb_policy);
1555 microServiceInfo.setHost(ms_host);
1556 microServiceInfo.setPath(ms_path);
1558 microServiceInfo.setMetadata(ms_metadata);
1559 microServiceInfo.setNamespace(namespace);
1560 microServiceInfo.setLabels(new ArrayList<String>(serviceLabels));
1561 microServiceInfo.setNodes(nodes);
1563 microServiceInfoList.add(microServiceInfo);
1568 if (microServiceInfoList.size() == 0) {
1569 String errInfo = "microservice not found: serviceName-" + serviceName + ",version-" + version
1570 + ",namespace-" + namespace + ",labels-" + labels;
1571 throw new ExtendedNotFoundException(errInfo);
1576 return microServiceInfoList;
1579 } catch (ExtendedNotFoundException e) {
1581 } catch (Exception e) {
1582 throw new ExtendedInternalServerErrorException(e.getMessage());
1587 private String getServiceName4Consul(String serviceName, String namespace) {
1588 String consul_serviceName;
1590 if (StringUtils.isNotBlank(namespace)) {
1591 // if (DiscoverUtil.APIGATEWAY_SERVINCE_DEFAULT.equals(namespace)) {
1592 // consul_serviceName=serviceName;
1594 consul_serviceName = serviceName + "-" + namespace;
1597 consul_serviceName = serviceName;
1599 return consul_serviceName;
1604 private void checkMicroServiceInfo(MicroServiceInfo microServiceInfo) {
1606 if (StringUtils.isBlank(microServiceInfo.getServiceName())
1607 || StringUtils.isBlank(microServiceInfo.getProtocol())) {
1608 throw new UnprocessableEntityException("register MicroServiceInfo FAIL: Some required fields are empty");
1611 if (microServiceInfo.getNodes() == null || microServiceInfo.getNodes().size() == 0) {
1612 throw new UnprocessableEntityException("register MicroServiceInfo FAIL: Nodes fields are empty");
1615 if (!RegExpTestUtil.serviceNameRegExpTest(microServiceInfo.getServiceName().trim())) {
1616 throw new UnprocessableEntityException("register MicroServiceInfo FAIL:ServiceName("
1617 + microServiceInfo.getServiceName() + ") format error");
1620 if (StringUtils.isNotBlank(microServiceInfo.getHost())) {
1621 if (!RegExpTestUtil.serviceNameRegExpTest(microServiceInfo.getHost().trim())) {
1622 throw new UnprocessableEntityException(
1623 "register MicroServiceInfo host (" + microServiceInfo.getHost() + ") format error");
1627 if (StringUtils.isNotBlank(microServiceInfo.getLb_policy())) {
1628 if (!DiscoverUtil.checkExist(DiscoverUtil.LB_POLICY_LIST, microServiceInfo.getLb_policy().trim(), ",")) {
1629 throw new UnprocessableEntityException("register MicroServiceInfo FAIL:lb_policy is wrong,value range:("
1630 + DiscoverUtil.LB_POLICY_LIST + ")");
1635 if (StringUtils.isNotBlank(microServiceInfo.getVersion())) {
1636 if (!RegExpTestUtil.versionRegExpTest(microServiceInfo.getVersion())) {
1637 throw new UnprocessableEntityException("register MicroServiceInfo FAIL:version is not a valid format");
1644 if (StringUtils.isNotBlank(microServiceInfo.getUrl())) {
1646 String url = microServiceInfo.getUrl();
1647 if (!"/".equals(url)) {
1648 if (!url.startsWith("/")) {
1650 microServiceInfo.setUrl(url);
1653 if (url.endsWith("/")) {
1654 url = url.substring(0, url.length() - 1);
1655 microServiceInfo.setUrl(url);
1659 if (!RegExpTestUtil.urlRegExpTest(url)) {
1660 throw new UnprocessableEntityException(
1661 "register MicroServiceInfo FAIL:url (" + url + ") is not a valid format");
1665 microServiceInfo.setUrl("/");
1669 if (StringUtils.isNotBlank(microServiceInfo.getPath())) {
1671 String path = microServiceInfo.getPath();
1672 if (!"/".equals(path)) {
1673 if (!path.startsWith("/")) {
1675 microServiceInfo.setPath(path);
1678 if (path.endsWith("/")) {
1679 path = path.substring(0, path.length() - 1);
1680 microServiceInfo.setPath(path);
1684 if (!RegExpTestUtil.urlRegExpTest(path)) {
1685 throw new UnprocessableEntityException(
1686 "register MicroServiceInfo FAIL:path (" + path + ") is not a valid format");
1695 for (Node node : microServiceInfo.getNodes()) {
1697 if (StringUtils.isNotBlank(node.getIp())) {
1698 if (!RegExpTestUtil.ipRegExpTest(node.getIp())) {
1699 throw new UnprocessableEntityException(
1700 "register MicroServiceInfo FAIL:IP(" + node.getIp() + ")is not a valid ip address");
1704 if (!RegExpTestUtil.portRegExpTest(node.getPort())) {
1705 throw new UnprocessableEntityException("register MicroServiceInfo FAIL:Port(" + node.getPort()
1706 + ")is not a valid Port address");
1710 if (StringUtils.isNotBlank(node.getLb_server_params())) {
1712 String[] lb_server_params_array = node.getLb_server_params().split(",");
1713 for (int i = 0; i < lb_server_params_array.length; i++) {
1714 String params = lb_server_params_array[i].split("=")[0];
1715 if (!DiscoverUtil.checkExist(DiscoverUtil.LB_PARAMS_LIST, params, ",")) {
1716 throw new UnprocessableEntityException(
1717 "register MicroServiceInfo FAIL:lb_server_params is wrong:"
1718 + lb_server_params_array[i]);
1721 } catch (Exception e) {
1722 throw new UnprocessableEntityException(
1723 "register MicroServiceInfo FAIL:lb_server_params'format is wrong:"
1724 + node.getLb_server_params());
1729 if (StringUtils.isNotBlank(node.getCheckType())) {
1730 if (!DiscoverUtil.checkExist(DiscoverUtil.CHECK_TYPE_LIST, node.getCheckType().trim(), ",")) {
1731 throw new UnprocessableEntityException(
1732 "register MicroServiceInfo FAIL:checkType is wrong,value range:("
1733 + DiscoverUtil.CHECK_TYPE_LIST + ")");
1737 if ("HTTP".equals(node.getCheckType()) || "TCP".equals(node.getCheckType())) {
1738 String checkUrl = node.getCheckUrl();
1739 if (StringUtils.isBlank(checkUrl)) {
1740 throw new UnprocessableEntityException(
1741 "register MicroServiceInfo FAIL:checkUrl field is empty");
1744 if ("HTTP".equals(node.getCheckType())) {
1747 if (RegExpTestUtil.httpUrlRegExpTest(checkUrl)) {
1748 if (!checkUrl.startsWith("http://")) {
1749 checkUrl = "http://" + checkUrl;
1750 node.setCheckUrl(checkUrl);
1753 if (!checkUrl.startsWith("/")) {
1754 checkUrl = "/" + checkUrl;
1756 checkUrl = "http://" + node.getIp() + ":" + node.getPort() + checkUrl;
1757 node.setCheckUrl(checkUrl);
1766 if (StringUtils.isNotBlank(node.getHa_role())) {
1767 if (!DiscoverUtil.checkExist(DiscoverUtil.CHECK_HA_ROLE_LIST, node.getHa_role().trim(), ",")) {
1768 throw new UnprocessableEntityException(
1769 "register MicroServiceInfo FAIL:ha_role is wrong,value range:("
1770 + DiscoverUtil.CHECK_HA_ROLE_LIST + ")");
1779 String[] visualRangeArray = StringUtils.split(microServiceInfo.getVisualRange(), "|");
1780 for (int i = 0; i < visualRangeArray.length; i++) {
1781 if (!DiscoverUtil.checkExist(DiscoverUtil.VISUAL_RANGE_LIST, visualRangeArray[i], ",")) {
1782 throw new UnprocessableEntityException("register MicroServiceInfo FAIL:type is wrong,value range:("
1783 + DiscoverUtil.VISUAL_RANGE_LIST + ")");
1787 microServiceInfo.setProtocol(microServiceInfo.getProtocol().toUpperCase());
1788 if (!DiscoverUtil.checkExist(DiscoverUtil.PROTOCOL_LIST, microServiceInfo.getProtocol().trim(), ",")) {
1789 throw new UnprocessableEntityException("register MicroServiceInfo FAIL:Protocol is wrong,value range:("
1790 + DiscoverUtil.PROTOCOL_LIST + ")");
1793 if (microServiceInfo.getLabels() != null) {
1794 for (String label : microServiceInfo.getLabels()) {
1795 if (!RegExpTestUtil.labelRegExpTest(label)) {
1796 throw new UnprocessableEntityException("register MicroServiceInfo FAIL:label[" + label
1797 + "] is not a valid format(key:value)");
1805 if (StringUtils.isNotBlank(microServiceInfo.getPublish_port())) {
1807 if (DiscoverUtil.checkExist(DiscoverUtil.HTTP_PROTOCOL, microServiceInfo.getProtocol())) {
1809 if (microServiceInfo.getPublish_port().contains("|")) {
1811 String[] publishPortArray = StringUtils.split(microServiceInfo.getPublish_port(), "|");
1813 int portNum = publishPortArray.length;
1816 for (int i = 0; i < portNum; i++) {
1817 if (!RegExpTestUtil.portRegExpTest(publishPortArray[i])) {
1818 throw new UnprocessableEntityException("register MicroServiceInfo FAIL:Public Port("
1819 + publishPortArray[i] + ")is not a valid Port address");
1824 if (portNum == 0 || portNum > 2) {
1825 throw new UnprocessableEntityException(
1826 "register MicroServiceInfo FAIL:Public Port num is wrong:" + portNum);
1827 } else if (portNum == 2) {
1829 if (publishPortArray[0].equals(publishPortArray[1])) {
1830 throw new UnprocessableEntityException(
1831 "register MicroServiceInfo FAIL:Two ports have the same value :"
1832 + publishPortArray[0]);
1834 } else if (portNum == 1) {
1835 throw new UnprocessableEntityException(
1836 "register MicroServiceInfo FAIL:Two ports have one null value");
1839 if (!RegExpTestUtil.portRegExpTest(microServiceInfo.getPublish_port())) {
1840 throw new UnprocessableEntityException("register MicroServiceInfo FAIL:Public Port("
1841 + microServiceInfo.getPublish_port() + ")is not a valid Port address");
1845 } else if ("TCP".equals(microServiceInfo.getProtocol()) || "UDP".equals(microServiceInfo.getProtocol())) {
1846 if (!RegExpTestUtil.portRegExpTest(microServiceInfo.getPublish_port())) {
1847 throw new UnprocessableEntityException("register MicroServiceInfo FAIL:Public Port("
1848 + microServiceInfo.getPublish_port() + ")is not a valid Port address");
1851 int tcpUdpPortRangeStart = Integer.parseInt(ConfigUtil.getInstance().getTcpudpPortRangeStart());
1852 int tcpUdpPortRangeEnd = Integer.parseInt(ConfigUtil.getInstance().getTcpudpPortRangeEnd());
1853 int iPublishPort = Integer.parseInt(microServiceInfo.getPublish_port());
1855 if (iPublishPort > tcpUdpPortRangeEnd || iPublishPort < tcpUdpPortRangeStart) {
1856 throw new UnprocessableEntityException("register MicroServiceInfo FAIL:Public_Port Range ("
1857 + tcpUdpPortRangeStart + "-" + tcpUdpPortRangeEnd + ")");
1861 microServiceInfo.setPublish_port("");
1870 List<MicroServiceFullInfo> serviceList = getMicroServiceForNodes(microServiceInfo.getServiceName(),
1871 microServiceInfo.getVersion(), false, "", microServiceInfo.getNamespace());
1872 if (serviceList != null && serviceList.size() > 0) {
1873 for (MicroServiceFullInfo service : serviceList) {
1874 if (!service.getProtocol().equalsIgnoreCase(microServiceInfo.getProtocol())) {
1875 throw new UnprocessableEntityException(
1876 "register MicroServiceInfo FAIL:There is a same service ,but different protocol--"
1877 + service.getProtocol());
1882 } catch (ExtendedNotFoundException e) {
1883 // LOGGER.info("register MicroServiceInfo CHECK ok for protocol:service is not fond");
1890 private void checkServiceNameAndVersion(String serviceName, String version) {
1891 if (StringUtils.isBlank(serviceName)) {
1892 throw new UnprocessableEntityException("check MicroServiceInfo FAIL:serviceName can't be empty");
1895 if (!RegExpTestUtil.serviceNameRegExpTest(serviceName)) {
1896 throw new UnprocessableEntityException(
1897 "check MicroServiceInfo FAIL:ServiceName(" + serviceName + ") format error");
1900 if (StringUtils.isNotBlank(version)) {
1901 if (!RegExpTestUtil.versionRegExpTest(version)) {
1902 throw new UnprocessableEntityException("check MicroServiceInfo FAIL:version is not a valid format");