2 * Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
\r
4 * Licensed under the Apache License, Version 2.0 (the "License");
\r
5 * you may not use this file except in compliance with the License.
\r
6 * You may obtain a copy of the License at
\r
8 * http://www.apache.org/licenses/LICENSE-2.0
\r
10 * Unless required by applicable law or agreed to in writing, software
\r
11 * distributed under the License is distributed on an "AS IS" BASIS,
\r
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
\r
13 * See the License for the specific language governing permissions and
\r
14 * limitations under the License.
\r
16 package org.openo.msb.wrapper;
\r
18 import java.util.HashMap;
\r
19 import java.util.Map;
\r
20 import java.util.Set;
\r
22 import org.apache.commons.lang3.StringUtils;
\r
23 import org.openo.msb.api.IuiRouteInfo;
\r
24 import org.openo.msb.api.RouteServer;
\r
25 import org.openo.msb.api.exception.ExtendedInternalServerErrorException;
\r
26 import org.openo.msb.api.exception.ExtendedNotFoundException;
\r
27 import org.openo.msb.api.exception.ExtendedNotSupportedException;
\r
28 import org.openo.msb.wrapper.util.JedisUtil;
\r
29 import org.openo.msb.wrapper.util.RegExpTestUtil;
\r
30 import org.openo.msb.wrapper.util.RouteUtil;
\r
31 import org.slf4j.Logger;
\r
32 import org.slf4j.LoggerFactory;
\r
34 import redis.clients.jedis.Jedis;
\r
36 public class IuiRouteServiceWrapper {
\r
39 private static final Logger LOGGER = LoggerFactory.getLogger(IuiRouteServiceWrapper.class);
\r
41 private static IuiRouteServiceWrapper instance = new IuiRouteServiceWrapper();
\r
43 private IuiRouteServiceWrapper() {}
\r
45 public static IuiRouteServiceWrapper getInstance() {
\r
51 * @Title: getAllIuiRouteService
\r
52 * @Description: TODO(获取全部内容服务列表)
\r
54 * @return: IuiRouteInfo[]
\r
56 public IuiRouteInfo[] getAllIuiRouteInstances() {
\r
60 IuiRouteInfo[] iuiRouteList = null;
\r
62 jedis = JedisUtil.borrowJedisInstance();
\r
63 if (jedis == null) {
\r
64 throw new ExtendedInternalServerErrorException(
\r
65 "fetch from jedis pool failed,null object!");
\r
71 .getPrefixedKey("", RouteUtil.IUIROUTE, "*", RouteUtil.ROUTE_PATH_INFO);
\r
72 Set<String> routeSet = jedis.keys(routekey);
\r
73 iuiRouteList = new IuiRouteInfo[routeSet.size()];
\r
76 for (String routePath : routeSet) {
\r
77 String[] routePathArray = routePath.split(":");
\r
78 IuiRouteInfo iuiRoute = getIuiRouteInstance(routePathArray[3], jedis);
\r
79 iuiRouteList[i] = iuiRoute;
\r
84 } catch (Exception e) {
\r
85 LOGGER.error("call redis throw exception", e);
\r
86 throw new ExtendedInternalServerErrorException("call redis throw exception:"
\r
89 JedisUtil.returnJedisInstance(jedis);
\r
92 return iuiRouteList;
\r
98 * @Title: getIuiRouteInstance
\r
99 * @Description: TODO(通过服务名获取单个内容服务对象信息)
\r
100 * @param: @param serviceName
\r
102 * @return: IuiRouteInfo
\r
104 public IuiRouteInfo getIuiRouteInstance(String serviceName) {
\r
106 if (StringUtils.isBlank(serviceName)) {
\r
107 throw new ExtendedNotSupportedException("serviceName can't be empty");
\r
110 IuiRouteInfo iuiRouteInfo = null;
\r
112 Jedis jedis = null;
\r
114 jedis = JedisUtil.borrowJedisInstance();
\r
115 if (jedis == null) {
\r
116 throw new ExtendedInternalServerErrorException(
\r
117 "fetch from jedis pool failed,null object!");
\r
120 iuiRouteInfo = getIuiRouteInstance(serviceName, jedis);
\r
123 } catch (Exception e) {
\r
124 LOGGER.error("call redis throw exception", e);
\r
125 throw new ExtendedInternalServerErrorException("call redis throw exception:"
\r
128 JedisUtil.returnJedisInstance(jedis);
\r
131 if (null == iuiRouteInfo) {
\r
132 String errInfo = "iuiRouteInfo not found: serviceName-" + serviceName;
\r
133 LOGGER.warn(errInfo);
\r
134 throw new ExtendedNotFoundException(errInfo);
\r
138 return iuiRouteInfo;
\r
142 public IuiRouteInfo getIuiRouteInstance(String serviceName, Jedis jedis) throws Exception {
\r
145 IuiRouteInfo iuiRouteInfo = null;
\r
150 RouteUtil.getPrefixedKey("", RouteUtil.IUIROUTE, serviceName,
\r
151 RouteUtil.ROUTE_PATH_INFO);
\r
152 Map<String, String> infomap = jedis.hgetAll(routekey);
\r
153 if (!infomap.isEmpty()) {
\r
154 iuiRouteInfo = new IuiRouteInfo();
\r
155 iuiRouteInfo.setServiceName(serviceName);
\r
156 iuiRouteInfo.setUrl(infomap.get("url"));
\r
157 iuiRouteInfo.setControl(infomap.get("control"));
\r
158 iuiRouteInfo.setStatus(infomap.get("status"));
\r
159 iuiRouteInfo.setVisualRange(infomap.get("visualRange"));
\r
160 iuiRouteInfo.setUseOwnUpstream(infomap.get("useOwnUpstream"));
\r
164 String serviceLBkey =
\r
165 RouteUtil.getPrefixedKey("", RouteUtil.IUIROUTE, serviceName,
\r
166 RouteUtil.ROUTE_PATH_LOADBALANCE);
\r
167 Set<String> serviceLBset = jedis.keys(serviceLBkey + ":*");
\r
168 int serverNum = serviceLBset.size();
\r
169 RouteServer[] iuiRouteServerList = new RouteServer[serverNum];
\r
171 for (String serviceInfo : serviceLBset) {
\r
172 Map<String, String> serviceLBmap = jedis.hgetAll(serviceInfo);
\r
173 RouteServer server = new RouteServer();
\r
174 server.setIp(serviceLBmap.get("ip"));
\r
175 server.setPort(serviceLBmap.get("port"));
\r
176 server.setWeight(Integer.parseInt(serviceLBmap.get("weight")));
\r
177 iuiRouteServerList[i] = server;
\r
181 iuiRouteInfo.setServers(iuiRouteServerList);
\r
185 return iuiRouteInfo;
\r
189 * @Title: updateIuiRouteInstance
\r
190 * @Description: TODO(更新单个服务信息)
\r
191 * @param: @param serviceName
\r
192 * @param: @param IuiRouteInfo
\r
194 * @return: IuiRouteInfo
\r
196 public synchronized IuiRouteInfo updateIuiRouteInstance(String serviceName,
\r
197 IuiRouteInfo iuiRouteInfo) {
\r
199 if (StringUtils.isBlank(serviceName)) {
\r
200 throw new ExtendedNotSupportedException("serviceName can't be empty");
\r
204 if (serviceName.equals(iuiRouteInfo.getServiceName())) {
\r
206 deleteIuiRoute(serviceName, RouteUtil.ROUTE_PATH_LOADBALANCE + "*");
\r
209 // 如果已修改服务名,先删除此服务全部已有信息
\r
210 deleteIuiRoute(serviceName, "*");
\r
212 saveIuiRouteInstance(iuiRouteInfo);
\r
214 } catch (ExtendedNotSupportedException e) {
\r
216 } catch (Exception e) {
\r
217 LOGGER.error("updateIuiRoute throw exception", e);
\r
218 throw new ExtendedInternalServerErrorException("update IuiRouteInfo throw exception"
\r
222 return iuiRouteInfo;
\r
227 * @Title updateIuiRouteStatus
\r
228 * @Description TODO(更新单个服务状态)
\r
229 * @param serviceName
\r
232 * @return RouteResult
\r
234 public synchronized IuiRouteInfo updateIuiRouteStatus(String serviceName, String status) {
\r
237 if (StringUtils.isBlank(serviceName)) {
\r
238 throw new ExtendedNotSupportedException("serviceName can't be empty");
\r
241 if (!RouteUtil.contain(RouteUtil.statusRangeMatches, status)) {
\r
242 throw new ExtendedNotSupportedException(
\r
243 "save IuiRouteInfo Status FAIL:status is wrong,value range:("
\r
244 + RouteUtil.show(RouteUtil.statusRangeMatches) + ")");
\r
247 IuiRouteInfo new_iuiRouteInfo = getIuiRouteInstance(serviceName);
\r
250 String serviceInfokey =
\r
251 RouteUtil.getPrefixedKey("", RouteUtil.IUIROUTE, serviceName,
\r
252 RouteUtil.ROUTE_PATH_INFO);
\r
253 Map<String, String> serviceInfoMap = new HashMap<String, String>();
\r
254 serviceInfoMap.put("status", status);
\r
257 Jedis jedis = null;
\r
259 jedis = JedisUtil.borrowJedisInstance();
\r
260 if (jedis == null) {
\r
261 throw new ExtendedInternalServerErrorException(
\r
262 "fetch from jedis pool failed,null object!");
\r
265 jedis.hmset(serviceInfokey, serviceInfoMap);
\r
266 new_iuiRouteInfo.setStatus(status);
\r
268 } catch (Exception e) {
\r
269 LOGGER.error("update IuiRoute status throw exception", e);
\r
270 throw new ExtendedInternalServerErrorException(
\r
271 "update IuiRouteInfo status throw exception" + e.getMessage());
\r
274 JedisUtil.returnJedisInstance(jedis);
\r
277 return new_iuiRouteInfo;
\r
281 * @Title: saveIuiRouteInstance
\r
282 * @Description: TODO(存储单个服务信息)
\r
283 * @param: @param IuiRouteInfo
\r
285 * @return: IuiRouteInfo
\r
287 public synchronized IuiRouteInfo saveIuiRouteInstance(IuiRouteInfo iuiRouteInfo) {
\r
289 if (StringUtils.isBlank(iuiRouteInfo.getServiceName())
\r
290 || iuiRouteInfo.getServers().length == 0) {
\r
291 throw new ExtendedNotSupportedException(
\r
292 "save iuiRouteInfo FAIL: Some required fields are empty");
\r
295 if (StringUtils.isNotBlank(iuiRouteInfo.getUrl())){
\r
296 if (!RegExpTestUtil.urlRegExpTest(iuiRouteInfo.getUrl())) {
\r
297 throw new ExtendedNotSupportedException(
\r
298 "save iuiRouteInfo FAIL:url is not a valid format(url must be begin with /)");
\r
303 if (!RouteUtil.contain(RouteUtil.visualRangeRange, iuiRouteInfo.getVisualRange())) {
\r
304 throw new ExtendedNotSupportedException(
\r
305 "save iuiRouteInfo FAIL:VisualRange is wrong,value range:("
\r
306 + RouteUtil.show(RouteUtil.visualRangeMatches) + ")");
\r
309 if (!RouteUtil.contain(RouteUtil.controlRangeMatches, iuiRouteInfo.getControl())) {
\r
310 throw new ExtendedNotSupportedException(
\r
311 "save iuiRouteInfo FAIL:control is wrong,value range:("
\r
312 + RouteUtil.show(RouteUtil.controlRangeMatches) + ")");
\r
315 if (!RouteUtil.contain(RouteUtil.statusRangeMatches, iuiRouteInfo.getStatus())) {
\r
316 throw new ExtendedNotSupportedException(
\r
317 "save iuiRouteInfo FAIL:status is wrong,value range:("
\r
318 + RouteUtil.show(RouteUtil.statusRangeMatches) + ")");
\r
321 if (!RouteUtil.contain(RouteUtil.useOwnUpstreamRangeMatches, iuiRouteInfo.getUseOwnUpstream())) {
\r
322 throw new ExtendedNotSupportedException(
\r
323 "save apiRouteInfo FAIL:useOwnUpstream is wrong,value range:("
\r
324 + RouteUtil.show(RouteUtil.useOwnUpstreamRangeMatches) + ")");
\r
328 RouteServer[] serverList = iuiRouteInfo.getServers();
\r
329 for (int i = 0; i < serverList.length; i++) {
\r
330 RouteServer server = serverList[i];
\r
331 if (!RegExpTestUtil.ipRegExpTest(server.getIp())) {
\r
332 throw new ExtendedNotSupportedException("save iuiRouteInfo FAIL:IP("
\r
333 + server.getIp() + ")is not a valid ip address");
\r
336 if (!RegExpTestUtil.portRegExpTest(server.getPort())) {
\r
337 throw new ExtendedNotSupportedException("save iuiRouteInfo FAIL:Port("
\r
338 + server.getPort() + ")is not a valid Port address");
\r
344 String serviceInfokey =
\r
345 RouteUtil.getPrefixedKey("", RouteUtil.IUIROUTE, iuiRouteInfo.getServiceName().trim(),
\r
346 RouteUtil.ROUTE_PATH_INFO);
\r
347 Map<String, String> serviceInfoMap = new HashMap<String, String>();
\r
348 serviceInfoMap.put("url", "/".equals(iuiRouteInfo.getUrl().trim()) ? "" : iuiRouteInfo
\r
350 serviceInfoMap.put("control", iuiRouteInfo.getControl());
\r
351 serviceInfoMap.put("status", iuiRouteInfo.getStatus());
\r
352 serviceInfoMap.put("visualRange", iuiRouteInfo.getVisualRange());
\r
353 serviceInfoMap.put("useOwnUpstream", iuiRouteInfo.getUseOwnUpstream());
\r
357 String serviceLBkey =
\r
358 RouteUtil.getPrefixedKey("", RouteUtil.IUIROUTE, iuiRouteInfo.getServiceName(),
\r
359 RouteUtil.ROUTE_PATH_LOADBALANCE);
\r
362 Jedis jedis = null;
\r
364 jedis = JedisUtil.borrowJedisInstance();
\r
365 if (jedis == null) {
\r
366 throw new ExtendedInternalServerErrorException(
\r
367 "fetch from jedis pool failed,null object!");
\r
370 jedis.hmset(serviceInfokey, serviceInfoMap);
\r
373 for (int i = 0; i < serverList.length; i++) {
\r
374 Map<String, String> servermap = new HashMap<String, String>();
\r
375 RouteServer server = serverList[i];
\r
377 servermap.put("ip", server.getIp());
\r
378 servermap.put("port", server.getPort());
\r
379 servermap.put("weight", Integer.toString(server.getWeight()));
\r
381 jedis.hmset(serviceLBkey + ":server" + (i + 1), servermap);
\r
385 } catch (Exception e) {
\r
386 LOGGER.error("call redis throw exception", e);
\r
387 throw new ExtendedInternalServerErrorException("call redis throw exception:"
\r
390 JedisUtil.returnJedisInstance(jedis);;
\r
393 return iuiRouteInfo;
\r
399 * @Title: deleteIuiRoute
\r
400 * @Description: TODO(删除单个服务信息)
\r
401 * @param: @param type
\r
402 * @param: @param serviceName
\r
403 * @param: @param delKey
\r
407 public synchronized void deleteIuiRoute(String serviceName, String delKey) {
\r
409 if (StringUtils.isBlank(serviceName)) {
\r
410 throw new ExtendedNotSupportedException("serviceName can't be empty");
\r
413 Jedis jedis = null;
\r
415 jedis = JedisUtil.borrowJedisInstance();
\r
416 if (jedis == null) {
\r
417 throw new ExtendedInternalServerErrorException(
\r
418 "fetch from jedis pool failed,null object!");
\r
422 String routekey = RouteUtil.getPrefixedKey("", RouteUtil.IUIROUTE, serviceName, delKey);
\r
423 Set<String> infoSet = jedis.keys(routekey);
\r
425 if (infoSet.isEmpty()) {
\r
426 throw new ExtendedNotFoundException("delete IuiRoute FAIL:serviceName-"
\r
427 + serviceName + " not fond ");
\r
430 String[] paths = new String[infoSet.size()];
\r
433 infoSet.toArray(paths);
\r
438 } catch (ExtendedNotFoundException e) {
\r
440 } catch (Exception e) {
\r
441 LOGGER.error("delete IuiRoute throw exception", e);
\r
442 throw new ExtendedInternalServerErrorException("delete IuiRoute throw exception:"
\r
445 JedisUtil.returnJedisInstance(jedis);
\r