1 package org.onap.msb.apiroute.wrapper;
3 import io.dropwizard.jetty.HttpConnectorFactory;
4 import io.dropwizard.server.SimpleServerFactory;
6 import java.io.BufferedWriter;
8 import java.io.FileNotFoundException;
9 import java.io.FileOutputStream;
10 import java.io.IOException;
11 import java.io.OutputStreamWriter;
13 import java.util.List;
15 import org.apache.commons.lang3.StringUtils;
16 import org.onap.msb.apiroute.ApiRouteApp;
17 import org.onap.msb.apiroute.ApiRouteAppConfig;
18 import org.onap.msb.apiroute.SyncDataManager;
19 import org.onap.msb.apiroute.api.ApiRouteInfo;
20 import org.onap.msb.apiroute.api.CustomRouteInfo;
21 import org.onap.msb.apiroute.api.DiscoverInfo;
22 import org.onap.msb.apiroute.api.IuiRouteInfo;
23 import org.onap.msb.apiroute.api.RouteServer;
24 import org.onap.msb.apiroute.api.exception.ExtendedNotFoundException;
25 import org.onap.msb.apiroute.health.ConsulLinkHealthCheck;
26 import org.onap.msb.apiroute.health.RedisHealthCheck;
27 import org.onap.msb.apiroute.wrapper.serviceListener.MicroServiceChangeListener;
28 import org.onap.msb.apiroute.wrapper.serviceListener.RouteNotify;
29 import org.onap.msb.apiroute.wrapper.util.ConfigUtil;
30 import org.onap.msb.apiroute.wrapper.util.FileUtil;
31 import org.onap.msb.apiroute.wrapper.util.JacksonJsonUtil;
32 import org.onap.msb.apiroute.wrapper.util.JedisUtil;
33 import org.onap.msb.apiroute.wrapper.util.RegExpTestUtil;
34 import org.onap.msb.apiroute.wrapper.util.RouteUtil;
35 import org.slf4j.Logger;
36 import org.slf4j.LoggerFactory;
38 import redis.clients.jedis.Jedis;
40 import com.fasterxml.jackson.core.type.TypeReference;
42 public class InitRouteServiceWrapper {
44 private static final Logger LOGGER = LoggerFactory.getLogger(InitRouteServiceWrapper.class);
47 private static InitRouteServiceWrapper instance = new InitRouteServiceWrapper();
49 private InitRouteServiceWrapper() {}
51 public static InitRouteServiceWrapper getInstance() {
57 * The listener registration service changes
59 public void registerServiceChangeListener() {
61 RouteNotify.getInstance().addServiceChangeListener(new MicroServiceChangeListener());
65 public void initFilterConfig(){
67 ConfigUtil.getInstance().initRouteWay();
68 ConfigUtil.getInstance().initApiGatewayPort();
69 ConfigUtil.getInstance().initRouteNameSpaceMatches();
70 ConfigUtil.getInstance().initRouteLabelsMatches();
71 ConfigUtil.getInstance().initNodeMetaQueryParam();
75 public void initDataSynchro(){
77 registerServiceChangeListener();
79 boolean ifRedisConnect=startCheckRedisConnect();
82 initRouteInfoFromJson();
87 public void initHealthCheck()
89 LOGGER.info("start check consul link thread");
90 Thread tConsul= new Thread(new ConsulLinkHealthCheck(),"_healthcheck_consul_");
91 tConsul.setDaemon(true);
94 LOGGER.info("start check redis thread");
95 Thread tRedies= new Thread(new RedisHealthCheck(),"_healthcheck_redis_");
96 tRedies.setDaemon(true);
103 public boolean startCheckRedisConnect() {
107 if (!checkRedisConnect()) {
109 LOGGER.warn(n + "/10 : Initial Route Configuration——redis connection fail...");
113 } catch (InterruptedException e) {
114 LOGGER.error("Thread.sleep throw except:" + e.getMessage());
119 LOGGER.error("Initial Route Configuration——redis connection fail,timeout exit...");
123 LOGGER.warn(" Initial Route Configuration——redis connection success...");
132 // Open the consul to monitor subscription service
133 public void runConsulClientApp() {
137 String consulConfSource="Default";
140 DiscoverInfo discoverInfo = ConfigUtil.getInstance().getDiscoverInfo();
142 if (discoverInfo.isEnabled()) {
143 LOGGER.warn("starting to initial consul Configuration");
144 String[] routeWay = ConfigUtil.getInstance().getRouteWay();
146 String sys_consulIp=ConfigUtil.getInstance().getConsul_ip();
147 if (StringUtils.isNotBlank(sys_consulIp)) {
148 consulIP = sys_consulIp.trim();
149 consulPort = RouteUtil.consulDeafultPort;
150 consulConfSource="env:CONSUL_IP";
152 consulIP = discoverInfo.getIp();
153 consulPort = discoverInfo.getPort();
154 consulConfSource="init discoverInfo";
157 LOGGER.warn("init consul sync Address from [ "+consulConfSource+" ]:" + consulIP + ":" + consulPort);
159 // Registration service discovery routing
161 ApiRouteInfo discoverApiService = new ApiRouteInfo();
162 discoverApiService.setServiceName("msdiscover");
163 discoverApiService.setUrl("/api/microservices/v1");
164 discoverApiService.setVersion("v1");
165 discoverApiService.setMetricsUrl("/admin/metrics");
166 discoverApiService.setApiJson("/api/microservices/v1/swagger.json");
167 discoverApiService.setHost("msb");
169 RouteServer[] servers = new RouteServer[1];
170 servers[0] = new RouteServer(discoverInfo.getIp(), String.valueOf(discoverInfo.getPort()));
171 discoverApiService.setServers(servers);
174 for (int i = 0; i < routeWay.length; i++) {
175 ApiRouteServiceWrapper.getInstance().saveApiRouteInstance4Rest(discoverApiService,
182 IuiRouteInfo discoverIUIService = new IuiRouteInfo();
183 discoverIUIService.setServiceName("msdiscover");
184 discoverIUIService.setUrl("/iui/microservices");
185 discoverIUIService.setHost("msb");
186 discoverIUIService.setServers(servers);
188 for (int i = 0; i < routeWay.length; i++) {
189 IuiRouteServiceWrapper.getInstance()
190 .saveIuiRouteInstance(discoverIUIService, routeWay[i]);
195 * ConsulClientApp consulClientApp = new ConsulClientApp(consulIP, consulPort);
196 * consulClientApp.startServiceListen();
199 // SyncDataManager syncDataManager = new SyncDataManager();
200 // Monitor serviceList change
201 SyncDataManager.initSyncTask(consulIP, consulPort);
204 LOGGER.warn("start monitor consul service--" + consulIP + ":" + consulPort);
205 } catch (Exception e) {
206 LOGGER.error("start monitor consul service fail:" + e.getMessage());
217 * @Title: initRouteInfoFromJson
218 * @Description: TODO(According to the JSON file configuration initialization route data)
221 public void initRouteInfoFromJson() {
222 LOGGER.info("starting to initial Route Configuration");
223 URL apiDocsPath = InitRouteServiceWrapper.class.getResource("/ext/initServices");
224 if (apiDocsPath != null) {
225 String path = apiDocsPath.getPath();
227 LOGGER.info("read JsonFilefolder:" + path);
230 File[] files = FileUtil.readFileFolder(path);
231 for (int i = 0; i < files.length; i++) {
232 File file = files[i];
233 if (file.isFile() && file.getName().endsWith(".json")) {
234 LOGGER.info("read JsonFile:" + file.getPath());
235 String fileContent = FileUtil.readFile(file.getPath());
236 saveInitService2redis(fileContent);
238 LOGGER.warn(file.getName() + " is not a right file");
244 } catch (FileNotFoundException e) {
245 // TODO Auto-generated catch block
246 LOGGER.error("read initServices Files throw FileNotFoundException", e);
247 } catch (IOException e) {
248 // TODO Auto-generated catch block
249 LOGGER.error("read initServices Files throw IOexception", e);
260 private void saveInitService2redis(String fileContent) {
262 String[] routeWay = ConfigUtil.getInstance().getRouteWay();
263 String iuiRootPath = ConfigUtil.getInstance().getIUI_ROOT_PATH();
266 List<ApiRouteInfo> routeList =
267 JacksonJsonUtil.jsonToListBean(fileContent, new TypeReference<List<ApiRouteInfo>>() {});
268 for (ApiRouteInfo route : routeList) {
269 String url = route.getUrl();
271 if (RegExpTestUtil.urlRegExpTest(route.getServiceName())) {
273 for (int i = 0; i < routeWay.length; i++) {
276 CustomRouteServiceWrapper.getInstance().getCustomRouteInstance(
277 route.getServiceName(), route.getHost(), "", routeWay[i]);
279 } catch (ExtendedNotFoundException e) {
281 LOGGER.info("initCustomRoute: ServiceName--" + route.getServiceName());
283 CustomRouteInfo customRouteInfo = new CustomRouteInfo();
284 customRouteInfo.setControl(route.getControl());
285 customRouteInfo.setServers(route.getServers());
286 customRouteInfo.setServiceName(route.getServiceName());
287 customRouteInfo.setStatus(route.getStatus());
288 customRouteInfo.setUrl(route.getUrl());
289 customRouteInfo.setHost(route.getHost());
293 CustomRouteServiceWrapper.getInstance().saveCustomRouteInstance(customRouteInfo,
300 if (RegExpTestUtil.apiRouteUrlRegExpTest(url) || url.startsWith("/api/microservices/") || url.startsWith("/admin/microservices/")) {
302 for (int i = 0; i < routeWay.length; i++) {
305 ApiRouteServiceWrapper.getInstance().getApiRouteInstance(route.getServiceName(),
306 route.getVersion(), route.getHost(), route.getPublish_port(), routeWay[i]);
308 } catch (ExtendedNotFoundException e) {
309 LOGGER.info("initapiRoute: ServiceName--" + route.getServiceName());
311 if (url.startsWith("/api/microservices")) {
312 if (StringUtils.isNotBlank(System.getenv("dwApp_server_connector_port"))) {
313 replaceApigatewayPort(route.getServers(),
314 System.getenv("dwApp_server_connector_port"));
318 if (url.startsWith("/admin/microservices")) {
319 replaceApigatewayPort(route.getServers(),ConfigUtil.getInstance().getServerPort());
322 ApiRouteServiceWrapper.getInstance().saveApiRouteInstance4Rest(route, routeWay[i]);
328 } else if (RegExpTestUtil.iuiRouteUrlRegExpTest(url) || url.equals("/iui/microservices")) {
330 for (int i = 0; i < routeWay.length; i++) {
333 IuiRouteServiceWrapper.getInstance().getIuiRouteInstance(route.getServiceName(),
334 route.getHost(), "", routeWay[i]);
336 } catch (ExtendedNotFoundException e) {
338 LOGGER.info(" initiuiRoute: ServiceName--" + route.getServiceName());
339 IuiRouteInfo iuiRouteInfo = new IuiRouteInfo();
340 iuiRouteInfo.setControl(route.getControl());
341 iuiRouteInfo.setServers(route.getServers());
342 iuiRouteInfo.setServiceName(route.getServiceName());
343 iuiRouteInfo.setStatus(route.getStatus());
344 iuiRouteInfo.setHost(route.getHost());
347 if (url.equals("/iui/microservices")) {
348 iuiRouteInfo.setUrl("/" + iuiRootPath + "/microservices");
349 if (StringUtils.isNotBlank(System.getenv("dwApp_server_connector_port"))) {
350 replaceApigatewayPort(iuiRouteInfo.getServers(),
351 System.getenv("dwApp_server_connector_port"));
354 iuiRouteInfo.setUrl(route.getUrl());
357 IuiRouteServiceWrapper.getInstance()
358 .saveIuiRouteInstance(iuiRouteInfo, routeWay[i]);
365 LOGGER.error("init Service throw exception——serviceName: " + route.getServiceName()
374 } catch (Exception e) {
375 // TODO Auto-generated catch block
376 LOGGER.error("read initServices Files throw exception", e);
381 private void replaceApigatewayPort(RouteServer[] servers, String apigatewayPort) {
382 for (int i = 0; i < servers.length; i++) {
383 servers[i].setPort(apigatewayPort);
387 public void initMetricsConfig(ApiRouteAppConfig configuration) {
389 SimpleServerFactory simpleServerFactory =
390 (SimpleServerFactory) configuration.getServerFactory();
391 HttpConnectorFactory httpConnectorFactory =
392 (HttpConnectorFactory) simpleServerFactory.getConnector();
394 "http://127.0.0.1:" + httpConnectorFactory.getPort()
395 + simpleServerFactory.getAdminContextPath() + "/metrics";
396 ConfigUtil.getInstance().setMetricsUrl(metricsUrl);
400 private boolean checkRedisConnect() {
403 jedis = JedisUtil.borrowJedisInstance();
405 } catch (Exception e) {
406 LOGGER.error("checkRedisConnect call redis throw exception", e);
408 JedisUtil.returnJedisInstance(jedis);