Initial code import
[msb/apigateway.git] / apiroute / apiroute-service / src / main / java / org / openo / msb / ApiRouteApp.java
diff --git a/apiroute/apiroute-service/src/main/java/org/openo/msb/ApiRouteApp.java b/apiroute/apiroute-service/src/main/java/org/openo/msb/ApiRouteApp.java
new file mode 100644 (file)
index 0000000..0e0860d
--- /dev/null
@@ -0,0 +1,550 @@
+/**\r
+* Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)\r
+*\r
+* Licensed under the Apache License, Version 2.0 (the "License");\r
+* you may not use this file except in compliance with the License.\r
+* You may obtain a copy of the License at\r
+*\r
+* http://www.apache.org/licenses/LICENSE-2.0\r
+*\r
+* Unless required by applicable law or agreed to in writing, software\r
+* distributed under the License is distributed on an "AS IS" BASIS,\r
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+* See the License for the specific language governing permissions and\r
+* limitations under the License.\r
+*/\r
+\r
+package org.openo.msb;\r
+\r
+import io.dropwizard.Application;\r
+import io.dropwizard.assets.AssetsBundle;\r
+import io.dropwizard.jetty.HttpConnectorFactory;\r
+import io.dropwizard.server.SimpleServerFactory;\r
+import io.dropwizard.setup.Bootstrap;\r
+import io.dropwizard.setup.Environment;\r
+import io.swagger.jaxrs.config.BeanConfig;\r
+import io.swagger.jaxrs.listing.ApiListingResource;\r
+\r
+import java.io.BufferedWriter;\r
+import java.io.File;\r
+import java.io.FileNotFoundException;\r
+import java.io.FileWriter;\r
+import java.io.IOException;\r
+import java.net.URL;\r
+import java.util.List;\r
+\r
+import net.sf.json.JSONObject;\r
+\r
+import org.apache.commons.lang3.StringUtils;\r
+import org.openo.msb.api.ApiRouteInfo;\r
+import org.openo.msb.api.ConsulInfo;\r
+import org.openo.msb.api.CustomRouteInfo;\r
+import org.openo.msb.api.DiscoverInfo;\r
+import org.openo.msb.api.IuiRouteInfo;\r
+import org.openo.msb.api.RouteServer;\r
+import org.openo.msb.api.exception.ExtendedNotFoundException;\r
+import org.openo.msb.health.ApiRouteHealthCheck;\r
+import org.openo.msb.resources.ApiRouteResource;\r
+import org.openo.msb.resources.CustomRouteResource;\r
+import org.openo.msb.resources.IuiRouteResource;\r
+import org.openo.msb.resources.MetricsResource;\r
+import org.openo.msb.resources.MicroServiceResource;\r
+import org.openo.msb.resources.ServiceAccessResource;\r
+import org.openo.msb.wrapper.ApiRouteServiceWrapper;\r
+import org.openo.msb.wrapper.CustomRouteServiceWrapper;\r
+import org.openo.msb.wrapper.IuiRouteServiceWrapper;\r
+import org.openo.msb.wrapper.serviceListener.MicroServiceChangeListener;\r
+import org.openo.msb.wrapper.util.FileUtil;\r
+import org.openo.msb.wrapper.util.JacksonJsonUtil;\r
+import org.openo.msb.wrapper.util.JedisUtil;\r
+import org.openo.msb.wrapper.util.MetricsUtil;\r
+import org.openo.msb.wrapper.util.MicroServiceDB;\r
+import org.openo.msb.wrapper.util.RegExpTestUtil;\r
+import org.openo.msb.wrapper.util.RouteUtil;\r
+import org.slf4j.Logger;\r
+import org.slf4j.LoggerFactory;\r
+\r
+import com.fasterxml.jackson.annotation.JsonInclude;\r
+\r
+public class ApiRouteApp extends Application<ApiRouteAppConfig> {\r
+\r
+    private static final Logger LOGGER = LoggerFactory.getLogger(ApiRouteApp.class);\r
+\r
+    public static void main(String[] args) throws Exception {\r
+        new ApiRouteApp().run(args);\r
+\r
+    }\r
+\r
+    private ApiRouteAppConfig config;\r
+\r
+    @Override\r
+    public String getName() {\r
+        return " MicroService Bus ";\r
+    }\r
+\r
+    @Override\r
+    public void initialize(Bootstrap<ApiRouteAppConfig> bootstrap) {\r
+        \r
+        \r
+    }\r
+\r
+    @Override\r
+    public void run(ApiRouteAppConfig configuration, Environment environment) {\r
+        \r
+        initRootPath();\r
+        \r
+      \r
+        new AssetsBundle("/iui-metrics", "/"+RouteUtil.IUI_ROOT_PATH+"/microservices/metrics",\r
+            "index.html", "iui-metrics").run(environment); \r
+        \r
+        new AssetsBundle("/iui-route",  "/"+RouteUtil.IUI_ROOT_PATH+"/microservices", "index.html",\r
+                "iui-microservices").run(environment); \r
+        \r
+        new AssetsBundle("/api-doc",  "/"+RouteUtil.IUI_ROOT_PATH+"/microservices/api-doc",\r
+            "index.html", "api-doc").run(environment);\r
+        \r
+        new AssetsBundle("/ext",  "/"+RouteUtil.IUI_ROOT_PATH+"/microservices/ext",\r
+            "index.html", "ext").run(environment);\r
+        \r
+        \r
+        \r
+\r
+        final ApiRouteHealthCheck healthCheck =\r
+                new ApiRouteHealthCheck(configuration.getDefaultWorkspace());\r
+        environment.healthChecks().register("template", healthCheck);\r
+        environment.jersey().register(new ApiRouteResource());\r
+        environment.jersey().register(new IuiRouteResource());\r
+        environment.jersey().register(new MetricsResource());\r
+        environment.jersey().register(new CustomRouteResource());\r
+        environment.jersey().register(new ServiceAccessResource());\r
+        environment.jersey().register(new MicroServiceResource());\r
+\r
+        config = configuration;\r
+\r
+        initSwaggerConfig(environment, configuration);\r
+        initRedisConfig(configuration);\r
+        checkRedisConnect();\r
+        initMetricsConfig(configuration);\r
+        initVisualRangeMatches();\r
+\r
+        registerServiceChangeListener();\r
+\r
+\r
+    }\r
+\r
+    private void initMetricsConfig(ApiRouteAppConfig configuration) {\r
+\r
+        SimpleServerFactory simpleServerFactory =\r
+                (SimpleServerFactory) configuration.getServerFactory();\r
+        HttpConnectorFactory httpConnectorFactory =\r
+                (HttpConnectorFactory) simpleServerFactory.getConnector();\r
+        MetricsUtil.adminContextPath =\r
+                "http://127.0.0.1:" + httpConnectorFactory.getPort()\r
+                        + simpleServerFactory.getAdminContextPath() + "/metrics";\r
+    }\r
+\r
+    private void initSwaggerConfig(Environment environment, ApiRouteAppConfig configuration) {\r
+\r
+        environment.jersey().register(new ApiListingResource());\r
+        environment.getObjectMapper().setSerializationInclusion(JsonInclude.Include.NON_NULL);\r
+\r
+        BeanConfig config = new BeanConfig();\r
+        config.setTitle("MicroService Bus rest API");\r
+        config.setVersion("1.0.0");\r
+        config.setResourcePackage("org.openo.msb.resources");\r
+        SimpleServerFactory simpleServerFactory =\r
+                (SimpleServerFactory) configuration.getServerFactory();\r
+        String basePath = simpleServerFactory.getApplicationContextPath();\r
+        String rootPath = simpleServerFactory.getJerseyRootPath();\r
+\r
+        rootPath = rootPath.substring(0, rootPath.indexOf("/*"));\r
+\r
+        basePath =\r
+                basePath.equals("/") ? rootPath : (new StringBuilder()).append(basePath)\r
+                        .append(rootPath).toString();\r
+\r
+        LOGGER.info("getApplicationContextPath: " + basePath);\r
+        config.setBasePath(basePath);\r
+        config.setScan(true);\r
+    }\r
+    \r
+    \r
+    private void initRootPath(){\r
+        try {\r
+            \r
+            URL urlRootPath = ApiRouteApp.class.getResource("/ext/initUrlRootPath/initUrlRootPath.json");\r
+            if (urlRootPath != null) {\r
+                String path = urlRootPath.getPath();\r
+    \r
+                LOGGER.info("read initUrlRootPath:" + path);\r
+              \r
+                String fileContent = FileUtil.readFile(path);\r
+                JSONObject jsonObj = JSONObject.fromObject(fileContent);\r
+                RouteUtil.IUI_ROOT_PATH=jsonObj.get("iuiRootPath").toString();\r
+                RouteUtil.API_ROOT_PATH=jsonObj.get("apiRootPath").toString();\r
+                }\r
+        } catch (Exception e) {\r
+            // TODO Auto-generated catch block\r
+            LOGGER.error("read  initUrlRootPath Files throw exception", e);\r
+        }\r
+        \r
+    }\r
+    private void initRedisConfig(ApiRouteAppConfig configuration) {\r
+\r
+        String path = this.getClass().getProtectionDomain().getCodeSource().getLocation().getPath();\r
+        String jarPath = path.substring(0, path.lastIndexOf("/"));\r
+\r
+        LOGGER.info("jarpath: " + jarPath);\r
+        LOGGER.info("getDefaultWorkspace " + configuration.getDefaultWorkspace());\r
+\r
+        String confDir =\r
+                jarPath + "/" + configuration.getDefaultWorkspace() + "/"\r
+                        + configuration.getPropertiesDir();\r
+        String propertiesPath = confDir + "/" + configuration.getPropertiesName();\r
+\r
+        JedisUtil.propertiesPath = propertiesPath;\r
+\r
+        LOGGER.info("propertiesPath: " + propertiesPath);\r
+        LOGGER.info("confDir: " + confDir);\r
+\r
+        try {\r
+            File dirFile = new File(confDir);\r
+\r
+            if (!dirFile.exists()) {\r
+                dirFile.mkdirs();\r
+            }\r
+        } catch (Exception e) {\r
+            // TODO Auto-generated catch block\r
+            LOGGER.info("create RedisConfig confDir error: " + confDir + e.getMessage());\r
+        }\r
+\r
+\r
+        try {\r
+            File propertiesFile = new File(propertiesPath);\r
+            if (!propertiesFile.exists()) {\r
+\r
+\r
+                propertiesFile.createNewFile();\r
+\r
+                BufferedWriter output = new BufferedWriter(new FileWriter(propertiesFile));\r
+                StringBuilder contentBuilder = new StringBuilder();\r
+                contentBuilder.append("redis.host=127.0.0.1\n").append("redis.port=6379\n")\r
+                        .append("#connectionTimeout\n").append("redis.connectionTimeout=2000\n")\r
+                        .append("#redis dbIndex,defaule:0\n")\r
+                        .append("redis.db_index=0\n\n")\r
+                        .append("#--------------redis pool config--------------\n")\r
+                        .append("#maxTotal\n").append("redis.pool.maxTotal=100\n")\r
+                        .append("#maxIdle\n").append("redis.pool.maxIdle=20\n")\r
+                        .append("#maxWaitMillis:ms\n")\r
+                        .append("redis.pool.maxWaitMillis=1000\n")\r
+                        .append("#testOnBorrow\n")\r
+                        .append("redis.pool.testOnBorrow=false\n")\r
+                        .append("#testOnReturn\n")\r
+                        .append("redis.pool.testOnReturn=true\n")\r
+                        .append("#nginx Port\n").append("server.port=10080\n");\r
+\r
+                output.write(contentBuilder.toString());\r
+                output.close();\r
+\r
+            }\r
+        } catch (IOException e) {\r
+            // TODO Auto-generated catch block\r
+            LOGGER.info("create RedisConfig File error: " + propertiesPath + e.getMessage());\r
+        }\r
+    }\r
+\r
+\r
+    private void checkRedisConnect() {\r
+\r
+        new Thread(new Runnable() {\r
+            public void run() {\r
+                int n = 0;\r
+                while (true) {\r
+                    if (ApiRouteServiceWrapper.checkRedisConnect() == false) {\r
+                        n++;\r
+                        System.out.println(n\r
+                                + "/10 : Initial Route Configuration——redis connection fail...");\r
+\r
+                        try {\r
+                            Thread.sleep(10000);\r
+                        } catch (InterruptedException e) {\r
+                            LOGGER.error("Thread.sleep throw except:"+e.getMessage());\r
+                        }\r
+\r
+\r
+                        if (n >= 10) {\r
+                            System.out.println("Initial Route Configuration fail,timeout exit");\r
+                            LOGGER.error("Initial Route Configuration——redis connection fail,timeout exit...");\r
+                            break;\r
+                        }\r
+                    } else {\r
+                        System.out.println("starting to initial Route Configuration");\r
+                        // initRouteInfoFromConfig();\r
+                        initRouteInfoFromJson();\r
+                        System.out.println("starting to initial consul Configuration");\r
+                        runConsulClientApp();\r
+\r
+                        break;\r
+                    }\r
+                }\r
+\r
+            }\r
+        }).start();\r
+    }\r
+\r
+\r
+    \r
+\r
+    /**\r
+     * @Title: initVisualRangeMatches\r
+     * @Description: TODO(According to the environment variable or a JSON file configuration initialization VisualRange filter conditions)\r
+     * @return: void\r
+     */\r
+    private void initVisualRangeMatches(){\r
+        try {\r
+            if(System.getenv("APIGATEWAY_VISUAL_RANGE")==null)\r
+            {\r
+            \r
+            URL visualRangePath = ApiRouteApp.class.getResource("/ext/initVisualRange/initVisualRangeMatches.json");\r
+            if (visualRangePath != null) {\r
+                String path = visualRangePath.getPath();\r
+    \r
+                LOGGER.info("read initVisualRangeMatches:" + path);\r
+              \r
+                String fileContent = FileUtil.readFile(path);\r
+                JSONObject jsonObj = JSONObject.fromObject(fileContent);\r
+                String visualRangeArray=jsonObj.get("visualRange").toString();\r
+                \r
+            \r
+                RouteUtil.visualRangeMatches=StringUtils.split(visualRangeArray, ",");  \r
+             \r
+                \r
+               \r
+                }\r
+            }\r
+            else{\r
+                RouteUtil.visualRangeMatches=StringUtils.split(System.getenv("APIGATEWAY_VISUAL_RANGE"), ",");\r
+            }\r
+        } catch (Exception e) {\r
+            // TODO Auto-generated catch block\r
+            LOGGER.error("read  initVisualRangeMatches Files or env(APIGATEWAY_VISUAL_RANGE) throw exception", e);\r
+        }\r
+    }\r
+\r
+    /**\r
+     * @Title: initRouteInfoFromJson\r
+     * @Description: TODO(按照JSON文件配置初始化route数据)\r
+     * @return: void\r
+     */\r
+    private void initRouteInfoFromJson() {\r
+\r
+        URL apiDocsPath = ApiRouteApp.class.getResource("/ext/initServices");\r
+        if (apiDocsPath != null) {\r
+            String path = apiDocsPath.getPath();\r
+\r
+            LOGGER.info("read JsonFilefolder:" + path);\r
+\r
+            try {\r
+                File[] files = FileUtil.readFileFolder(path);\r
+                for (int i = 0; i < files.length; i++) {\r
+                    File file = files[i];\r
+                    if (file.isFile() && file.getName().endsWith(".json")) {\r
+                        LOGGER.info("read JsonFile:" + file.getPath());\r
+                        String fileContent = FileUtil.readFile(file.getPath());\r
+                        saveInitService2redis(fileContent);\r
+                    } else {\r
+                        LOGGER.warn(file.getName() + " is not a right file");\r
+                    }\r
+                }\r
+\r
+\r
+\r
+            } catch (FileNotFoundException e) {\r
+                // TODO Auto-generated catch block\r
+                LOGGER.error("read  initServices Files throw FileNotFoundException", e);\r
+            } catch (IOException e) {\r
+                // TODO Auto-generated catch block\r
+                LOGGER.error("read  initServices Files throw IOexception", e);\r
+            }\r
+\r
+        }\r
+\r
+\r
+\r
+    }\r
+\r
+\r
+\r
+    private void saveInitService2redis(String fileContent) {\r
+        try {\r
+            List<ApiRouteInfo> routeList =\r
+                    (List<ApiRouteInfo>) JacksonJsonUtil.jsonToListBean(fileContent);\r
+            for (ApiRouteInfo route : routeList) {\r
+                String url = route.getUrl();\r
+\r
+                if (RegExpTestUtil.urlRegExpTest(route.getServiceName())) {\r
+                    \r
+                    try{\r
+                    CustomRouteInfo dbCustomRoute =\r
+                            CustomRouteServiceWrapper.getInstance().getCustomRouteInstance(\r
+                                    route.getServiceName());\r
+                    }\r
+                    catch(ExtendedNotFoundException e){\r
+\r
+                        LOGGER.info("initCustomRoute: ServiceName--" + route.getServiceName());\r
+\r
+                        CustomRouteInfo customRouteInfo = new CustomRouteInfo();\r
+                        customRouteInfo.setControl(route.getControl());\r
+                        customRouteInfo.setServers(route.getServers());\r
+                        customRouteInfo.setServiceName(route.getServiceName());\r
+                        customRouteInfo.setStatus(route.getStatus());\r
+                        customRouteInfo.setUrl(route.getUrl());\r
+\r
+\r
+                        CustomRouteServiceWrapper.getInstance().saveCustomRouteInstance(\r
+                                customRouteInfo, "");\r
+\r
+\r
+                    }\r
+                } else {\r
+\r
+                    if (RegExpTestUtil.apiRouteUrlRegExpTest(url) || url.startsWith("/api/microservices/")) {\r
+\r
+\r
+                        try{\r
+                        ApiRouteInfo dbApiRoute =\r
+                                ApiRouteServiceWrapper.getInstance().getApiRouteInstance(\r
+                                        route.getServiceName(), route.getVersion());\r
+                        }\r
+                        catch(ExtendedNotFoundException e){\r
+                            LOGGER.info("initapiRoute: ServiceName--" + route.getServiceName());\r
+                            ApiRouteServiceWrapper.getInstance().saveApiRouteInstance(route, "");\r
+                        }\r
+\r
+                       \r
+                    } else if (RegExpTestUtil.iuiRouteUrlRegExpTest(url)  || url.equals("/iui/microservices")) {\r
+                        \r
+                        try{\r
+                        IuiRouteInfo dbIuiRoute =\r
+                                IuiRouteServiceWrapper.getInstance().getIuiRouteInstance(\r
+                                        route.getServiceName());\r
+                        }\r
+                        catch(ExtendedNotFoundException e){\r
+                    \r
+                            LOGGER.info(" initiuiRoute: ServiceName--" + route.getServiceName());\r
+                            IuiRouteInfo iuiRouteInfo = new IuiRouteInfo();\r
+                            iuiRouteInfo.setControl(route.getControl());\r
+                            iuiRouteInfo.setServers(route.getServers());\r
+                            iuiRouteInfo.setServiceName(route.getServiceName());\r
+                            iuiRouteInfo.setStatus(route.getStatus());\r
+                            \r
+                            if(url.equals("/iui/microservices")){\r
+                                iuiRouteInfo.setUrl("/"+RouteUtil.IUI_ROOT_PATH+"/microservices");\r
+                            }\r
+                            else{\r
+                            iuiRouteInfo.setUrl(route.getUrl());\r
+                            }\r
+\r
+                            IuiRouteServiceWrapper.getInstance().saveIuiRouteInstance(iuiRouteInfo);\r
+\r
+                        }\r
+\r
+                    } else {\r
+                        LOGGER.error("init Service throw exception——serviceName: " + route.getServiceName()+",url:"+url);\r
+                    }\r
+                }\r
+\r
+\r
+\r
+            }\r
+\r
+        } catch (Exception e) {\r
+            // TODO Auto-generated catch block\r
+            LOGGER.error("read  initServices Files throw exception", e);\r
+        }\r
+\r
+    }\r
+\r
+\r
+\r
+    /**\r
+     * The listener registration service changes\r
+     */\r
+    private void registerServiceChangeListener() {\r
+        MicroServiceDB.getInstance().addServiceChangeListener(new MicroServiceChangeListener());\r
+    }\r
+\r
+    // Open the consul to monitor subscription service\r
+    private void runConsulClientApp() {\r
+        DiscoverInfo config_discoverInfo = config.getDiscoverInfo();\r
+        \r
+        ConsulInfo config_consulInfo=config.getConsulInfo();\r
+        \r
+        RouteUtil.discoverInfo.setEnabled(config_discoverInfo.isEnabled());        \r
+        \r
+        if (config_discoverInfo.isEnabled()) {\r
+            try{\r
+            if(System.getenv("SDCLIENT_SVC_PORT")==null)\r
+            {\r
+                //yml          \r
+                RouteUtil.discoverInfo.setIp(config_discoverInfo.getIp()); \r
+                RouteUtil.discoverInfo.setPort(config_discoverInfo.getPort());\r
+                \r
+            }\r
+            else{\r
+               \r
+                 String  discoverAddress=System.getenv("SDCLIENT_SVC_PORT").split("//")[1];\r
+                 String sdIP=discoverAddress.split(":")[0];\r
+                 int sdPort=Integer\r
+                         .parseInt(discoverAddress.split(":")[1]);\r
+                 \r
+                 RouteUtil.discoverInfo.setIp(sdIP);\r
+                 RouteUtil.discoverInfo.setPort(sdPort);\r
+                 \r
+                 config_consulInfo.setIp(sdIP);\r
+                 config_consulInfo.setPort(sdPort);\r
+             \r
+                \r
+            }\r
+            \r
+           \r
+               \r
+                //Registration service discovery routing\r
+                //api\r
+                ApiRouteInfo discoverApiService=new ApiRouteInfo();\r
+                discoverApiService.setServiceName("msdiscover");\r
+                discoverApiService.setUrl("/api/microservices/v1");\r
+                discoverApiService.setVersion("v1");\r
+                discoverApiService.setMetricsUrl("/admin/metrics");\r
+                discoverApiService.setApiJson("/api/microservices/v1/swagger.json");\r
+                \r
+                RouteServer[] servers=new RouteServer[1];\r
+                servers[0]=new RouteServer(RouteUtil.discoverInfo.getIp(),String.valueOf(RouteUtil.discoverInfo.getPort()));\r
+                discoverApiService.setServers(servers);\r
+             \r
+                ApiRouteServiceWrapper.getInstance().saveApiRouteInstance(discoverApiService, "");\r
+               \r
+                //iui\r
+                IuiRouteInfo discoverIUIService=new IuiRouteInfo();\r
+                discoverIUIService.setServiceName("msdiscover");\r
+                discoverIUIService.setUrl("/iui/microservices");\r
+                discoverIUIService.setServers(servers);\r
+                IuiRouteServiceWrapper.getInstance().saveIuiRouteInstance(discoverIUIService);\r
+                \r
+               \r
+\r
+            ConsulClientApp consulClientApp = new ConsulClientApp(config_consulInfo.getIp(), config_consulInfo.getPort());\r
+            // Monitor service change\r
+            consulClientApp.startServiceListen();\r
+            LOGGER.info("start monitor consul service--" +config_consulInfo.getIp() + ":"\r
+                    + config_consulInfo.getPort());\r
+            }\r
+            catch(Exception e){\r
+                LOGGER.error("start monitor consul service fail:"+e.getMessage()); \r
+            }\r
+        }\r
+        \r
+       \r
+    }\r
+\r
+}\r