1 package org.onap.msb.apiroute.wrapper.serviceListener;
3 import java.util.ArrayList;
7 import org.apache.commons.lang3.StringUtils;
8 import org.onap.msb.apiroute.api.ApiRouteInfo;
9 import org.onap.msb.apiroute.api.CustomRouteInfo;
10 import org.onap.msb.apiroute.api.DiscoverInfo;
11 import org.onap.msb.apiroute.api.IuiRouteInfo;
12 import org.onap.msb.apiroute.api.MicroServiceFullInfo;
13 import org.onap.msb.apiroute.api.Node;
14 import org.onap.msb.apiroute.api.PublishFullAddress;
15 import org.onap.msb.apiroute.api.RouteServer;
16 import org.onap.msb.apiroute.wrapper.ApiRouteServiceWrapper;
17 import org.onap.msb.apiroute.wrapper.CustomRouteServiceWrapper;
18 import org.onap.msb.apiroute.wrapper.IuiRouteServiceWrapper;
19 import org.onap.msb.apiroute.wrapper.util.CommonUtil;
20 import org.onap.msb.apiroute.wrapper.util.ConfigUtil;
21 import org.onap.msb.apiroute.wrapper.util.HttpClientUtil;
22 import org.onap.msb.apiroute.wrapper.util.JacksonJsonUtil;
23 import org.onap.msb.apiroute.wrapper.util.RegExpTestUtil;
24 import org.onap.msb.apiroute.wrapper.util.RouteUtil;
25 import org.slf4j.Logger;
26 import org.slf4j.LoggerFactory;
28 import com.fasterxml.jackson.core.type.TypeReference;
30 public class MicroServiceChangeListener implements IMicroServiceChangeListener {
32 private static final Logger LOGGER = LoggerFactory.getLogger(MicroServiceChangeListener.class);
35 public void onDelete(MicroServiceFullInfo microServiceInfo) throws Exception {
37 String path = microServiceInfo.getPath();
39 String[] routeWay = ConfigUtil.getInstance().getRouteWay();
41 for (int i = 0; i < routeWay.length; i++) {
43 if (StringUtils.isNotBlank(path) && !"/".equals(path)) {
45 String host = getHost(microServiceInfo);
46 deleteServiceByUrl(path, host, microServiceInfo.getPublish_port(), routeWay[i]);
49 if (RouteUtil.ROUTEWAY_DOMAIN.equals(routeWay[i]) && ifRootByDomain(microServiceInfo)) {
50 deleteServiceByDomain4Root(microServiceInfo);
53 deleteServiceByProtocol(microServiceInfo, routeWay[i]);
65 public void onSave(MicroServiceFullInfo microServiceInfo) throws Exception {
67 String path = microServiceInfo.getPath();
68 String[] routeWay = ConfigUtil.getInstance().getRouteWay();
70 for (int i = 0; i < routeWay.length; i++) {
72 if (StringUtils.isNotBlank(path) && !"/".equals(path)) {
73 saveServiceByPath(microServiceInfo, routeWay[i]);
76 if (RouteUtil.ROUTEWAY_DOMAIN.equals(routeWay[i]) && ifRootByDomain(microServiceInfo)) {
77 saveServiceByDomain4Root(microServiceInfo);
80 saveServiceByProtocol(microServiceInfo, routeWay[i]);
88 //判断按协议发布地址是否和注册的URL一致,如果一致发布地址保存为/,否则保存为协议类型的发布地址
89 private boolean ifRootByDomain(MicroServiceFullInfo microServiceInfo){
92 if("/".equals(microServiceInfo.getUrl())) return true;
94 String protocol = microServiceInfo.getProtocol();
96 RouteUtil.getRouteNameByns(microServiceInfo.getServiceName(),
97 microServiceInfo.getNamespace());
100 if (StringUtils.isNotBlank(microServiceInfo.getVersion())) {
101 version = "/" + microServiceInfo.getVersion();
105 case RouteUtil.PROTOCOL_UI:
106 publishUrl = "/iui/" + routeName;
108 case RouteUtil.PROTOCOL_REST:
109 publishUrl = "/api/" + routeName + version;
111 case RouteUtil.PROTOCOL_HTTP:
112 publishUrl = "/" + routeName + version;
115 return publishUrl.equals(microServiceInfo.getUrl());
120 private void saveServiceByDomain4Root(MicroServiceFullInfo microServiceInfo) throws Exception {
122 CustomRouteInfo[] customRouteInfos =
123 this.buildCustomRouteInfo(microServiceInfo, "/", RouteUtil.ROUTEWAY_DOMAIN);
124 for (int i = 0; i < customRouteInfos.length; i++) {
125 customRouteInfos[i].setUrl("/");
126 CustomRouteServiceWrapper.getInstance().saveCustomRouteInstance(customRouteInfos[i],
127 RouteUtil.ROUTEWAY_DOMAIN);
131 private void deleteServiceByDomain4Root(MicroServiceFullInfo microServiceInfo) throws Exception {
133 CustomRouteServiceWrapper.getInstance().deleteCustomRoute("/", getHost(microServiceInfo),
134 microServiceInfo.getPublish_port(), RouteUtil.ROUTEWAY_DOMAIN);
138 * @Title saveServiceByProtocol
139 * @Description TODO(按用户注册协议保存服务)
140 * @param microServiceInfo
145 private void saveServiceByProtocol(MicroServiceFullInfo microServiceInfo, String routeWay)
147 String protocol = microServiceInfo.getProtocol();
149 RouteUtil.getRouteNameByns(microServiceInfo.getServiceName(),
150 microServiceInfo.getNamespace());
153 case RouteUtil.PROTOCOL_UI:
154 IuiRouteInfo[] iuiRouteInfos =
155 this.buildIuiRouteInfo(microServiceInfo, routeName, routeWay);
156 for (int i = 0; i < iuiRouteInfos.length; i++) {
157 IuiRouteServiceWrapper.getInstance().saveIuiRouteInstance(iuiRouteInfos[i], routeWay);
161 case RouteUtil.PROTOCOL_REST:
163 ApiRouteInfo[] apiRouteInfos =
164 this.buildApiRouteInfo(microServiceInfo, routeName, microServiceInfo.getVersion(),
166 for (int i = 0; i < apiRouteInfos.length; i++) {
167 ApiRouteServiceWrapper.getInstance().saveApiRouteInstance(apiRouteInfos[i], routeWay);
170 case RouteUtil.PROTOCOL_HTTP:
171 CustomRouteInfo[] customRouteInfos =
172 this.buildCustomRouteInfo(microServiceInfo,
173 getHttpName(routeName, microServiceInfo.getVersion()), routeWay);
174 for (int i = 0; i < customRouteInfos.length; i++) {
175 CustomRouteServiceWrapper.getInstance().saveCustomRouteInstance(customRouteInfos[i],
183 * @Title deleteServiceByProtocol
184 * @Description TODO(按用户注册协议删除服务)
185 * @param microServiceInfo
189 private void deleteServiceByProtocol(MicroServiceFullInfo microServiceInfo, String routeWay) {
190 String protocol = microServiceInfo.getProtocol();
191 String host = getHost(microServiceInfo);
193 RouteUtil.getRouteNameByns(microServiceInfo.getServiceName(),
194 microServiceInfo.getNamespace());
196 if (RouteUtil.PROTOCOL_UI.equals(protocol)) {
198 if (RouteUtil.ROUTEWAY_IP.equals(routeWay)) {
200 String[] publishPorts = StringUtils.split(microServiceInfo.getPublish_port(), "|");
201 if (publishPorts.length == 2) {
202 IuiRouteServiceWrapper.getInstance().deleteIuiRoute(routeName, host, publishPorts[0],
204 IuiRouteServiceWrapper.getInstance().deleteIuiRoute(routeName, host, publishPorts[1],
210 IuiRouteServiceWrapper.getInstance().deleteIuiRoute(routeName, host,
211 microServiceInfo.getPublish_port(), routeWay);
212 } else if (RouteUtil.PROTOCOL_REST.equals(protocol)) {
214 if (RouteUtil.ROUTEWAY_IP.equals(routeWay)) {
216 String[] publishPorts = StringUtils.split(microServiceInfo.getPublish_port(), "|");
217 if (publishPorts.length == 2) {
218 ApiRouteServiceWrapper.getInstance().deleteApiRoute(routeName,
219 microServiceInfo.getVersion(), host, publishPorts[0], routeWay);
220 ApiRouteServiceWrapper.getInstance().deleteApiRoute(routeName,
221 microServiceInfo.getVersion(), host, publishPorts[1], routeWay);
225 ApiRouteServiceWrapper.getInstance().deleteApiRoute(routeName, microServiceInfo.getVersion(),
226 host, microServiceInfo.getPublish_port(), routeWay);
227 } else if (RouteUtil.PROTOCOL_HTTP.equals(protocol)) {
229 if (RouteUtil.ROUTEWAY_IP.equals(routeWay)) {
231 String[] publishPorts = StringUtils.split(microServiceInfo.getPublish_port(), "|");
232 if (publishPorts.length == 2) {
233 CustomRouteServiceWrapper.getInstance().deleteCustomRoute(
234 getHttpName(routeName, microServiceInfo.getVersion()), host, publishPorts[0],
236 CustomRouteServiceWrapper.getInstance().deleteCustomRoute(
237 getHttpName(routeName, microServiceInfo.getVersion()), host, publishPorts[1],
242 CustomRouteServiceWrapper.getInstance().deleteCustomRoute(
243 getHttpName(routeName, microServiceInfo.getVersion()), host,
244 microServiceInfo.getPublish_port(), routeWay);
249 * @Title saveServiceByUrl
250 * @Description TODO(按URL地址判断服务协议并保存到路由表)
252 * @param microServiceInfo
257 private void saveServiceByPath(MicroServiceFullInfo microServiceInfo, String routeWay)
259 String redis_serviceName;
260 String path=microServiceInfo.getPath();
261 if (RegExpTestUtil.apiRouteUrlRegExpTest(path)) {
263 String[] serviceKey = RegExpTestUtil.apiServiceNameMatch4URL(path);
264 if (serviceKey == null) {
265 LOGGER.error("save api Service ByUrl is error:[url]" + path);
268 redis_serviceName = serviceKey[0];
269 String redis_serviceVersion = serviceKey[1];
271 ApiRouteInfo[] apiRouteInfos =
272 this.buildApiRouteInfo(microServiceInfo, redis_serviceName, redis_serviceVersion,
274 for (int i = 0; i < apiRouteInfos.length; i++) {
275 ApiRouteServiceWrapper.getInstance().saveApiRouteInstance(apiRouteInfos[i], routeWay);
277 } else if (RegExpTestUtil.iuiRouteUrlRegExpTest(path)) {
280 redis_serviceName = RegExpTestUtil.iuiServiceNameMatch4URL(path);
281 if (redis_serviceName == null) {
282 LOGGER.error("save iui Service ByUrl is error:[url]" + path);
285 IuiRouteInfo[] iuiRouteInfos =
286 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],
303 * @Title deleteServiceByUrl
304 * @Description TODO(按URL地址判断服务协议并从路由表删除)
307 * @param publish_port
311 private void deleteServiceByUrl(String url, String host, String publish_port, String routeWay) {
313 String redis_serviceName;
315 if (RegExpTestUtil.apiRouteUrlRegExpTest(url)) {
317 String[] serviceKey = RegExpTestUtil.apiServiceNameMatch4URL(url);
318 if (serviceKey == null) {
319 LOGGER.error("delete api Service ByUrl is error:[url]" + url);
323 redis_serviceName = serviceKey[0];
324 String redis_serviceVersion = serviceKey[1];
326 if (RouteUtil.ROUTEWAY_IP.equals(routeWay)) {
328 String[] publishPorts = StringUtils.split(publish_port, "|");
329 if (publishPorts.length == 2) {
330 ApiRouteServiceWrapper.getInstance().deleteApiRoute(redis_serviceName,
331 redis_serviceVersion, host, publishPorts[0], routeWay);
332 ApiRouteServiceWrapper.getInstance().deleteApiRoute(redis_serviceName,
333 redis_serviceVersion, host, publishPorts[1], routeWay);
338 ApiRouteServiceWrapper.getInstance().deleteApiRoute(redis_serviceName, redis_serviceVersion,
339 host, publish_port, routeWay);
343 } else if (RegExpTestUtil.iuiRouteUrlRegExpTest(url)) {
346 redis_serviceName = RegExpTestUtil.iuiServiceNameMatch4URL(url);
347 if (redis_serviceName == null) {
348 LOGGER.error("delete iui Service ByUrl is error:[url]" + url);
352 if (RouteUtil.ROUTEWAY_IP.equals(routeWay)) {
354 String[] publishPorts = StringUtils.split(publish_port, "|");
355 if (publishPorts.length == 2) {
356 IuiRouteServiceWrapper.getInstance().deleteIuiRoute(redis_serviceName, host,
357 publishPorts[0], routeWay);
358 IuiRouteServiceWrapper.getInstance().deleteIuiRoute(redis_serviceName, host,
359 publishPorts[1], routeWay);
364 IuiRouteServiceWrapper.getInstance().deleteIuiRoute(redis_serviceName, host, publish_port,
370 redis_serviceName = url;
372 if (RouteUtil.ROUTEWAY_IP.equals(routeWay)) {
374 String[] publishPorts = StringUtils.split(publish_port, "|");
375 if (publishPorts.length == 2) {
376 CustomRouteServiceWrapper.getInstance().deleteCustomRoute(redis_serviceName, host,
377 publishPorts[0], routeWay);
378 CustomRouteServiceWrapper.getInstance().deleteCustomRoute(redis_serviceName, host,
379 publishPorts[1], routeWay);
384 CustomRouteServiceWrapper.getInstance().deleteCustomRoute(redis_serviceName, host,
385 publish_port, routeWay);
393 * @Title getCustomName
394 * @Description TODO(获取HTTP服务路由名)
400 private String getHttpName(String routeName, String version) {
401 if (!routeName.startsWith("/")) {
402 routeName = "/" + routeName;
405 if (StringUtils.isNotBlank(version)) {
406 routeName += "/" + version;
412 private String getHost(MicroServiceFullInfo microServiceInfo) {
414 if (StringUtils.isNotBlank(microServiceInfo.getHost())) {
415 host = microServiceInfo.getHost().toLowerCase();
417 // host为空,取默认规则 服务名-ns
418 host = microServiceInfo.getServiceName().toLowerCase();
427 public void onChange(String serviceName, String version, MicroServiceFullInfo microServiceInfo)
429 // TODO Auto-generated method stub
431 if (RouteUtil.PROTOCOL_UI.equals(microServiceInfo.getProtocol())) {
432 IuiRouteInfo[] iuiRouteInfos =
433 this.buildIuiRouteInfo(microServiceInfo, serviceName, RouteUtil.ROUTEWAY_IP);
434 for (int i = 0; i < iuiRouteInfos.length; i++) {
435 IuiRouteServiceWrapper.getInstance().saveIuiRouteInstance(iuiRouteInfos[i],
436 RouteUtil.ROUTEWAY_IP);
438 } else if (RouteUtil.PROTOCOL_REST.equals(microServiceInfo.getProtocol())) {
439 ApiRouteInfo[] apiRouteInfos =
440 this.buildApiRouteInfo(microServiceInfo, serviceName, version, RouteUtil.ROUTEWAY_IP);
441 for (int i = 0; i < apiRouteInfos.length; i++) {
442 ApiRouteServiceWrapper.getInstance().saveApiRouteInstance(apiRouteInfos[i],
443 RouteUtil.ROUTEWAY_IP);
445 } else if (RouteUtil.PROTOCOL_HTTP.equals(microServiceInfo.getProtocol())) {
446 if (!serviceName.startsWith("/")) {
447 serviceName = "/" + serviceName;
449 CustomRouteInfo[] customRouteInfos =
450 this.buildCustomRouteInfo(microServiceInfo, serviceName, RouteUtil.ROUTEWAY_IP);
451 for (int i = 0; i < customRouteInfos.length; i++) {
452 CustomRouteServiceWrapper.getInstance().saveCustomRouteInstance(customRouteInfos[i],
453 RouteUtil.ROUTEWAY_IP);
460 public void onStatusChange(String serviceName, String version, String host, String protocol,
461 String publish_port, String status) {
465 if (StringUtils.isBlank(host)) {
466 host = serviceName.toLowerCase();
469 if (RouteUtil.PROTOCOL_UI.equals(protocol)) {
471 IuiRouteServiceWrapper.getInstance().updateIuiRouteStatus(serviceName, host, publish_port,
472 status, RouteUtil.ROUTEWAY_IP);
474 } else if (RouteUtil.PROTOCOL_REST.equals(protocol)) {
475 ApiRouteServiceWrapper.getInstance().updateApiRouteStatus(serviceName, version, host,
476 publish_port, status, RouteUtil.ROUTEWAY_IP);
478 } else if (RouteUtil.PROTOCOL_HTTP.equals(protocol)) {
479 if (!serviceName.startsWith("/")) {
480 serviceName = "/" + serviceName;
482 CustomRouteServiceWrapper.getInstance().updateCustomRouteStatus(serviceName, host,
483 publish_port, status, RouteUtil.ROUTEWAY_IP);
489 private boolean buildRouteHttpProtocol(MicroServiceFullInfo microServiceInfo, String routeWay) {
492 if (RouteUtil.CUSTOM_PORTAL.equals(microServiceInfo.getCustom())) {
493 if (RouteUtil.ROUTEWAY_DOMAIN.equals(routeWay)) {
501 return microServiceInfo.isEnable_ssl();
505 private RouteServer[] buildRouteNodes(MicroServiceFullInfo microServiceInfo, String routeWay) {
507 // 针对custom=portal场景的域名路由使用apigateway发布地址作为node
508 if (RouteUtil.CUSTOM_PORTAL.equals(microServiceInfo.getCustom())) {
509 if (RouteUtil.ROUTEWAY_DOMAIN.equals(routeWay)) {
511 String discoverServiceName =
512 RouteUtil.getRouteNameByns(microServiceInfo.getServiceName(),
513 microServiceInfo.getNamespace());
514 List<Node> publishNodes =
515 getPublishNodes(discoverServiceName, microServiceInfo.getVersion(),
516 microServiceInfo.getNamespace());
517 if (publishNodes != null && publishNodes.size() > 0) {
518 RouteServer[] routeServers = new RouteServer[publishNodes.size()];
520 for (Node node : publishNodes) {
521 RouteServer routeServer = new RouteServer(node.getIp(), node.getPort());
522 routeServers[i] = routeServer;
531 Set<Node> nodes = microServiceInfo.getNodes();
532 RouteServer[] routeServers = new RouteServer[nodes.size()];
534 for (Node node : nodes) {
535 RouteServer routeServer = new RouteServer(node.getIp(), node.getPort());
536 routeServers[n] = routeServer;
545 * From MicroServiceInfo to ApiRouteInfo
547 * @param microServiceInfo
550 private ApiRouteInfo[] buildApiRouteInfo(MicroServiceFullInfo microServiceInfo,
551 String redis_serviceName, String redis_version, String routeWay) {
553 ApiRouteInfo apiRouteInfo = new ApiRouteInfo();
554 apiRouteInfo.setUrl(microServiceInfo.getUrl());
556 apiRouteInfo.setServers(buildRouteNodes(microServiceInfo, routeWay));
558 apiRouteInfo.setVisualRange(RouteUtil.getVisualRangeByRouter(microServiceInfo.getVisualRange()));
561 if ("ip_hash".equals(microServiceInfo.getLb_policy())) {
562 apiRouteInfo.setUseOwnUpstream("1");
565 apiRouteInfo.setConsulServiceName(microServiceInfo.getServiceName());
566 apiRouteInfo.setServiceName(redis_serviceName);
567 apiRouteInfo.setVersion(redis_version);
568 apiRouteInfo.setApiJson(microServiceInfo.getUrl() + "/swagger.json");
569 apiRouteInfo.setMetricsUrl("/admin/metrics");
570 apiRouteInfo.setEnable_ssl(buildRouteHttpProtocol(microServiceInfo, routeWay));
571 // 默认 HttpProtocol和PublishProtocol=http
572 if (apiRouteInfo.isEnable_ssl()) {
573 apiRouteInfo.setPublishProtocol("https");
577 String host = getHost(microServiceInfo);
579 apiRouteInfo.setHost(host.toLowerCase());
580 apiRouteInfo.setNamespace(microServiceInfo.getNamespace());
582 if (RouteUtil.ROUTEWAY_IP.equals(routeWay)) {
584 if (StringUtils.isNotBlank(microServiceInfo.getPublish_port())) {
585 apiRouteInfo.setPublishProtocol("https");
588 // 获取服务的发布端口(支持多端口格式:https|http)
589 String[] publishPorts = StringUtils.split(microServiceInfo.getPublish_port(), "|");
590 if (publishPorts.length == 2) {
591 apiRouteInfo.setPublishProtocol("https");
592 apiRouteInfo.setPublish_port(publishPorts[0]);
595 ApiRouteInfo apiRouteInfo_http = (ApiRouteInfo) apiRouteInfo.clone();
596 apiRouteInfo.setPublishProtocol("http");
597 apiRouteInfo.setPublish_port(publishPorts[1]);
598 return new ApiRouteInfo[] {apiRouteInfo, apiRouteInfo_http};
599 } catch (CloneNotSupportedException e) {
600 LOGGER.error("CLONE is wrong:" + apiRouteInfo);
601 return new ApiRouteInfo[] {apiRouteInfo};
609 apiRouteInfo.setPublish_port(microServiceInfo.getPublish_port());
610 return new ApiRouteInfo[] {apiRouteInfo};
617 * From MicroServiceInfo to CustomRouteInfo
619 * @param microServiceInfo
622 private CustomRouteInfo[] buildCustomRouteInfo(MicroServiceFullInfo microServiceInfo,
623 String redis_serviceName, String routeWay) {
625 CustomRouteInfo customRouteInfo = new CustomRouteInfo();
626 customRouteInfo.setUrl(microServiceInfo.getUrl());
629 customRouteInfo.setServers(buildRouteNodes(microServiceInfo, routeWay));
631 customRouteInfo.setVisualRange(RouteUtil.getVisualRangeByRouter(microServiceInfo.getVisualRange()));
633 if ("ip_hash".equals(microServiceInfo.getLb_policy())) {
634 customRouteInfo.setUseOwnUpstream("1");
637 customRouteInfo.setConsulServiceName(microServiceInfo.getServiceName());
638 customRouteInfo.setServiceName(redis_serviceName);
641 String host = getHost(microServiceInfo);
643 customRouteInfo.setHost(host.toLowerCase());
644 customRouteInfo.setNamespace(microServiceInfo.getNamespace());
645 customRouteInfo.setEnable_ssl(buildRouteHttpProtocol(microServiceInfo, routeWay));
647 if (customRouteInfo.isEnable_ssl()) {
648 customRouteInfo.setPublishProtocol("https");
652 if (RouteUtil.ROUTEWAY_IP.equals(routeWay)) {
653 if (StringUtils.isNotBlank(microServiceInfo.getPublish_port())) {
654 customRouteInfo.setPublishProtocol("https");
657 String[] publishPorts = StringUtils.split(microServiceInfo.getPublish_port(), "|");
658 if (publishPorts.length == 2) {
659 // 获取服务的发布端口(支持多端口格式:https|http)
660 customRouteInfo.setPublishProtocol("https");
661 customRouteInfo.setPublish_port(publishPorts[0]);
664 CustomRouteInfo customRouteInfo_http = (CustomRouteInfo) customRouteInfo.clone();
665 customRouteInfo.setPublishProtocol("http");
666 customRouteInfo.setPublish_port(publishPorts[1]);
667 return new CustomRouteInfo[] {customRouteInfo, customRouteInfo_http};
668 } catch (CloneNotSupportedException e) {
669 LOGGER.error("CLONE is wrong:" + customRouteInfo);
670 return new CustomRouteInfo[] {customRouteInfo};
677 customRouteInfo.setPublish_port(microServiceInfo.getPublish_port());
678 return new CustomRouteInfo[] {customRouteInfo};
683 * From MicroServiceInfo to IuiRouteInfo
685 * @param microServiceInfo
688 private IuiRouteInfo[] buildIuiRouteInfo(MicroServiceFullInfo microServiceInfo,
689 String redis_serviceName, String routeWay) {
691 IuiRouteInfo iuiRouteInfo = new IuiRouteInfo();
692 iuiRouteInfo.setUrl(microServiceInfo.getUrl());
694 iuiRouteInfo.setServers(buildRouteNodes(microServiceInfo, routeWay));
696 iuiRouteInfo.setVisualRange(RouteUtil.getVisualRangeByRouter(microServiceInfo.getVisualRange()));
698 if ("ip_hash".equals(microServiceInfo.getLb_policy())) {
699 iuiRouteInfo.setUseOwnUpstream("1");
703 iuiRouteInfo.setConsulServiceName(microServiceInfo.getServiceName());
704 iuiRouteInfo.setServiceName(redis_serviceName);
707 String host = getHost(microServiceInfo);
709 iuiRouteInfo.setHost(host.toLowerCase());
710 iuiRouteInfo.setNamespace(microServiceInfo.getNamespace());
711 iuiRouteInfo.setEnable_ssl(buildRouteHttpProtocol(microServiceInfo, routeWay));
712 if (iuiRouteInfo.isEnable_ssl()) {
713 iuiRouteInfo.setPublishProtocol("https");
716 if (RouteUtil.ROUTEWAY_IP.equals(routeWay)) {
718 if (StringUtils.isNotBlank(microServiceInfo.getPublish_port())) {
719 iuiRouteInfo.setPublishProtocol("https");
722 String[] publishPorts = StringUtils.split(microServiceInfo.getPublish_port(), "|");
723 if (publishPorts.length == 2) {
724 // 获取服务的发布端口(支持多端口格式:https|http)
725 iuiRouteInfo.setPublishProtocol("https");
726 iuiRouteInfo.setPublish_port(publishPorts[0]);
729 IuiRouteInfo iuiRouteInfo_http = (IuiRouteInfo) iuiRouteInfo.clone();
730 iuiRouteInfo.setPublishProtocol("http");
731 iuiRouteInfo.setPublish_port(publishPorts[1]);
732 return new IuiRouteInfo[] {iuiRouteInfo, iuiRouteInfo_http};
733 } catch (CloneNotSupportedException e) {
734 LOGGER.error("CLONE is wrong:" + iuiRouteInfo);
735 return new IuiRouteInfo[] {iuiRouteInfo};
740 iuiRouteInfo.setPublish_port(microServiceInfo.getPublish_port());
741 return new IuiRouteInfo[] {iuiRouteInfo};
746 private List<Node> getPublishNodes(String discoverServiceName, String version, String namespace) {
747 List<Node> nodes = new ArrayList<Node>();
749 if (StringUtils.isBlank(version)) {
753 DiscoverInfo discoverInfo = ConfigUtil.getInstance().getDiscoverInfo();
755 String allpublishaddressUrl =
756 (new StringBuilder().append("http://").append(discoverInfo.toString())
757 .append(RouteUtil.MSB_ROUTE_URL).append("/").append(discoverServiceName)
758 .append("/version/").append(version).append("/allpublishaddress?namespace=")
759 .append(namespace).append("&visualRange=0")).toString();
761 String resultJson = HttpClientUtil.httpGet(allpublishaddressUrl);
762 List<PublishFullAddress> publishFullAddressList =
764 .jsonToListBean(resultJson, new TypeReference<List<PublishFullAddress>>() {});
765 if (publishFullAddressList != null && publishFullAddressList.size() > 0) {
766 for (PublishFullAddress publishFullAddress : publishFullAddressList) {
767 if (StringUtils.isNotBlank(publishFullAddress.getIp())
768 && "https".equals(publishFullAddress.getPublish_protocol())) {
769 nodes.add(new Node(publishFullAddress.getIp(), publishFullAddress.getPort()));