1 /*******************************************************************************
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
13 ******************************************************************************/
14 package org.onap.msb.apiroute.wrapper.serviceListener;
16 import java.util.ArrayList;
17 import java.util.List;
20 import org.apache.commons.lang3.StringUtils;
21 import org.onap.msb.apiroute.api.ApiRouteInfo;
22 import org.onap.msb.apiroute.api.CustomRouteInfo;
23 import org.onap.msb.apiroute.api.DiscoverInfo;
24 import org.onap.msb.apiroute.api.IuiRouteInfo;
25 import org.onap.msb.apiroute.api.MicroServiceFullInfo;
26 import org.onap.msb.apiroute.api.Node;
27 import org.onap.msb.apiroute.api.PublishFullAddress;
28 import org.onap.msb.apiroute.api.RouteServer;
29 import org.onap.msb.apiroute.wrapper.ApiRouteServiceWrapper;
30 import org.onap.msb.apiroute.wrapper.CustomRouteServiceWrapper;
31 import org.onap.msb.apiroute.wrapper.IuiRouteServiceWrapper;
32 import org.onap.msb.apiroute.wrapper.util.ConfigUtil;
33 import org.onap.msb.apiroute.wrapper.util.HttpClientUtil;
34 import org.onap.msb.apiroute.wrapper.util.JacksonJsonUtil;
35 import org.onap.msb.apiroute.wrapper.util.RegExpTestUtil;
36 import org.onap.msb.apiroute.wrapper.util.RouteUtil;
37 import org.slf4j.Logger;
38 import org.slf4j.LoggerFactory;
40 import com.fasterxml.jackson.core.type.TypeReference;
42 public class MicroServiceChangeListener implements IMicroServiceChangeListener {
44 private static final Logger LOGGER = LoggerFactory.getLogger(MicroServiceChangeListener.class);
47 public void onDelete(MicroServiceFullInfo microServiceInfo) throws Exception {
49 String path = microServiceInfo.getPath();
51 String[] routeWay = ConfigUtil.getInstance().getRouteWay();
53 for (int i = 0; i < routeWay.length; i++) {
55 if (StringUtils.isNotBlank(path) && !"/".equals(path)) {
57 String host = getHost(microServiceInfo);
58 deleteServiceByUrl(path, host, microServiceInfo.getPublish_port(), routeWay[i]);
61 if (RouteUtil.ROUTEWAY_DOMAIN.equals(routeWay[i]) && ifRootByDomain(microServiceInfo)) {
62 deleteServiceByDomain4Root(microServiceInfo);
65 deleteServiceByProtocol(microServiceInfo, routeWay[i]);
77 public void onSave(MicroServiceFullInfo microServiceInfo) throws Exception {
79 String path = microServiceInfo.getPath();
80 String[] routeWay = ConfigUtil.getInstance().getRouteWay();
82 for (int i = 0; i < routeWay.length; i++) {
84 if (StringUtils.isNotBlank(path) && !"/".equals(path)) {
85 saveServiceByPath(microServiceInfo, routeWay[i]);
88 if (RouteUtil.ROUTEWAY_DOMAIN.equals(routeWay[i]) && ifRootByDomain(microServiceInfo)) {
89 saveServiceByDomain4Root(microServiceInfo);
92 saveServiceByProtocol(microServiceInfo, routeWay[i]);
100 // 判断按协议发布地址是否和注册的URL一致,如果一致发布地址保存为/,否则保存为协议类型的发布地址
101 private boolean ifRootByDomain(MicroServiceFullInfo microServiceInfo) {
104 if ("/".equals(microServiceInfo.getUrl()))
107 String protocol = microServiceInfo.getProtocol();
109 RouteUtil.getRouteNameByns(microServiceInfo.getServiceName(), microServiceInfo.getNamespace());
110 String publishUrl = "";
112 if (StringUtils.isNotBlank(microServiceInfo.getVersion())) {
113 version = "/" + microServiceInfo.getVersion();
117 case RouteUtil.PROTOCOL_UI:
118 publishUrl = "/iui/" + routeName;
120 case RouteUtil.PROTOCOL_REST:
121 publishUrl = "/api/" + routeName + version;
123 case RouteUtil.PROTOCOL_HTTP:
124 publishUrl = "/" + routeName + version;
127 return publishUrl.equals(microServiceInfo.getUrl());
132 private void saveServiceByDomain4Root(MicroServiceFullInfo microServiceInfo) throws Exception {
134 CustomRouteInfo[] customRouteInfos =
135 this.buildCustomRouteInfo(microServiceInfo, "/", RouteUtil.ROUTEWAY_DOMAIN);
136 for (int i = 0; i < customRouteInfos.length; i++) {
137 customRouteInfos[i].setUrl("/");
138 CustomRouteServiceWrapper.getInstance().saveCustomRouteInstance(customRouteInfos[i],
139 RouteUtil.ROUTEWAY_DOMAIN);
143 private void deleteServiceByDomain4Root(MicroServiceFullInfo microServiceInfo) throws Exception {
145 CustomRouteServiceWrapper.getInstance().deleteCustomRoute("/", getHost(microServiceInfo),
146 microServiceInfo.getPublish_port(), RouteUtil.ROUTEWAY_DOMAIN);
150 * @Title saveServiceByProtocol
151 * @Description TODO(按用户注册协议保存服务)
152 * @param microServiceInfo
157 private void saveServiceByProtocol(MicroServiceFullInfo microServiceInfo, String routeWay) throws Exception {
158 String protocol = microServiceInfo.getProtocol();
160 RouteUtil.getRouteNameByns(microServiceInfo.getServiceName(), microServiceInfo.getNamespace());
163 case RouteUtil.PROTOCOL_UI:
164 IuiRouteInfo[] iuiRouteInfos = this.buildIuiRouteInfo(microServiceInfo, routeName, routeWay);
165 for (int i = 0; i < iuiRouteInfos.length; i++) {
166 IuiRouteServiceWrapper.getInstance().saveIuiRouteInstance(iuiRouteInfos[i], routeWay);
170 case RouteUtil.PROTOCOL_REST:
172 ApiRouteInfo[] apiRouteInfos = this.buildApiRouteInfo(microServiceInfo, routeName,
173 microServiceInfo.getVersion(), routeWay);
174 for (int i = 0; i < apiRouteInfos.length; i++) {
175 ApiRouteServiceWrapper.getInstance().saveApiRouteInstance(apiRouteInfos[i], routeWay);
178 case RouteUtil.PROTOCOL_HTTP:
179 CustomRouteInfo[] customRouteInfos = this.buildCustomRouteInfo(microServiceInfo,
180 getHttpName(routeName, microServiceInfo.getVersion()), routeWay);
181 for (int i = 0; i < customRouteInfos.length; i++) {
182 CustomRouteServiceWrapper.getInstance().saveCustomRouteInstance(customRouteInfos[i], routeWay);
189 * @Title deleteServiceByProtocol
190 * @Description TODO(按用户注册协议删除服务)
191 * @param microServiceInfo
195 private void deleteServiceByProtocol(MicroServiceFullInfo microServiceInfo, String routeWay) {
196 String protocol = microServiceInfo.getProtocol();
197 String host = getHost(microServiceInfo);
199 RouteUtil.getRouteNameByns(microServiceInfo.getServiceName(), microServiceInfo.getNamespace());
201 if (RouteUtil.PROTOCOL_UI.equals(protocol)) {
203 if (RouteUtil.ROUTEWAY_IP.equals(routeWay)) {
205 String[] publishPorts = StringUtils.split(microServiceInfo.getPublish_port(), "|");
206 if (publishPorts.length == 2) {
207 IuiRouteServiceWrapper.getInstance().deleteIuiRoute(routeName, host, publishPorts[0], routeWay);
208 IuiRouteServiceWrapper.getInstance().deleteIuiRoute(routeName, host, publishPorts[1], routeWay);
213 IuiRouteServiceWrapper.getInstance().deleteIuiRoute(routeName, host, microServiceInfo.getPublish_port(),
215 } else if (RouteUtil.PROTOCOL_REST.equals(protocol)) {
217 if (RouteUtil.ROUTEWAY_IP.equals(routeWay)) {
219 String[] publishPorts = StringUtils.split(microServiceInfo.getPublish_port(), "|");
220 if (publishPorts.length == 2) {
221 ApiRouteServiceWrapper.getInstance().deleteApiRoute(routeName, microServiceInfo.getVersion(), host,
222 publishPorts[0], routeWay);
223 ApiRouteServiceWrapper.getInstance().deleteApiRoute(routeName, microServiceInfo.getVersion(), host,
224 publishPorts[1], routeWay);
228 ApiRouteServiceWrapper.getInstance().deleteApiRoute(routeName, microServiceInfo.getVersion(), host,
229 microServiceInfo.getPublish_port(), routeWay);
230 } else if (RouteUtil.PROTOCOL_HTTP.equals(protocol)) {
232 if (RouteUtil.ROUTEWAY_IP.equals(routeWay)) {
234 String[] publishPorts = StringUtils.split(microServiceInfo.getPublish_port(), "|");
235 if (publishPorts.length == 2) {
236 CustomRouteServiceWrapper.getInstance().deleteCustomRoute(
237 getHttpName(routeName, microServiceInfo.getVersion()), host, publishPorts[0],
239 CustomRouteServiceWrapper.getInstance().deleteCustomRoute(
240 getHttpName(routeName, microServiceInfo.getVersion()), host, publishPorts[1],
245 CustomRouteServiceWrapper.getInstance().deleteCustomRoute(
246 getHttpName(routeName, microServiceInfo.getVersion()), host,
247 microServiceInfo.getPublish_port(), routeWay);
252 * @Title saveServiceByUrl
253 * @Description TODO(按URL地址判断服务协议并保存到路由表)
255 * @param microServiceInfo
260 private void saveServiceByPath(MicroServiceFullInfo microServiceInfo, String routeWay) throws Exception {
261 String redis_serviceName;
262 String path = microServiceInfo.getPath();
263 if (RegExpTestUtil.apiRouteUrlRegExpTest(path)) {
265 String[] serviceKey = RegExpTestUtil.apiServiceNameMatch4URL(path);
266 if (serviceKey == null) {
267 LOGGER.error("save api Service ByUrl is error:[url]" + path);
270 redis_serviceName = serviceKey[0];
271 String redis_serviceVersion = serviceKey[1];
273 ApiRouteInfo[] apiRouteInfos =
274 this.buildApiRouteInfo(microServiceInfo, redis_serviceName, redis_serviceVersion, routeWay);
275 for (int i = 0; i < apiRouteInfos.length; i++) {
276 ApiRouteServiceWrapper.getInstance().saveApiRouteInstance(apiRouteInfos[i], routeWay);
278 } else if (RegExpTestUtil.iuiRouteUrlRegExpTest(path)) {
281 redis_serviceName = RegExpTestUtil.iuiServiceNameMatch4URL(path);
282 if (redis_serviceName == null) {
283 LOGGER.error("save iui Service ByUrl is error:[url]" + path);
286 IuiRouteInfo[] iuiRouteInfos = this.buildIuiRouteInfo(microServiceInfo, redis_serviceName, routeWay);
287 for (int i = 0; i < iuiRouteInfos.length; i++) {
288 IuiRouteServiceWrapper.getInstance().saveIuiRouteInstance(iuiRouteInfos[i], routeWay);
292 redis_serviceName = path;
293 CustomRouteInfo[] customRouteInfos =
294 this.buildCustomRouteInfo(microServiceInfo, redis_serviceName, routeWay);
295 for (int i = 0; i < customRouteInfos.length; i++) {
296 CustomRouteServiceWrapper.getInstance().saveCustomRouteInstance(customRouteInfos[i], routeWay);
302 * @Title deleteServiceByUrl
303 * @Description TODO(按URL地址判断服务协议并从路由表删除)
306 * @param publish_port
310 private void deleteServiceByUrl(String url, String host, String publish_port, String routeWay) {
312 String redis_serviceName;
314 if (RegExpTestUtil.apiRouteUrlRegExpTest(url)) {
316 String[] serviceKey = RegExpTestUtil.apiServiceNameMatch4URL(url);
317 if (serviceKey == null) {
318 LOGGER.error("delete api Service ByUrl is error:[url]" + url);
322 redis_serviceName = serviceKey[0];
323 String redis_serviceVersion = serviceKey[1];
325 if (RouteUtil.ROUTEWAY_IP.equals(routeWay)) {
327 String[] publishPorts = StringUtils.split(publish_port, "|");
328 if (publishPorts.length == 2) {
329 ApiRouteServiceWrapper.getInstance().deleteApiRoute(redis_serviceName, redis_serviceVersion, host,
330 publishPorts[0], routeWay);
331 ApiRouteServiceWrapper.getInstance().deleteApiRoute(redis_serviceName, redis_serviceVersion, host,
332 publishPorts[1], routeWay);
337 ApiRouteServiceWrapper.getInstance().deleteApiRoute(redis_serviceName, redis_serviceVersion, host,
338 publish_port, routeWay);
342 } else if (RegExpTestUtil.iuiRouteUrlRegExpTest(url)) {
345 redis_serviceName = RegExpTestUtil.iuiServiceNameMatch4URL(url);
346 if (redis_serviceName == null) {
347 LOGGER.error("delete iui Service ByUrl is error:[url]" + url);
351 if (RouteUtil.ROUTEWAY_IP.equals(routeWay)) {
353 String[] publishPorts = StringUtils.split(publish_port, "|");
354 if (publishPorts.length == 2) {
355 IuiRouteServiceWrapper.getInstance().deleteIuiRoute(redis_serviceName, host, publishPorts[0],
357 IuiRouteServiceWrapper.getInstance().deleteIuiRoute(redis_serviceName, host, publishPorts[1],
363 IuiRouteServiceWrapper.getInstance().deleteIuiRoute(redis_serviceName, host, publish_port, routeWay);
368 redis_serviceName = url;
370 if (RouteUtil.ROUTEWAY_IP.equals(routeWay)) {
372 String[] publishPorts = StringUtils.split(publish_port, "|");
373 if (publishPorts.length == 2) {
374 CustomRouteServiceWrapper.getInstance().deleteCustomRoute(redis_serviceName, host, publishPorts[0],
376 CustomRouteServiceWrapper.getInstance().deleteCustomRoute(redis_serviceName, host, publishPorts[1],
382 CustomRouteServiceWrapper.getInstance().deleteCustomRoute(redis_serviceName, host, publish_port, routeWay);
390 * @Title getCustomName
391 * @Description TODO(获取HTTP服务路由名)
397 private String getHttpName(String routeName, String version) {
398 if (!routeName.startsWith("/")) {
399 routeName = "/" + routeName;
402 if (StringUtils.isNotBlank(version)) {
403 routeName += "/" + version;
409 private String getHost(MicroServiceFullInfo microServiceInfo) {
411 if (StringUtils.isNotBlank(microServiceInfo.getHost())) {
412 host = microServiceInfo.getHost().toLowerCase();
414 // host为空,取默认规则 服务名-ns
415 host = microServiceInfo.getServiceName().toLowerCase();
424 public void onChange(String serviceName, String version, MicroServiceFullInfo microServiceInfo) throws Exception {
425 // TODO Auto-generated method stub
427 if (RouteUtil.PROTOCOL_UI.equals(microServiceInfo.getProtocol())) {
428 IuiRouteInfo[] iuiRouteInfos = this.buildIuiRouteInfo(microServiceInfo, serviceName, RouteUtil.ROUTEWAY_IP);
429 for (int i = 0; i < iuiRouteInfos.length; i++) {
430 IuiRouteServiceWrapper.getInstance().saveIuiRouteInstance(iuiRouteInfos[i], RouteUtil.ROUTEWAY_IP);
432 } else if (RouteUtil.PROTOCOL_REST.equals(microServiceInfo.getProtocol())) {
433 ApiRouteInfo[] apiRouteInfos =
434 this.buildApiRouteInfo(microServiceInfo, serviceName, version, RouteUtil.ROUTEWAY_IP);
435 for (int i = 0; i < apiRouteInfos.length; i++) {
436 ApiRouteServiceWrapper.getInstance().saveApiRouteInstance(apiRouteInfos[i], RouteUtil.ROUTEWAY_IP);
438 } else if (RouteUtil.PROTOCOL_HTTP.equals(microServiceInfo.getProtocol())) {
439 if (!serviceName.startsWith("/")) {
440 serviceName = "/" + serviceName;
442 CustomRouteInfo[] customRouteInfos =
443 this.buildCustomRouteInfo(microServiceInfo, serviceName, RouteUtil.ROUTEWAY_IP);
444 for (int i = 0; i < customRouteInfos.length; i++) {
445 CustomRouteServiceWrapper.getInstance().saveCustomRouteInstance(customRouteInfos[i],
446 RouteUtil.ROUTEWAY_IP);
453 public void onStatusChange(String serviceName, String version, String host, String protocol, String publish_port,
458 if (StringUtils.isBlank(host)) {
459 host = serviceName.toLowerCase();
462 if (RouteUtil.PROTOCOL_UI.equals(protocol)) {
464 IuiRouteServiceWrapper.getInstance().updateIuiRouteStatus(serviceName, host, publish_port, status,
465 RouteUtil.ROUTEWAY_IP);
467 } else if (RouteUtil.PROTOCOL_REST.equals(protocol)) {
468 ApiRouteServiceWrapper.getInstance().updateApiRouteStatus(serviceName, version, host, publish_port, status,
469 RouteUtil.ROUTEWAY_IP);
471 } else if (RouteUtil.PROTOCOL_HTTP.equals(protocol)) {
472 if (!serviceName.startsWith("/")) {
473 serviceName = "/" + serviceName;
475 CustomRouteServiceWrapper.getInstance().updateCustomRouteStatus(serviceName, host, publish_port, status,
476 RouteUtil.ROUTEWAY_IP);
482 private boolean buildRouteHttpProtocol(MicroServiceFullInfo microServiceInfo, String routeWay) {
485 if (RouteUtil.CUSTOM_PORTAL.equals(microServiceInfo.getCustom())) {
486 if (RouteUtil.ROUTEWAY_DOMAIN.equals(routeWay)) {
494 return microServiceInfo.isEnable_ssl();
498 private RouteServer[] buildRouteNodes(MicroServiceFullInfo microServiceInfo, String routeWay) {
500 // 针对custom=portal场景的域名路由使用apigateway发布地址作为node
501 if (RouteUtil.CUSTOM_PORTAL.equals(microServiceInfo.getCustom())) {
502 if (RouteUtil.ROUTEWAY_DOMAIN.equals(routeWay)) {
504 String discoverServiceName = RouteUtil.getRouteNameByns(microServiceInfo.getServiceName(),
505 microServiceInfo.getNamespace());
506 List<Node> publishNodes = getPublishNodes(discoverServiceName, microServiceInfo.getVersion(),
507 microServiceInfo.getNamespace());
508 if (publishNodes != null && publishNodes.size() > 0) {
509 RouteServer[] routeServers = new RouteServer[publishNodes.size()];
511 for (Node node : publishNodes) {
512 RouteServer routeServer = new RouteServer(node.getIp(), node.getPort());
513 routeServers[i] = routeServer;
522 Set<Node> nodes = microServiceInfo.getNodes();
523 RouteServer[] routeServers = new RouteServer[nodes.size()];
525 for (Node node : nodes) {
526 RouteServer routeServer = new RouteServer(node.getIp(), node.getPort());
527 routeServers[n] = routeServer;
536 * From MicroServiceInfo to ApiRouteInfo
538 * @param microServiceInfo
541 private ApiRouteInfo[] buildApiRouteInfo(MicroServiceFullInfo microServiceInfo, String redis_serviceName,
542 String redis_version, String routeWay) {
544 ApiRouteInfo apiRouteInfo = new ApiRouteInfo();
545 apiRouteInfo.setUrl(microServiceInfo.getUrl());
547 apiRouteInfo.setServers(buildRouteNodes(microServiceInfo, routeWay));
549 apiRouteInfo.setVisualRange(RouteUtil.getVisualRangeByRouter(microServiceInfo.getVisualRange()));
552 if ("ip_hash".equals(microServiceInfo.getLb_policy())) {
553 apiRouteInfo.setUseOwnUpstream("1");
556 apiRouteInfo.setConsulServiceName(microServiceInfo.getServiceName());
557 apiRouteInfo.setServiceName(redis_serviceName);
558 apiRouteInfo.setVersion(redis_version);
559 apiRouteInfo.setApiJson(microServiceInfo.getUrl() + "/swagger.json");
560 apiRouteInfo.setMetricsUrl("/admin/metrics");
561 apiRouteInfo.setEnable_ssl(buildRouteHttpProtocol(microServiceInfo, routeWay));
562 // 默认 HttpProtocol和PublishProtocol=http
563 if (apiRouteInfo.isEnable_ssl()) {
564 apiRouteInfo.setPublishProtocol("https");
568 String host = getHost(microServiceInfo);
570 apiRouteInfo.setHost(host.toLowerCase());
571 apiRouteInfo.setNamespace(microServiceInfo.getNamespace());
573 if (RouteUtil.ROUTEWAY_IP.equals(routeWay)) {
575 if (StringUtils.isNotBlank(microServiceInfo.getPublish_port())) {
576 apiRouteInfo.setPublishProtocol("https");
579 // 获取服务的发布端口(支持多端口格式:https|http)
580 String[] publishPorts = StringUtils.split(microServiceInfo.getPublish_port(), "|");
581 if (publishPorts.length == 2) {
582 apiRouteInfo.setPublishProtocol("https");
583 apiRouteInfo.setPublish_port(publishPorts[0]);
586 ApiRouteInfo apiRouteInfo_http = (ApiRouteInfo) apiRouteInfo.clone();
587 apiRouteInfo.setPublishProtocol("http");
588 apiRouteInfo.setPublish_port(publishPorts[1]);
589 return new ApiRouteInfo[] {apiRouteInfo, apiRouteInfo_http};
590 } catch (CloneNotSupportedException e) {
591 LOGGER.error("CLONE is wrong:" + apiRouteInfo);
592 return new ApiRouteInfo[] {apiRouteInfo};
600 apiRouteInfo.setPublish_port(microServiceInfo.getPublish_port());
601 return new ApiRouteInfo[] {apiRouteInfo};
608 * From MicroServiceInfo to CustomRouteInfo
610 * @param microServiceInfo
613 private CustomRouteInfo[] buildCustomRouteInfo(MicroServiceFullInfo microServiceInfo, String redis_serviceName,
616 CustomRouteInfo customRouteInfo = new CustomRouteInfo();
617 customRouteInfo.setUrl(microServiceInfo.getUrl());
620 customRouteInfo.setServers(buildRouteNodes(microServiceInfo, routeWay));
622 customRouteInfo.setVisualRange(RouteUtil.getVisualRangeByRouter(microServiceInfo.getVisualRange()));
624 if ("ip_hash".equals(microServiceInfo.getLb_policy())) {
625 customRouteInfo.setUseOwnUpstream("1");
628 customRouteInfo.setConsulServiceName(microServiceInfo.getServiceName());
629 customRouteInfo.setServiceName(redis_serviceName);
632 String host = getHost(microServiceInfo);
634 customRouteInfo.setHost(host.toLowerCase());
635 customRouteInfo.setNamespace(microServiceInfo.getNamespace());
636 customRouteInfo.setEnable_ssl(buildRouteHttpProtocol(microServiceInfo, routeWay));
638 if (customRouteInfo.isEnable_ssl()) {
639 customRouteInfo.setPublishProtocol("https");
643 if (RouteUtil.ROUTEWAY_IP.equals(routeWay)) {
644 if (StringUtils.isNotBlank(microServiceInfo.getPublish_port())) {
645 customRouteInfo.setPublishProtocol("https");
648 String[] publishPorts = StringUtils.split(microServiceInfo.getPublish_port(), "|");
649 if (publishPorts.length == 2) {
650 // 获取服务的发布端口(支持多端口格式:https|http)
651 customRouteInfo.setPublishProtocol("https");
652 customRouteInfo.setPublish_port(publishPorts[0]);
655 CustomRouteInfo customRouteInfo_http = (CustomRouteInfo) customRouteInfo.clone();
656 customRouteInfo.setPublishProtocol("http");
657 customRouteInfo.setPublish_port(publishPorts[1]);
658 return new CustomRouteInfo[] {customRouteInfo, customRouteInfo_http};
659 } catch (CloneNotSupportedException e) {
660 LOGGER.error("CLONE is wrong:" + customRouteInfo);
661 return new CustomRouteInfo[] {customRouteInfo};
668 customRouteInfo.setPublish_port(microServiceInfo.getPublish_port());
669 return new CustomRouteInfo[] {customRouteInfo};
674 * From MicroServiceInfo to IuiRouteInfo
676 * @param microServiceInfo
679 private IuiRouteInfo[] buildIuiRouteInfo(MicroServiceFullInfo microServiceInfo, String redis_serviceName,
682 IuiRouteInfo iuiRouteInfo = new IuiRouteInfo();
683 iuiRouteInfo.setUrl(microServiceInfo.getUrl());
685 iuiRouteInfo.setServers(buildRouteNodes(microServiceInfo, routeWay));
687 iuiRouteInfo.setVisualRange(RouteUtil.getVisualRangeByRouter(microServiceInfo.getVisualRange()));
689 if ("ip_hash".equals(microServiceInfo.getLb_policy())) {
690 iuiRouteInfo.setUseOwnUpstream("1");
694 iuiRouteInfo.setConsulServiceName(microServiceInfo.getServiceName());
695 iuiRouteInfo.setServiceName(redis_serviceName);
698 String host = getHost(microServiceInfo);
700 iuiRouteInfo.setHost(host.toLowerCase());
701 iuiRouteInfo.setNamespace(microServiceInfo.getNamespace());
702 iuiRouteInfo.setEnable_ssl(buildRouteHttpProtocol(microServiceInfo, routeWay));
703 if (iuiRouteInfo.isEnable_ssl()) {
704 iuiRouteInfo.setPublishProtocol("https");
707 if (RouteUtil.ROUTEWAY_IP.equals(routeWay)) {
709 if (StringUtils.isNotBlank(microServiceInfo.getPublish_port())) {
710 iuiRouteInfo.setPublishProtocol("https");
713 String[] publishPorts = StringUtils.split(microServiceInfo.getPublish_port(), "|");
714 if (publishPorts.length == 2) {
715 // 获取服务的发布端口(支持多端口格式:https|http)
716 iuiRouteInfo.setPublishProtocol("https");
717 iuiRouteInfo.setPublish_port(publishPorts[0]);
720 IuiRouteInfo iuiRouteInfo_http = (IuiRouteInfo) iuiRouteInfo.clone();
721 iuiRouteInfo.setPublishProtocol("http");
722 iuiRouteInfo.setPublish_port(publishPorts[1]);
723 return new IuiRouteInfo[] {iuiRouteInfo, iuiRouteInfo_http};
724 } catch (CloneNotSupportedException e) {
725 LOGGER.error("CLONE is wrong:" + iuiRouteInfo);
726 return new IuiRouteInfo[] {iuiRouteInfo};
731 iuiRouteInfo.setPublish_port(microServiceInfo.getPublish_port());
732 return new IuiRouteInfo[] {iuiRouteInfo};
737 private List<Node> getPublishNodes(String discoverServiceName, String version, String namespace) {
738 List<Node> nodes = new ArrayList<Node>();
740 if (StringUtils.isBlank(version)) {
744 DiscoverInfo discoverInfo = ConfigUtil.getInstance().getDiscoverInfo();
746 String allpublishaddressUrl = (new StringBuilder().append("http://").append(discoverInfo.toString())
747 .append(RouteUtil.MSB_ROUTE_URL).append("/").append(discoverServiceName).append("/version/")
748 .append(version).append("/allpublishaddress?namespace=").append(namespace)
749 .append("&visualRange=0")).toString();
751 String resultJson = HttpClientUtil.httpGet(allpublishaddressUrl);
752 List<PublishFullAddress> publishFullAddressList =
753 JacksonJsonUtil.jsonToListBean(resultJson, new TypeReference<List<PublishFullAddress>>() {});
754 if (publishFullAddressList != null && publishFullAddressList.size() > 0) {
755 for (PublishFullAddress publishFullAddress : publishFullAddressList) {
756 if (StringUtils.isNotBlank(publishFullAddress.getIp())
757 && "https".equals(publishFullAddress.getPublish_protocol())) {
758 nodes.add(new Node(publishFullAddress.getIp(), publishFullAddress.getPort()));