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;
20 import org.apache.commons.lang3.StringUtils;
21 import org.openo.msb.api.MicroServiceFullInfo;
22 import org.openo.msb.api.MicroServiceInfo;
23 import org.openo.msb.api.Node;
24 import org.openo.msb.api.NodeInfo;
25 import org.openo.msb.api.exception.ExtendedInternalServerErrorException;
26 import org.openo.msb.api.exception.ExtendedNotFoundException;
27 import org.openo.msb.api.exception.ExtendedNotSupportedException;
28 import org.openo.msb.wrapper.util.MicroServiceDB;
29 import org.openo.msb.wrapper.util.RegExpTestUtil;
30 import org.openo.msb.wrapper.util.RouteUtil;
31 import org.slf4j.Logger;
32 import org.slf4j.LoggerFactory;
34 public class MicroServiceWrapper {
36 private static final Logger LOGGER = LoggerFactory.getLogger(MicroServiceWrapper.class);
38 private static MicroServiceWrapper instance = new MicroServiceWrapper();
41 private MicroServiceWrapper() {}
43 public static MicroServiceWrapper getInstance() {
49 * @Title: getAllMicroServiceInstances
50 * @Description: getAllMicroServiceInstances
55 public MicroServiceFullInfo[] getAllMicroServiceInstances(){
58 return MicroServiceDB.getInstance().getAllMicroServiceInstances();
60 } catch (Exception e) {
61 throw new ExtendedInternalServerErrorException(e.getMessage());
67 * @Title: getMicroServiceInstance
68 * @Description: (getMicroServiceInstance)
69 * @param: @param serviceName
70 * @param: @param version
72 * @return: ApiRouteInfo
74 public MicroServiceFullInfo getMicroServiceInstance(String serviceName, String version,String serverPort) {
75 if("null".equals(version)) {
78 serviceName=serviceName.replace("*", "/");
80 if (StringUtils.isBlank(serviceName)) {
81 throw new ExtendedNotSupportedException("serviceName can't be empty");
84 if (StringUtils.isNotBlank(version)) {
85 if (!RegExpTestUtil.versionRegExpTest(version)) {
86 throw new ExtendedNotSupportedException("version (" + version
87 + ") is not a valid format");
91 MicroServiceFullInfo microServiceInfo;
94 MicroServiceDB.getInstance().getMicroServiceInstance(serviceName, version,serverPort);
96 } catch (Exception e) {
97 throw new ExtendedInternalServerErrorException(e.getMessage());
100 if (null == microServiceInfo) {
102 "microservice not found: serviceName-" + serviceName + ",version-" + version;
103 LOGGER.warn(errInfo);
104 throw new ExtendedNotFoundException(errInfo);
108 return microServiceInfo;
114 * @Title: updateMicroServiceInstance
115 * @Description: updateMicroServiceInstance
116 * @param: serviceName
118 * @param: microServiceInfo
119 * @return: RouteResult
121 public synchronized MicroServiceFullInfo updateMicroServiceInstance(String serviceName,
122 String version, MicroServiceInfo microServiceInfo) {
123 if("null".equals(version)) {
126 serviceName=serviceName.replace("*", "/");
131 MicroServiceFullInfo oldService= getMicroServiceInstance(serviceName,version,"");
133 // Delete the original record
134 MicroServiceDB.getInstance().deleteMicroService(serviceName, version,"");
135 // Notify the listeners
136 MicroServiceDB.getInstance().noticeApiListener(oldService, "DELETE","");
137 // Save the new record
138 MicroServiceDB.getInstance().saveMicroServiceInfo2Redis(microServiceInfo,"");
140 MicroServiceDB.getInstance().noticeApiListener(microServiceInfo, "ADD","");
141 MicroServiceFullInfo newMicroServiceInfo =
142 MicroServiceDB.getInstance().getMicroServiceInstance(
143 microServiceInfo.getServiceName(), microServiceInfo.getVersion(),"");
144 return newMicroServiceInfo;
145 } catch (Exception e) {
146 LOGGER.error("update MicroService throw exception", e);
147 throw new ExtendedInternalServerErrorException(e.getMessage());
153 public synchronized MicroServiceFullInfo updateMicroServiceNode(String serviceName,
154 String version, String ip,String port, int ttl) {
155 if("null".equals(version)) {
158 serviceName=serviceName.replace("*", "/");
160 if (StringUtils.isBlank(serviceName)) {
161 throw new ExtendedNotSupportedException(
162 "update MicroService Node FAIL:serviceName can't be empty");
165 if (StringUtils.isNotBlank(version)) {
166 if (!RegExpTestUtil.versionRegExpTest(version)) {
167 throw new ExtendedNotSupportedException(
168 "update MicroService Node FAIL:version is not a valid format");
172 if (!RegExpTestUtil.ipRegExpTest(ip)) {
173 throw new ExtendedNotSupportedException("update MicroService Node FAIL:ip(" + ip
174 + ")is not a valid IP address");
177 if (!RegExpTestUtil.portRegExpTest(port)) {
178 throw new ExtendedNotSupportedException("update MicroService Node FAIL:port(" + port
179 + ")is not a valid Port address");
184 MicroServiceDB.getInstance().updateMicroServiceNode2Redis(serviceName, version, ip,port,ttl);
186 MicroServiceFullInfo newMicroServiceInfo =
187 MicroServiceDB.getInstance().getMicroServiceInstance(serviceName, version,"");
189 return newMicroServiceInfo;
190 } catch (NullPointerException e) {
191 throw new ExtendedNotFoundException(e.getMessage());
192 } catch (Exception e) {
193 LOGGER.error("update MicroServiceNode throw exception", e);
194 throw new ExtendedInternalServerErrorException(e.getMessage());
199 * @Title updateMicroServiceStatus
200 * @Description updateMicroServiceStatus
205 * @return RouteResult
208 public synchronized MicroServiceFullInfo updateMicroServiceStatus(String serviceName, String version,
211 if ("null".equals(version)) {
214 serviceName=serviceName.replace("*", "/");
216 if (StringUtils.isBlank(serviceName)) {
217 throw new ExtendedNotSupportedException(
218 "update MicroService status FAIL:serviceName can't be empty");
221 if (StringUtils.isNotBlank(version)) {
222 if (!RegExpTestUtil.versionRegExpTest(version)) {
223 throw new ExtendedNotSupportedException(
224 "update MicroService status FAIL:version is not a valid format");
228 if(!"0".equals(status) && !"2".equals(status) && !"1".equals(status)){
230 throw new ExtendedNotSupportedException("update MicroService status FAIL:status is wrong");
236 MicroServiceDB.getInstance().updateMicroServiceStatus(serviceName, version, status);
238 MicroServiceFullInfo newMicroServiceInfo =
239 MicroServiceDB.getInstance().getMicroServiceInstance(serviceName, version,"");
241 // Notify the listeners
242 MicroServiceDB.getInstance().noticeUpdateStatusListener(newMicroServiceInfo, status);
245 return newMicroServiceInfo;
246 } catch (NullPointerException e) {
247 throw new ExtendedNotFoundException(e.getMessage());
248 } catch (Exception e) {
249 LOGGER.error("update MicroServiceNode throw exception", e);
250 throw new ExtendedInternalServerErrorException(e.getMessage());
257 public synchronized MicroServiceFullInfo saveMicroServiceInstance(
258 MicroServiceInfo microServiceInfo, boolean createOrUpdate,String requestIP,String serverPort) {
260 if (StringUtils.isBlank(microServiceInfo.getServiceName())
261 || StringUtils.isBlank(microServiceInfo.getProtocol())
262 || microServiceInfo.getNodes().size() == 0) {
263 throw new ExtendedNotSupportedException(
264 "register MicroServiceInfo FAIL: Some required fields are empty");
267 for (Node node : microServiceInfo.getNodes()) {
269 if(node.getIp()==null || node.getIp().isEmpty()){
270 node.setIp(requestIP);
272 else if (!RegExpTestUtil.ipRegExpTest(node.getIp())) {
273 throw new ExtendedNotSupportedException("register MicroServiceInfo FAIL:IP("
274 + node.getIp() + ")is not a valid ip address");
277 if (!RegExpTestUtil.portRegExpTest(node.getPort())) {
278 throw new ExtendedNotSupportedException("register MicroServiceInfo FAIL:Port("
279 + node.getPort() + ")is not a valid Port address");
283 if (StringUtils.isNotBlank(microServiceInfo.getVersion())) {
284 if (!RegExpTestUtil.versionRegExpTest(microServiceInfo.getVersion())) {
285 throw new ExtendedNotSupportedException(
286 "register MicroServiceInfo FAIL:version is not a valid format");
291 if (StringUtils.isNotBlank(microServiceInfo.getUrl().trim())) {
292 if (!RegExpTestUtil.urlRegExpTest(microServiceInfo.getUrl())) {
293 throw new ExtendedNotSupportedException(
294 "register MicroServiceInfo FAIL:url is not a valid format(url must be begin with /)");
300 if (RouteUtil.PROTOCOL_LIST.indexOf(microServiceInfo.getProtocol().trim()) == -1) {
301 throw new ExtendedNotSupportedException(
302 "register MicroServiceInfo FAIL:Protocol is wrong,value range:("
303 + RouteUtil.PROTOCOL_LIST + ")");
311 if (createOrUpdate == false) {
312 //After the first remove added
313 MicroServiceDB.getInstance().deleteMicroService(
314 microServiceInfo.getServiceName(), microServiceInfo.getVersion(),serverPort);
316 //Notify the listeners
317 MicroServiceDB.getInstance().noticeApiListener(microServiceInfo, "DELETE",serverPort);
321 //Save the new record
322 MicroServiceDB.getInstance().saveMicroServiceInfo2Redis(microServiceInfo,serverPort);
323 //Notify the listeners
324 MicroServiceDB.getInstance().noticeApiListener(microServiceInfo, "ADD",serverPort);
328 MicroServiceFullInfo newMicroServiceInfo =
329 MicroServiceDB.getInstance().getMicroServiceInstance(
330 microServiceInfo.getServiceName(), microServiceInfo.getVersion(),serverPort);
334 return newMicroServiceInfo;
336 } catch (ExtendedNotSupportedException e) {
338 } catch (Exception e) {
339 throw new ExtendedInternalServerErrorException(e.getMessage());
345 public synchronized void deleteMicroService(String serviceName, String version) {
346 if("null".equals(version)) {
349 serviceName=serviceName.replace("*", "/");
351 if (StringUtils.isBlank(serviceName)) {
352 throw new ExtendedNotSupportedException(
353 "delete MicroServiceInfo FAIL:serviceName can't be empty");
356 if (StringUtils.isNotBlank(version)) {
357 if (!RegExpTestUtil.versionRegExpTest(version)) {
358 throw new ExtendedNotSupportedException(
359 "delete MicroServiceInfo FAIL:version is not a valid format");
366 MicroServiceFullInfo microServiceInfo =
367 MicroServiceDB.getInstance().getMicroServiceInstance(serviceName, version,"");
369 if (microServiceInfo == null) {
370 LOGGER.warn("serviceName-"+ serviceName + ",version-" + version + " not fond ");
374 MicroServiceDB.getInstance().deleteMicroService(serviceName, version,"");
375 //Notify the listeners
376 MicroServiceDB.getInstance().noticeApiListener(microServiceInfo, "DELETE","");
378 } catch (Exception e) {
379 LOGGER.error("delete MicroServiceInfo throw exception", e);
380 throw new ExtendedInternalServerErrorException(e.getMessage());
384 LOGGER.info("delete MicroServiceInfo success:serviceName-"
385 + serviceName + ",version-" + version );
390 public synchronized void deleteMicroService(String serviceName, String version,String serverPort) {
391 if("null".equals(version)) {
394 serviceName=serviceName.replace("*", "/");
396 if (StringUtils.isBlank(serviceName)) {
397 throw new ExtendedNotSupportedException(
398 "delete MicroServiceInfo FAIL:serviceName can't be empty");
401 if (StringUtils.isNotBlank(version)) {
402 if (!RegExpTestUtil.versionRegExpTest(version)) {
403 throw new ExtendedNotSupportedException(
404 "delete MicroServiceInfo FAIL:version is not a valid format");
411 MicroServiceFullInfo microServiceInfo =
412 MicroServiceDB.getInstance().getMicroServiceInstance(serviceName, version,serverPort);
414 if (microServiceInfo == null) {
415 throw new ExtendedNotFoundException("delete MicroServiceInfo FAIL:serviceName-"
416 + serviceName + ",version-" + version + " not fond ");
419 MicroServiceDB.getInstance().deleteMicroService(serviceName, version,serverPort);
420 //Notify the listeners
421 MicroServiceDB.getInstance().noticeApiListener(microServiceInfo, "DELETE",serverPort);
422 } catch (ExtendedNotFoundException e) {
424 } catch (Exception e) {
425 LOGGER.error("delete MicroServiceInfo throw exception", e);
426 throw new ExtendedInternalServerErrorException(e.getMessage());
430 LOGGER.info("delete MicroServiceInfo success:serviceName-"
431 + serviceName + ",version-" + version );
435 public synchronized void deleteMicroServiceInstance(String serviceName, String version,
436 String ip,String port) {
437 if("null".equals(version)) {
440 serviceName=serviceName.replace("*", "/");
442 if (StringUtils.isBlank(serviceName)) {
443 throw new ExtendedNotSupportedException(
444 "delete MicroServiceInfo FAIL:serviceName can't be empty");
447 if (StringUtils.isNotBlank(version)) {
448 if (!RegExpTestUtil.versionRegExpTest(version)) {
449 throw new ExtendedNotSupportedException(
450 "delete MicroServiceInfo FAIL:version is not a valid format");
454 if (!RegExpTestUtil.ipRegExpTest(ip)) {
455 throw new ExtendedNotSupportedException("delete MicroServiceInfo FAIL:IP(" + ip
456 + ")is not a valid IP address");
459 if (!RegExpTestUtil.portRegExpTest(port)) {
460 throw new ExtendedNotSupportedException("delete MicroServiceInfo FAIL:Port(" + port
461 + ")is not a valid Port address");
466 MicroServiceFullInfo microServiceInfo =
467 MicroServiceDB.getInstance().getMicroServiceInstance(serviceName, version,"");
469 if (microServiceInfo == null) {
470 throw new ExtendedNotFoundException("delete MicroServiceInfo FAIL:serviceName-"
471 + serviceName + ",version-" + version + " not fond ");
474 Set<NodeInfo> nodes = microServiceInfo.getNodes();
476 boolean ifFindBNode = false;
478 for (Node node : nodes) {
479 if (node.getIp().equals(ip) && node.getPort().equals(port)) {
483 if (nodes.isEmpty()) {
484 //delete MicroService
485 MicroServiceDB.getInstance().deleteMicroService(serviceName, version,"");
486 //Notify the listeners
487 MicroServiceDB.getInstance().noticeApiListener(microServiceInfo, "DELETE","");
490 MicroServiceDB.getInstance().deleteNode(serviceName, version, ip,port);
491 MicroServiceDB.getInstance().noticeUpdateApiListener(serviceName, version,microServiceInfo,"");
499 throw new ExtendedNotFoundException("delete MicroServiceInfo FAIL: node-" + ip+":"+port
504 } catch (ExtendedNotFoundException e) {
506 } catch (Exception e) {
507 LOGGER.error("deleteApiRoute throw exception", e);
508 throw new ExtendedInternalServerErrorException(e.getMessage());