1 /*******************************************************************************
2 * Copyright 2016-2017 ZTE, Inc. and others.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 ******************************************************************************/
16 package org.onap.msb.apiroute.wrapper.serviceListener;
18 import java.util.ArrayList;
19 import java.util.List;
22 import org.apache.commons.lang3.StringUtils;
23 import org.onap.msb.apiroute.api.ApiRouteInfo;
24 import org.onap.msb.apiroute.api.CustomRouteInfo;
25 import org.onap.msb.apiroute.api.DiscoverInfo;
26 import org.onap.msb.apiroute.api.IuiRouteInfo;
27 import org.onap.msb.apiroute.api.MicroServiceFullInfo;
28 import org.onap.msb.apiroute.api.Node;
29 import org.onap.msb.apiroute.api.PublishFullAddress;
30 import org.onap.msb.apiroute.api.RouteServer;
31 import org.onap.msb.apiroute.wrapper.ApiRouteServiceWrapper;
32 import org.onap.msb.apiroute.wrapper.CustomRouteServiceWrapper;
33 import org.onap.msb.apiroute.wrapper.IuiRouteServiceWrapper;
34 import org.onap.msb.apiroute.wrapper.util.CommonUtil;
35 import org.onap.msb.apiroute.wrapper.util.ConfigUtil;
36 import org.onap.msb.apiroute.wrapper.util.HttpClientUtil;
37 import org.onap.msb.apiroute.wrapper.util.JacksonJsonUtil;
38 import org.onap.msb.apiroute.wrapper.util.RegExpTestUtil;
39 import org.onap.msb.apiroute.wrapper.util.RouteUtil;
40 import org.slf4j.Logger;
41 import org.slf4j.LoggerFactory;
43 import com.fasterxml.jackson.core.type.TypeReference;
45 public class MicroServiceChangeListener implements IMicroServiceChangeListener {
47 private static final Logger LOGGER = LoggerFactory.getLogger(MicroServiceChangeListener.class);
50 public void onDelete(MicroServiceFullInfo microServiceInfo) throws Exception {
52 String path = microServiceInfo.getPath();
54 String[] routeWay = ConfigUtil.getInstance().getRouteWay();
56 for (int i = 0; i < routeWay.length; i++) {
58 if (StringUtils.isNotBlank(path) && !"/".equals(path)) {
60 String host = getHost(microServiceInfo);
61 deleteServiceByUrl(path, host, microServiceInfo.getPublish_port(), routeWay[i]);
64 if (RouteUtil.ROUTEWAY_DOMAIN.equals(routeWay[i]) && ifRootByDomain(microServiceInfo)) {
65 deleteServiceByDomain4Root(microServiceInfo);
68 deleteServiceByProtocol(microServiceInfo, routeWay[i]);
80 public void onSave(MicroServiceFullInfo microServiceInfo) throws Exception {
82 String path = microServiceInfo.getPath();
83 String[] routeWay = ConfigUtil.getInstance().getRouteWay();
85 for (int i = 0; i < routeWay.length; i++) {
87 if (StringUtils.isNotBlank(path) && !"/".equals(path)) {
88 saveServiceByPath(microServiceInfo, routeWay[i]);
91 if (RouteUtil.ROUTEWAY_DOMAIN.equals(routeWay[i]) && ifRootByDomain(microServiceInfo)) {
92 saveServiceByDomain4Root(microServiceInfo);
95 saveServiceByProtocol(microServiceInfo, routeWay[i]);
103 //判断按协议发布地址是否和注册的URL一致,如果一致发布地址保存为/,否则保存为协议类型的发布地址
104 private boolean ifRootByDomain(MicroServiceFullInfo microServiceInfo){
107 if("/".equals(microServiceInfo.getUrl())) return true;
109 String protocol = microServiceInfo.getProtocol();
111 RouteUtil.getRouteNameByns(microServiceInfo.getServiceName(),
112 microServiceInfo.getNamespace());
113 String publishUrl="";
115 if (StringUtils.isNotBlank(microServiceInfo.getVersion())) {
116 version = "/" + microServiceInfo.getVersion();
120 case RouteUtil.PROTOCOL_UI:
121 publishUrl = "/iui/" + routeName;
123 case RouteUtil.PROTOCOL_REST:
124 publishUrl = "/api/" + routeName + version;
126 case RouteUtil.PROTOCOL_HTTP:
127 publishUrl = "/" + routeName + version;
130 return publishUrl.equals(microServiceInfo.getUrl());
135 private void saveServiceByDomain4Root(MicroServiceFullInfo microServiceInfo) throws Exception {
137 CustomRouteInfo[] customRouteInfos =
138 this.buildCustomRouteInfo(microServiceInfo, "/", RouteUtil.ROUTEWAY_DOMAIN);
139 for (int i = 0; i < customRouteInfos.length; i++) {
140 customRouteInfos[i].setUrl("/");
141 CustomRouteServiceWrapper.getInstance().saveCustomRouteInstance(customRouteInfos[i],
142 RouteUtil.ROUTEWAY_DOMAIN);
146 private void deleteServiceByDomain4Root(MicroServiceFullInfo microServiceInfo) throws Exception {
148 CustomRouteServiceWrapper.getInstance().deleteCustomRoute("/", getHost(microServiceInfo),
149 microServiceInfo.getPublish_port(), RouteUtil.ROUTEWAY_DOMAIN);
153 * @Title saveServiceByProtocol
154 * @Description TODO(按用户注册协议保存服务)
155 * @param microServiceInfo
160 private void saveServiceByProtocol(MicroServiceFullInfo microServiceInfo, String routeWay)
162 String protocol = microServiceInfo.getProtocol();
164 RouteUtil.getRouteNameByns(microServiceInfo.getServiceName(),
165 microServiceInfo.getNamespace());
168 case RouteUtil.PROTOCOL_UI:
169 IuiRouteInfo[] iuiRouteInfos =
170 this.buildIuiRouteInfo(microServiceInfo, routeName, routeWay);
171 for (int i = 0; i < iuiRouteInfos.length; i++) {
172 IuiRouteServiceWrapper.getInstance().saveIuiRouteInstance(iuiRouteInfos[i], routeWay);
176 case RouteUtil.PROTOCOL_REST:
178 ApiRouteInfo[] apiRouteInfos =
179 this.buildApiRouteInfo(microServiceInfo, routeName, microServiceInfo.getVersion(),
181 for (int i = 0; i < apiRouteInfos.length; i++) {
182 ApiRouteServiceWrapper.getInstance().saveApiRouteInstance(apiRouteInfos[i], routeWay);
185 case RouteUtil.PROTOCOL_HTTP:
186 CustomRouteInfo[] customRouteInfos =
187 this.buildCustomRouteInfo(microServiceInfo,
188 getHttpName(routeName, microServiceInfo.getVersion()), routeWay);
189 for (int i = 0; i < customRouteInfos.length; i++) {
190 CustomRouteServiceWrapper.getInstance().saveCustomRouteInstance(customRouteInfos[i],
198 * @Title deleteServiceByProtocol
199 * @Description TODO(按用户注册协议删除服务)
200 * @param microServiceInfo
204 private void deleteServiceByProtocol(MicroServiceFullInfo microServiceInfo, String routeWay) {
205 String protocol = microServiceInfo.getProtocol();
206 String host = getHost(microServiceInfo);
208 RouteUtil.getRouteNameByns(microServiceInfo.getServiceName(),
209 microServiceInfo.getNamespace());
211 if (RouteUtil.PROTOCOL_UI.equals(protocol)) {
213 if (RouteUtil.ROUTEWAY_IP.equals(routeWay)) {
215 String[] publishPorts = StringUtils.split(microServiceInfo.getPublish_port(), "|");
216 if (publishPorts.length == 2) {
217 IuiRouteServiceWrapper.getInstance().deleteIuiRoute(routeName, host, publishPorts[0],
219 IuiRouteServiceWrapper.getInstance().deleteIuiRoute(routeName, host, publishPorts[1],
225 IuiRouteServiceWrapper.getInstance().deleteIuiRoute(routeName, host,
226 microServiceInfo.getPublish_port(), routeWay);
227 } else if (RouteUtil.PROTOCOL_REST.equals(protocol)) {
229 if (RouteUtil.ROUTEWAY_IP.equals(routeWay)) {
231 String[] publishPorts = StringUtils.split(microServiceInfo.getPublish_port(), "|");
232 if (publishPorts.length == 2) {
233 ApiRouteServiceWrapper.getInstance().deleteApiRoute(routeName,
234 microServiceInfo.getVersion(), host, publishPorts[0], routeWay);
235 ApiRouteServiceWrapper.getInstance().deleteApiRoute(routeName,
236 microServiceInfo.getVersion(), host, publishPorts[1], routeWay);
240 ApiRouteServiceWrapper.getInstance().deleteApiRoute(routeName, microServiceInfo.getVersion(),
241 host, microServiceInfo.getPublish_port(), routeWay);
242 } else if (RouteUtil.PROTOCOL_HTTP.equals(protocol)) {
244 if (RouteUtil.ROUTEWAY_IP.equals(routeWay)) {
246 String[] publishPorts = StringUtils.split(microServiceInfo.getPublish_port(), "|");
247 if (publishPorts.length == 2) {
248 CustomRouteServiceWrapper.getInstance().deleteCustomRoute(
249 getHttpName(routeName, microServiceInfo.getVersion()), host, publishPorts[0],
251 CustomRouteServiceWrapper.getInstance().deleteCustomRoute(
252 getHttpName(routeName, microServiceInfo.getVersion()), host, publishPorts[1],
257 CustomRouteServiceWrapper.getInstance().deleteCustomRoute(
258 getHttpName(routeName, microServiceInfo.getVersion()), host,
259 microServiceInfo.getPublish_port(), routeWay);
264 * @Title saveServiceByUrl
265 * @Description TODO(按URL地址判断服务协议并保存到路由表)
267 * @param microServiceInfo
272 private void saveServiceByPath(MicroServiceFullInfo microServiceInfo, String routeWay)
274 String redis_serviceName;
275 String path=microServiceInfo.getPath();
276 if (RegExpTestUtil.apiRouteUrlRegExpTest(path)) {
278 String[] serviceKey = RegExpTestUtil.apiServiceNameMatch4URL(path);
279 if (serviceKey == null) {
280 LOGGER.error("save api Service ByUrl is error:[url]" + path);
283 redis_serviceName = serviceKey[0];
284 String redis_serviceVersion = serviceKey[1];
286 ApiRouteInfo[] apiRouteInfos =
287 this.buildApiRouteInfo(microServiceInfo, redis_serviceName, redis_serviceVersion,
289 for (int i = 0; i < apiRouteInfos.length; i++) {
290 ApiRouteServiceWrapper.getInstance().saveApiRouteInstance(apiRouteInfos[i], routeWay);
292 } else if (RegExpTestUtil.iuiRouteUrlRegExpTest(path)) {
295 redis_serviceName = RegExpTestUtil.iuiServiceNameMatch4URL(path);
296 if (redis_serviceName == null) {
297 LOGGER.error("save iui Service ByUrl is error:[url]" + path);
300 IuiRouteInfo[] iuiRouteInfos =
301 this.buildIuiRouteInfo(microServiceInfo, redis_serviceName, routeWay);
302 for (int i = 0; i < iuiRouteInfos.length; i++) {
303 IuiRouteServiceWrapper.getInstance().saveIuiRouteInstance(iuiRouteInfos[i], routeWay);
307 redis_serviceName = path;
308 CustomRouteInfo[] customRouteInfos =
309 this.buildCustomRouteInfo(microServiceInfo, redis_serviceName, routeWay);
310 for (int i = 0; i < customRouteInfos.length; i++) {
311 CustomRouteServiceWrapper.getInstance().saveCustomRouteInstance(customRouteInfos[i],
318 * @Title deleteServiceByUrl
319 * @Description TODO(按URL地址判断服务协议并从路由表删除)
322 * @param publish_port
326 private void deleteServiceByUrl(String url, String host, String publish_port, String routeWay) {
328 String redis_serviceName;
330 if (RegExpTestUtil.apiRouteUrlRegExpTest(url)) {
332 String[] serviceKey = RegExpTestUtil.apiServiceNameMatch4URL(url);
333 if (serviceKey == null) {
334 LOGGER.error("delete api Service ByUrl is error:[url]" + url);
338 redis_serviceName = serviceKey[0];
339 String redis_serviceVersion = serviceKey[1];
341 if (RouteUtil.ROUTEWAY_IP.equals(routeWay)) {
343 String[] publishPorts = StringUtils.split(publish_port, "|");
344 if (publishPorts.length == 2) {
345 ApiRouteServiceWrapper.getInstance().deleteApiRoute(redis_serviceName,
346 redis_serviceVersion, host, publishPorts[0], routeWay);
347 ApiRouteServiceWrapper.getInstance().deleteApiRoute(redis_serviceName,
348 redis_serviceVersion, host, publishPorts[1], routeWay);
353 ApiRouteServiceWrapper.getInstance().deleteApiRoute(redis_serviceName, redis_serviceVersion,
354 host, publish_port, routeWay);
358 } else if (RegExpTestUtil.iuiRouteUrlRegExpTest(url)) {
361 redis_serviceName = RegExpTestUtil.iuiServiceNameMatch4URL(url);
362 if (redis_serviceName == null) {
363 LOGGER.error("delete iui Service ByUrl is error:[url]" + url);
367 if (RouteUtil.ROUTEWAY_IP.equals(routeWay)) {
369 String[] publishPorts = StringUtils.split(publish_port, "|");
370 if (publishPorts.length == 2) {
371 IuiRouteServiceWrapper.getInstance().deleteIuiRoute(redis_serviceName, host,
372 publishPorts[0], routeWay);
373 IuiRouteServiceWrapper.getInstance().deleteIuiRoute(redis_serviceName, host,
374 publishPorts[1], routeWay);
379 IuiRouteServiceWrapper.getInstance().deleteIuiRoute(redis_serviceName, host, publish_port,
385 redis_serviceName = url;
387 if (RouteUtil.ROUTEWAY_IP.equals(routeWay)) {
389 String[] publishPorts = StringUtils.split(publish_port, "|");
390 if (publishPorts.length == 2) {
391 CustomRouteServiceWrapper.getInstance().deleteCustomRoute(redis_serviceName, host,
392 publishPorts[0], routeWay);
393 CustomRouteServiceWrapper.getInstance().deleteCustomRoute(redis_serviceName, host,
394 publishPorts[1], routeWay);
399 CustomRouteServiceWrapper.getInstance().deleteCustomRoute(redis_serviceName, host,
400 publish_port, routeWay);
408 * @Title getCustomName
409 * @Description TODO(获取HTTP服务路由名)
415 private String getHttpName(String routeName, String version) {
416 if (!routeName.startsWith("/")) {
417 routeName = "/" + routeName;
420 if (StringUtils.isNotBlank(version)) {
421 routeName += "/" + version;
427 private String getHost(MicroServiceFullInfo microServiceInfo) {
429 if (StringUtils.isNotBlank(microServiceInfo.getHost())) {
430 host = microServiceInfo.getHost().toLowerCase();
432 // host为空,取默认规则 服务名-ns
433 host = microServiceInfo.getServiceName().toLowerCase();
442 public void onChange(String serviceName, String version, MicroServiceFullInfo microServiceInfo)
444 // TODO Auto-generated method stub
446 if (RouteUtil.PROTOCOL_UI.equals(microServiceInfo.getProtocol())) {
447 IuiRouteInfo[] iuiRouteInfos =
448 this.buildIuiRouteInfo(microServiceInfo, serviceName, RouteUtil.ROUTEWAY_IP);
449 for (int i = 0; i < iuiRouteInfos.length; i++) {
450 IuiRouteServiceWrapper.getInstance().saveIuiRouteInstance(iuiRouteInfos[i],
451 RouteUtil.ROUTEWAY_IP);
453 } else if (RouteUtil.PROTOCOL_REST.equals(microServiceInfo.getProtocol())) {
454 ApiRouteInfo[] apiRouteInfos =
455 this.buildApiRouteInfo(microServiceInfo, serviceName, version, RouteUtil.ROUTEWAY_IP);
456 for (int i = 0; i < apiRouteInfos.length; i++) {
457 ApiRouteServiceWrapper.getInstance().saveApiRouteInstance(apiRouteInfos[i],
458 RouteUtil.ROUTEWAY_IP);
460 } else if (RouteUtil.PROTOCOL_HTTP.equals(microServiceInfo.getProtocol())) {
461 if (!serviceName.startsWith("/")) {
462 serviceName = "/" + serviceName;
464 CustomRouteInfo[] customRouteInfos =
465 this.buildCustomRouteInfo(microServiceInfo, serviceName, RouteUtil.ROUTEWAY_IP);
466 for (int i = 0; i < customRouteInfos.length; i++) {
467 CustomRouteServiceWrapper.getInstance().saveCustomRouteInstance(customRouteInfos[i],
468 RouteUtil.ROUTEWAY_IP);
475 public void onStatusChange(String serviceName, String version, String host, String protocol,
476 String publish_port, String status) {
480 if (StringUtils.isBlank(host)) {
481 host = serviceName.toLowerCase();
484 if (RouteUtil.PROTOCOL_UI.equals(protocol)) {
486 IuiRouteServiceWrapper.getInstance().updateIuiRouteStatus(serviceName, host, publish_port,
487 status, RouteUtil.ROUTEWAY_IP);
489 } else if (RouteUtil.PROTOCOL_REST.equals(protocol)) {
490 ApiRouteServiceWrapper.getInstance().updateApiRouteStatus(serviceName, version, host,
491 publish_port, status, RouteUtil.ROUTEWAY_IP);
493 } else if (RouteUtil.PROTOCOL_HTTP.equals(protocol)) {
494 if (!serviceName.startsWith("/")) {
495 serviceName = "/" + serviceName;
497 CustomRouteServiceWrapper.getInstance().updateCustomRouteStatus(serviceName, host,
498 publish_port, status, RouteUtil.ROUTEWAY_IP);
504 private boolean buildRouteHttpProtocol(MicroServiceFullInfo microServiceInfo, String routeWay) {
507 if (RouteUtil.CUSTOM_PORTAL.equals(microServiceInfo.getCustom())) {
508 if (RouteUtil.ROUTEWAY_DOMAIN.equals(routeWay)) {
516 return microServiceInfo.isEnable_ssl();
520 private RouteServer[] buildRouteNodes(MicroServiceFullInfo microServiceInfo, String routeWay) {
522 // 针对custom=portal场景的域名路由使用apigateway发布地址作为node
523 if (RouteUtil.CUSTOM_PORTAL.equals(microServiceInfo.getCustom())) {
524 if (RouteUtil.ROUTEWAY_DOMAIN.equals(routeWay)) {
526 String discoverServiceName =
527 RouteUtil.getRouteNameByns(microServiceInfo.getServiceName(),
528 microServiceInfo.getNamespace());
529 List<Node> publishNodes =
530 getPublishNodes(discoverServiceName, microServiceInfo.getVersion(),
531 microServiceInfo.getNamespace());
532 if (publishNodes != null && publishNodes.size() > 0) {
533 RouteServer[] routeServers = new RouteServer[publishNodes.size()];
535 for (Node node : publishNodes) {
536 RouteServer routeServer = new RouteServer(node.getIp(), node.getPort());
537 routeServers[i] = routeServer;
546 Set<Node> nodes = microServiceInfo.getNodes();
547 RouteServer[] routeServers = new RouteServer[nodes.size()];
549 for (Node node : nodes) {
550 RouteServer routeServer = new RouteServer(node.getIp(), node.getPort());
551 routeServers[n] = routeServer;
560 * From MicroServiceInfo to ApiRouteInfo
562 * @param microServiceInfo
565 private ApiRouteInfo[] buildApiRouteInfo(MicroServiceFullInfo microServiceInfo,
566 String redis_serviceName, String redis_version, String routeWay) {
568 ApiRouteInfo apiRouteInfo = new ApiRouteInfo();
569 apiRouteInfo.setUrl(microServiceInfo.getUrl());
571 apiRouteInfo.setServers(buildRouteNodes(microServiceInfo, routeWay));
573 apiRouteInfo.setVisualRange(RouteUtil.getVisualRangeByRouter(microServiceInfo.getVisualRange()));
576 if ("ip_hash".equals(microServiceInfo.getLb_policy())) {
577 apiRouteInfo.setUseOwnUpstream("1");
580 apiRouteInfo.setConsulServiceName(microServiceInfo.getServiceName());
581 apiRouteInfo.setServiceName(redis_serviceName);
582 apiRouteInfo.setVersion(redis_version);
583 apiRouteInfo.setApiJson(microServiceInfo.getUrl() + "/swagger.json");
584 apiRouteInfo.setMetricsUrl("/admin/metrics");
585 apiRouteInfo.setEnable_ssl(buildRouteHttpProtocol(microServiceInfo, routeWay));
586 // 默认 HttpProtocol和PublishProtocol=http
587 if (apiRouteInfo.isEnable_ssl()) {
588 apiRouteInfo.setPublishProtocol("https");
592 String host = getHost(microServiceInfo);
594 apiRouteInfo.setHost(host.toLowerCase());
595 apiRouteInfo.setNamespace(microServiceInfo.getNamespace());
597 if (RouteUtil.ROUTEWAY_IP.equals(routeWay)) {
599 if (StringUtils.isNotBlank(microServiceInfo.getPublish_port())) {
600 apiRouteInfo.setPublishProtocol("https");
603 // 获取服务的发布端口(支持多端口格式:https|http)
604 String[] publishPorts = StringUtils.split(microServiceInfo.getPublish_port(), "|");
605 if (publishPorts.length == 2) {
606 apiRouteInfo.setPublishProtocol("https");
607 apiRouteInfo.setPublish_port(publishPorts[0]);
610 ApiRouteInfo apiRouteInfo_http = (ApiRouteInfo) apiRouteInfo.clone();
611 apiRouteInfo.setPublishProtocol("http");
612 apiRouteInfo.setPublish_port(publishPorts[1]);
613 return new ApiRouteInfo[] {apiRouteInfo, apiRouteInfo_http};
614 } catch (CloneNotSupportedException e) {
615 LOGGER.error("CLONE is wrong:" + apiRouteInfo);
616 return new ApiRouteInfo[] {apiRouteInfo};
624 apiRouteInfo.setPublish_port(microServiceInfo.getPublish_port());
625 return new ApiRouteInfo[] {apiRouteInfo};
632 * From MicroServiceInfo to CustomRouteInfo
634 * @param microServiceInfo
637 private CustomRouteInfo[] buildCustomRouteInfo(MicroServiceFullInfo microServiceInfo,
638 String redis_serviceName, String routeWay) {
640 CustomRouteInfo customRouteInfo = new CustomRouteInfo();
641 customRouteInfo.setUrl(microServiceInfo.getUrl());
644 customRouteInfo.setServers(buildRouteNodes(microServiceInfo, routeWay));
646 customRouteInfo.setVisualRange(RouteUtil.getVisualRangeByRouter(microServiceInfo.getVisualRange()));
648 if ("ip_hash".equals(microServiceInfo.getLb_policy())) {
649 customRouteInfo.setUseOwnUpstream("1");
652 customRouteInfo.setConsulServiceName(microServiceInfo.getServiceName());
653 customRouteInfo.setServiceName(redis_serviceName);
656 String host = getHost(microServiceInfo);
658 customRouteInfo.setHost(host.toLowerCase());
659 customRouteInfo.setNamespace(microServiceInfo.getNamespace());
660 customRouteInfo.setEnable_ssl(buildRouteHttpProtocol(microServiceInfo, routeWay));
662 if (customRouteInfo.isEnable_ssl()) {
663 customRouteInfo.setPublishProtocol("https");
667 if (RouteUtil.ROUTEWAY_IP.equals(routeWay)) {
668 if (StringUtils.isNotBlank(microServiceInfo.getPublish_port())) {
669 customRouteInfo.setPublishProtocol("https");
672 String[] publishPorts = StringUtils.split(microServiceInfo.getPublish_port(), "|");
673 if (publishPorts.length == 2) {
674 // 获取服务的发布端口(支持多端口格式:https|http)
675 customRouteInfo.setPublishProtocol("https");
676 customRouteInfo.setPublish_port(publishPorts[0]);
679 CustomRouteInfo customRouteInfo_http = (CustomRouteInfo) customRouteInfo.clone();
680 customRouteInfo.setPublishProtocol("http");
681 customRouteInfo.setPublish_port(publishPorts[1]);
682 return new CustomRouteInfo[] {customRouteInfo, customRouteInfo_http};
683 } catch (CloneNotSupportedException e) {
684 LOGGER.error("CLONE is wrong:" + customRouteInfo);
685 return new CustomRouteInfo[] {customRouteInfo};
692 customRouteInfo.setPublish_port(microServiceInfo.getPublish_port());
693 return new CustomRouteInfo[] {customRouteInfo};
698 * From MicroServiceInfo to IuiRouteInfo
700 * @param microServiceInfo
703 private IuiRouteInfo[] buildIuiRouteInfo(MicroServiceFullInfo microServiceInfo,
704 String redis_serviceName, String routeWay) {
706 IuiRouteInfo iuiRouteInfo = new IuiRouteInfo();
707 iuiRouteInfo.setUrl(microServiceInfo.getUrl());
709 iuiRouteInfo.setServers(buildRouteNodes(microServiceInfo, routeWay));
711 iuiRouteInfo.setVisualRange(RouteUtil.getVisualRangeByRouter(microServiceInfo.getVisualRange()));
713 if ("ip_hash".equals(microServiceInfo.getLb_policy())) {
714 iuiRouteInfo.setUseOwnUpstream("1");
718 iuiRouteInfo.setConsulServiceName(microServiceInfo.getServiceName());
719 iuiRouteInfo.setServiceName(redis_serviceName);
722 String host = getHost(microServiceInfo);
724 iuiRouteInfo.setHost(host.toLowerCase());
725 iuiRouteInfo.setNamespace(microServiceInfo.getNamespace());
726 iuiRouteInfo.setEnable_ssl(buildRouteHttpProtocol(microServiceInfo, routeWay));
727 if (iuiRouteInfo.isEnable_ssl()) {
728 iuiRouteInfo.setPublishProtocol("https");
731 if (RouteUtil.ROUTEWAY_IP.equals(routeWay)) {
733 if (StringUtils.isNotBlank(microServiceInfo.getPublish_port())) {
734 iuiRouteInfo.setPublishProtocol("https");
737 String[] publishPorts = StringUtils.split(microServiceInfo.getPublish_port(), "|");
738 if (publishPorts.length == 2) {
739 // 获取服务的发布端口(支持多端口格式:https|http)
740 iuiRouteInfo.setPublishProtocol("https");
741 iuiRouteInfo.setPublish_port(publishPorts[0]);
744 IuiRouteInfo iuiRouteInfo_http = (IuiRouteInfo) iuiRouteInfo.clone();
745 iuiRouteInfo.setPublishProtocol("http");
746 iuiRouteInfo.setPublish_port(publishPorts[1]);
747 return new IuiRouteInfo[] {iuiRouteInfo, iuiRouteInfo_http};
748 } catch (CloneNotSupportedException e) {
749 LOGGER.error("CLONE is wrong:" + iuiRouteInfo);
750 return new IuiRouteInfo[] {iuiRouteInfo};
755 iuiRouteInfo.setPublish_port(microServiceInfo.getPublish_port());
756 return new IuiRouteInfo[] {iuiRouteInfo};
761 private List<Node> getPublishNodes(String discoverServiceName, String version, String namespace) {
762 List<Node> nodes = new ArrayList<Node>();
764 if (StringUtils.isBlank(version)) {
768 DiscoverInfo discoverInfo = ConfigUtil.getInstance().getDiscoverInfo();
770 String allpublishaddressUrl =
771 (new StringBuilder().append("http://").append(discoverInfo.toString())
772 .append(RouteUtil.MSB_ROUTE_URL).append("/").append(discoverServiceName)
773 .append("/version/").append(version).append("/allpublishaddress?namespace=")
774 .append(namespace).append("&visualRange=0")).toString();
776 String resultJson = HttpClientUtil.httpGet(allpublishaddressUrl);
777 List<PublishFullAddress> publishFullAddressList =
779 .jsonToListBean(resultJson, new TypeReference<List<PublishFullAddress>>() {});
780 if (publishFullAddressList != null && publishFullAddressList.size() > 0) {
781 for (PublishFullAddress publishFullAddress : publishFullAddressList) {
782 if (StringUtils.isNotBlank(publishFullAddress.getIp())
783 && "https".equals(publishFullAddress.getPublish_protocol())) {
784 nodes.add(new Node(publishFullAddress.getIp(), publishFullAddress.getPort()));