2 * Copyright 2016 ZTE Corporation.
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.
16 package org.openo.msb.wrapper.serviceListener;
20 import org.apache.commons.lang3.StringUtils;
21 import org.openo.msb.api.ApiRouteInfo;
22 import org.openo.msb.api.CustomRouteInfo;
23 import org.openo.msb.api.IuiRouteInfo;
24 import org.openo.msb.api.Node;
25 import org.openo.msb.api.RouteServer;
26 import org.openo.msb.api.Service;
27 import org.openo.msb.wrapper.ApiRouteServiceWrapper;
28 import org.openo.msb.wrapper.CustomRouteServiceWrapper;
29 import org.openo.msb.wrapper.IuiRouteServiceWrapper;
30 import org.openo.msb.wrapper.util.RegExpTestUtil;
31 import org.openo.msb.wrapper.util.RouteUtil;
32 import org.slf4j.Logger;
33 import org.slf4j.LoggerFactory;
36 public class MicroServiceChangeListener implements IMicroServiceChangeListener {
38 private static final Logger LOGGER = LoggerFactory.getLogger(MicroServiceChangeListener.class);
41 public void onSave(Service microServiceInfo, String serverPort) {
43 if ("UI".equals(microServiceInfo.getProtocol())) {
44 IuiRouteInfo iuiRouteInfo = this.buildIuiRouteInfo(microServiceInfo);
45 if (null != iuiRouteInfo) {
46 IuiRouteServiceWrapper.getInstance().saveIuiRouteInstance(iuiRouteInfo);
48 } else if ("REST".equals(microServiceInfo.getProtocol())) {
49 ApiRouteInfo apiRouteInfo = this.buildApiRouteInfo(microServiceInfo);
50 if (null != apiRouteInfo) {
51 ApiRouteServiceWrapper.getInstance().saveApiRouteInstance(apiRouteInfo, serverPort);
53 } else if ("HTTP".equals(microServiceInfo.getProtocol())) {
54 CustomRouteInfo customRouteInfo = this.buildCustomRouteInfo(microServiceInfo);
55 if (null != customRouteInfo) {
56 CustomRouteServiceWrapper.getInstance()
57 .saveCustomRouteInstance(customRouteInfo, serverPort);
64 public void onChange(String serviceName, String version, Service microServiceInfo,
67 if ("UI".equals(microServiceInfo.getProtocol())) {
68 if (serviceName.startsWith("iui_") || serviceName.startsWith("IUI_")) {
69 serviceName = serviceName.substring(4);
71 IuiRouteInfo iuiRouteInfo = this.buildIuiRouteInfo(microServiceInfo);
72 if (null != iuiRouteInfo) {
73 IuiRouteServiceWrapper.getInstance().updateIuiRouteInstance(serviceName, iuiRouteInfo);
75 } else if ("REST".equals(microServiceInfo.getProtocol())) {
76 ApiRouteInfo apiRouteInfo = this.buildApiRouteInfo(microServiceInfo);
77 if (null != apiRouteInfo) {
78 ApiRouteServiceWrapper.getInstance().updateApiRouteInstance(serviceName, version,
79 apiRouteInfo, serverPort);
81 } else if ("HTTP".equals(microServiceInfo.getProtocol())) {
82 if (!serviceName.startsWith("/")) {
83 serviceName = "/" + serviceName;
85 CustomRouteInfo customRouteInfo = this.buildCustomRouteInfo(microServiceInfo);
86 if (null != customRouteInfo) {
87 CustomRouteServiceWrapper.getInstance().updateCustomRouteInstance(serviceName,
88 customRouteInfo, serverPort);
97 public void onStatusChange(String serviceName, String url, String version, String protocol,
99 if ("UI".equals(protocol)) {
101 if (serviceName.startsWith("iui_") || serviceName.startsWith("IUI_")) {
102 serviceName = serviceName.substring(4);
104 IuiRouteServiceWrapper.getInstance().updateIuiRouteStatus(serviceName, status);
106 } else if ("REST".equals(protocol)) {
107 ApiRouteServiceWrapper.getInstance().updateApiRouteStatus(serviceName, version, status);
108 } else if ("HTTP".equals(protocol)) {
109 if (!serviceName.startsWith("/")) {
110 serviceName = "/" + serviceName;
112 CustomRouteServiceWrapper.getInstance().updateCustomRouteStatus(serviceName, status);
118 public void onDelete(String serviceName, String url, String version, String protocol,
121 if ("UI".equals(protocol)) {
122 if (serviceName.startsWith("iui_") || serviceName.startsWith("IUI_")) {
123 serviceName = serviceName.substring(4);
125 IuiRouteServiceWrapper.getInstance().deleteIuiRoute(serviceName, "*");
127 } else if ("REST".equals(protocol)) {
128 ApiRouteServiceWrapper.getInstance().deleteApiRoute(serviceName, version, "*", serverPort);
129 } else if ("HTTP".equals(protocol)) {
130 if (!serviceName.startsWith("/")) {
131 serviceName = "/" + serviceName;
134 CustomRouteServiceWrapper.getInstance().deleteCustomRoute(serviceName, "*", serverPort);
141 * @Title ifApiRouteUrl
142 * @Description TODO(According to judge whether the API registration URL format)
147 private boolean ifApiRouteUrl(String url) {
148 return RegExpTestUtil.apiRouteUrlRegExpTest(url);
153 * From MicroServiceInfo to ApiRouteInfo
155 * @param microServiceInfo
158 private ApiRouteInfo buildApiRouteInfo(Service microServiceInfo) {
160 ApiRouteInfo apiRouteInfo = new ApiRouteInfo();
161 apiRouteInfo.setUrl(microServiceInfo.getUrl());
163 Set<Node> nodes = microServiceInfo.getNodes();
164 RouteServer[] routeServers = new RouteServer[nodes.size()];
168 for (Node node : nodes) {
169 RouteServer routeServer = new RouteServer(node.getIp(), node.getPort());
170 routeServers[i] = routeServer;
175 apiRouteInfo.setServers(routeServers);
176 String[] rangs = StringUtils.split(microServiceInfo.getVisualRange(), "|");
177 if (RouteUtil.contain(rangs, "0")) {
178 apiRouteInfo.setVisualRange("0");
180 apiRouteInfo.setVisualRange("1");
184 if ("ip_hash".equals(microServiceInfo.getLb_policy())) {
185 apiRouteInfo.setUseOwnUpstream("1");
190 apiRouteInfo.setServiceName(microServiceInfo.getServiceName());
191 apiRouteInfo.setVersion(microServiceInfo.getVersion());
192 // TODO:set json and metrics defaultValue
194 "".equals(microServiceInfo.getVersion()) ? "" : "/" + microServiceInfo.getVersion();
195 apiRouteInfo.setApiJson(microServiceInfo.getUrl() + "/swagger.json");
196 apiRouteInfo.setMetricsUrl("/admin/metrics");
202 * From MicroServiceInfo to CustomRouteInfo
204 * @param microServiceInfo
207 private CustomRouteInfo buildCustomRouteInfo(Service microServiceInfo) {
209 CustomRouteInfo customRouteInfo = new CustomRouteInfo();
210 customRouteInfo.setUrl(microServiceInfo.getUrl());
212 Set<Node> nodes = microServiceInfo.getNodes();
213 RouteServer[] routeServers = new RouteServer[nodes.size()];
217 for (Node node : nodes) {
218 RouteServer routeServer = new RouteServer(node.getIp(), node.getPort());
219 routeServers[i] = routeServer;
223 customRouteInfo.setServers(routeServers);
224 String[] rangs = StringUtils.split(microServiceInfo.getVisualRange(), "|");
225 if (RouteUtil.contain(rangs, "0")) {
226 customRouteInfo.setVisualRange("0");
228 customRouteInfo.setVisualRange("1");
231 if ("ip_hash".equals(microServiceInfo.getLb_policy())) {
232 customRouteInfo.setUseOwnUpstream("1");
236 if (!microServiceInfo.getServiceName().startsWith("/")) {
237 serviceName = "/" + microServiceInfo.getServiceName();
239 serviceName = microServiceInfo.getServiceName();
241 customRouteInfo.setServiceName(serviceName);
243 return customRouteInfo;
248 * From MicroServiceInfo to IuiRouteInfo
250 * @param microServiceInfo
253 private IuiRouteInfo buildIuiRouteInfo(Service microServiceInfo) {
255 IuiRouteInfo iuiRouteInfo = new IuiRouteInfo();
256 iuiRouteInfo.setUrl(microServiceInfo.getUrl());
258 Set<Node> nodes = microServiceInfo.getNodes();
259 RouteServer[] routeServers = new RouteServer[nodes.size()];
263 for (Node node : nodes) {
264 RouteServer routeServer = new RouteServer(node.getIp(), node.getPort());
265 routeServers[i] = routeServer;
269 iuiRouteInfo.setServers(routeServers);
270 String[] rangs = StringUtils.split(microServiceInfo.getVisualRange(), "|");
271 if (RouteUtil.contain(rangs, "0")) {
272 iuiRouteInfo.setVisualRange("0");
274 iuiRouteInfo.setVisualRange("1");
277 if ("ip_hash".equals(microServiceInfo.getLb_policy())) {
278 iuiRouteInfo.setUseOwnUpstream("1");
281 String serviceName = microServiceInfo.getServiceName();
282 if (serviceName.startsWith("iui_") || serviceName.startsWith("IUI_")) {
283 serviceName = serviceName.substring(4);
287 iuiRouteInfo.setServiceName(serviceName);