Quellcode durchsuchen

添加influxdb和es的数据读取逻辑

aokunsang vor 20 Stunden
Ursprung
Commit
fe2c9dba38

+ 29 - 1
pom.xml

@@ -13,7 +13,6 @@
 
 	<properties>
 		<flink.version>1.15.4</flink.version>
-		<flink-kubernetes-operator.version>1.1.0</flink-kubernetes-operator.version>
 		<scala.binary.version>2.12</scala.binary.version>
 	</properties>
 
@@ -148,6 +147,35 @@
 			<groupId>com.clickhouse</groupId>
 			<artifactId>clickhouse-jdbc</artifactId>
 		</dependency>
+
+		<!-- 新版本elastic-java -->
+		<dependency>
+			<groupId>co.elastic.clients</groupId>
+			<artifactId>elasticsearch-java</artifactId>
+			<version>8.2.3</version>
+		</dependency>
+
+		<dependency>
+			<groupId>jakarta.json</groupId>
+			<artifactId>jakarta.json-api</artifactId>
+			<version>2.0.1</version>
+		</dependency>
+
+		<!-- 旧版客户端(InfluxQL,支持 1.x) -->
+		<dependency>
+			<groupId>org.influxdb</groupId>
+			<artifactId>influxdb-java</artifactId>
+			<version>2.23</version>
+		</dependency>
+
+		<!-- 新版客户端(Flux,支持 2.x/3.x) -->
+		<dependency>
+			<groupId>com.influxdb</groupId>
+			<artifactId>influxdb-client-java</artifactId>
+			<version>6.11.0</version>
+		</dependency>
+
+
 		<dependency>
 			<groupId>org.springframework.boot</groupId>
 			<artifactId>spring-boot-starter-validation</artifactId>

+ 93 - 0
sqls/cs_dsy.sql

@@ -0,0 +1,93 @@
+drop table if exists `cs_report_datasource`;
+CREATE TABLE `cs_report_datasource` (
+  `id` int NOT NULL AUTO_INCREMENT COMMENT '主键自增',
+  `tenant_id` varchar(12) DEFAULT NULL COMMENT '租户id',
+  `ds_name` varchar(50) not null comment '连接名,用于显示',
+  `ds_ip` varchar(50) DEFAULT NULL COMMENT 'ip地址',
+  `ds_port` int DEFAULT NULL COMMENT '端口',
+  `ds_db` varchar(50) DEFAULT NULL COMMENT '数据库名/SID',
+  `ds_url` varchar(300) DEFAULT NULL COMMENT '连接url',
+  `ds_user` varchar(50) DEFAULT NULL COMMENT '用户名',
+  `ds_password` varchar(50) DEFAULT NULL COMMENT '数据库密码',
+  `ds_type` int DEFAULT NULL COMMENT '数据源类型 0-mysql 1-es 2-influxdb',
+  `flux_token` varchar(100) comment 'fluxV2版本的token值/userpass任选其一',
+  `flux_v2_status` tinyint not null default 0 comment 'influxdb是否fluxV2版本',
+  `remark` varchar(200) DEFAULT NULL COMMENT '备注',
+  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+  `create_user_id` bigint DEFAULT NULL COMMENT '创建人ID',
+  PRIMARY KEY (`id`)
+) comment '定制的数据源表';
+
+drop table if exists `cs_dsy_job`;
+CREATE TABLE `cs_dsy_job` (
+  `id` int NOT NULL AUTO_INCREMENT,
+  `tenant_id` varchar(12) NOT NULL COMMENT '租户ID',
+  `category_id` int NOT NULL COMMENT '分类ID',
+  `job_name` varchar(100) NOT NULL COMMENT '任务名称',
+  `job_desc` varchar(500) DEFAULT NULL COMMENT '任务描述',
+  `job_status` tinyint NOT NULL COMMENT '上线状态',
+  `trigger_status` tinyint NOT NULL DEFAULT '0' COMMENT '调度状态',
+  `job_cron` varchar(20) DEFAULT NULL COMMENT 'xxljob的任务Cron',
+  `xxl_job_id` int DEFAULT NULL COMMENT 'xxljob的任务ID',
+  `source_ds_id` int NOT NULL COMMENT '输入数据源ID',
+  `source_ds_type` tinyint DEFAULT NULL COMMENT '输入数据源类型',
+  `source_table_name` varchar(100) NOT NULL COMMENT '输入数据源表名',
+  `target_ds_id` int NOT NULL COMMENT '目标数据源ID',
+  `target_ds_type` tinyint DEFAULT NULL COMMENT '目标数据源类型',
+  `target_table_name` varchar(100) NOT NULL COMMENT '目标数据源表名',
+  `query_sql` longtext NOT NULL COMMENT '输入数据源的查询SQL',
+  `column_json` text comment '字段映射json数组',
+  `public_status` tinyint NOT NULL DEFAULT '0' COMMENT '公开状态(0-不公开/1-公开)',
+  `create_time` datetime NOT NULL COMMENT '创建时间',
+  `create_user_id` bigint NOT NULL COMMENT '创建人ID',
+  `create_by` varchar(50) DEFAULT NULL COMMENT '创建人',
+  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
+  `update_user_id` bigint DEFAULT NULL COMMENT '更新人ID',
+  `update_by` varchar(50) DEFAULT NULL COMMENT '更新人',
+  PRIMARY KEY (`id`)
+) COMMENT='定制的数据同步任务';
+
+drop table if exists `cs_dsy_job_category`;
+CREATE TABLE `cs_dsy_job_category` (
+  `id` int NOT NULL AUTO_INCREMENT,
+  `tenant_id` varchar(12) NOT NULL COMMENT '租户ID',
+  `cate_name` varchar(50) NOT NULL COMMENT '分类名称',
+  `parent_id` int NOT NULL DEFAULT '0' COMMENT '父级ID',
+  `sort_num` int NOT NULL DEFAULT '0' COMMENT '排序号',
+  `create_time` datetime NOT NULL COMMENT '创建时间',
+  `create_user_id` bigint NOT NULL COMMENT '创建人ID',
+  `create_by` varchar(50) DEFAULT NULL COMMENT '创建人',
+  PRIMARY KEY (`id`)
+) COMMENT='定制的数据同步任务分类';
+
+drop table if exists `cs_dsy_job_instance`;
+CREATE TABLE `cs_dsy_job_instance` (
+  `id` int NOT NULL AUTO_INCREMENT,
+  `tenant_id` varchar(12) NOT NULL COMMENT '租户ID',
+  `job_id` int NOT NULL COMMENT '任务ID',
+  `start_time` datetime DEFAULT NULL COMMENT '作业开始时间',
+  `end_time` datetime DEFAULT NULL COMMENT '作业结束时间',
+  `instance_run_type` tinyint NOT NULL COMMENT '作业运行类型(手动 自动)',
+  `instance_status` tinyint NOT NULL COMMENT '作业状态',
+  `err_msg` longtext COMMENT '错误描述',
+  `read_row_count` bigint NOT NULL DEFAULT '0' COMMENT '读取行数',
+  `write_row_count` bigint NOT NULL DEFAULT '0' COMMENT '写入行数',
+  `error_row_count` bigint NOT NULL DEFAULT '0' COMMENT '错误行数',
+  `source_table_name` varchar(100) DEFAULT NULL COMMENT '输入数据源表名',
+  `target_table_name` varchar(100) DEFAULT NULL COMMENT '目标数据源表名',
+  `create_time` datetime NOT NULL COMMENT '任务创建时间',
+  PRIMARY KEY (`id`) USING BTREE,
+  KEY `job_id` (`job_id`)
+) COMMENT='定制的数据同步任务实例';
+
+
+drop table if exists `cs_dsy_job_permission`;
+CREATE TABLE `cs_dsy_job_permission` (
+  `id` int NOT NULL AUTO_INCREMENT,
+  `job_id` int NOT NULL COMMENT '任务ID',
+  `data_perm_id` int NOT NULL COMMENT '权限组ID',
+  `create_time` datetime NOT NULL COMMENT '创建时间',
+  `create_user_id` bigint NOT NULL COMMENT '创建人ID',
+  `create_by` varchar(50) NOT NULL COMMENT '创建人',
+  PRIMARY KEY (`id`)
+) COMMENT='定制的数据同步任务权限组';

+ 45 - 0
src/main/java/org/springblade/csetl/dto/BaseQueryParam.java

@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2018-2028, AoKunSang All rights reserved.
+ * 我问青山何时老,青山问我几时闲,
+ * 不是闲人闲不得,能闲必非等闲人。
+ */
+package org.springblade.csetl.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 查询参数基础类
+ *
+ * @author wookvn
+ * @datetime 2025-02-05 14:00:05
+ */
+@Data
+public class BaseQueryParam implements Serializable {
+
+    /**
+     * 请求地址
+     */
+    private String host;
+
+    /**
+     * 请求端口
+     */
+    private Integer port;
+
+    /**
+     * 用户名
+     */
+    private String username;
+
+    /**
+     * 密码
+     */
+    private String password;
+
+    /**
+     * 查询语句
+     */
+    private String querySql;
+}

+ 31 - 0
src/main/java/org/springblade/csetl/dto/EsQueryParam.java

@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 2018-2028, AoKunSang All rights reserved.
+ * 我问青山何时老,青山问我几时闲,
+ * 不是闲人闲不得,能闲必非等闲人。
+ */
+package org.springblade.csetl.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * ES数据查询对象
+ *
+ * @author wookvn
+ * @datetime 2025-02-05 12:00:37
+ */
+@Data
+public class EsQueryParam extends BaseQueryParam {
+
+    /**
+     * 密码
+     */
+    private String password;
+
+    /**
+     * 索引名称
+     */
+    private String indexName;
+
+}

+ 39 - 0
src/main/java/org/springblade/csetl/dto/InfluxdbQueryParam.java

@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2018-2028, AoKunSang All rights reserved.
+ * 我问青山何时老,青山问我几时闲,
+ * 不是闲人闲不得,能闲必非等闲人。
+ */
+package org.springblade.csetl.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * influxdb查询参数
+ *
+ * @author wookvn
+ * @datetime 2025-02-05 13:14:10
+ */
+@Data
+public class InfluxdbQueryParam extends BaseQueryParam {
+
+    /**
+     * token
+     */
+    private String token;
+
+    /**
+     * 数据库
+     */
+    private String database;
+
+    /**
+     * 是否为flux语法
+     */
+    private boolean isFluxV2;
+
+    public static String urlOf(InfluxdbQueryParam queryParam) {
+        return String.format("http://%s:%s", queryParam.getHost(), queryParam.getPort());
+    }
+}

+ 123 - 0
src/main/java/org/springblade/csetl/engine/ElasticsearchExecutor.java

@@ -0,0 +1,123 @@
+/*
+ * Copyright (c) 2018-2028, AoKunSang All rights reserved.
+ * 我问青山何时老,青山问我几时闲,
+ * 不是闲人闲不得,能闲必非等闲人。
+ */
+package org.springblade.csetl.engine;
+
+import cn.hutool.core.collection.ListUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.json.JSONUtil;
+import co.elastic.clients.elasticsearch.ElasticsearchClient;
+import co.elastic.clients.elasticsearch.core.SearchRequest;
+import co.elastic.clients.elasticsearch.core.SearchResponse;
+import co.elastic.clients.elasticsearch.core.search.Hit;
+import co.elastic.clients.json.jackson.JacksonJsonpMapper;
+import co.elastic.clients.transport.ElasticsearchTransport;
+import co.elastic.clients.transport.endpoints.BooleanResponse;
+import co.elastic.clients.transport.rest_client.RestClientTransport;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.http.HttpHost;
+import org.apache.http.HttpResponseInterceptor;
+import org.apache.http.auth.AuthScope;
+import org.apache.http.auth.UsernamePasswordCredentials;
+import org.apache.http.entity.ContentType;
+import org.apache.http.impl.client.BasicCredentialsProvider;
+import org.apache.http.message.BasicHeader;
+import org.elasticsearch.client.RestClient;
+import org.elasticsearch.client.RestClientBuilder;
+import org.springblade.csetl.dto.BaseQueryParam;
+import org.springblade.csetl.dto.EsQueryParam;
+import org.springframework.http.HttpHeaders;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.function.Function;
+
+/**
+ * elasticsearch执行器
+ *
+ * @author wookvn
+ * @datetime 2025-02-05 15:16:00
+ */
+@Slf4j
+@Component
+public class ElasticsearchExecutor implements SqlExecutor<String> {
+
+    @Override
+    public Boolean check(BaseQueryParam queryParam) {
+        EsQueryParam esQueryParam = (EsQueryParam) queryParam;
+        return connectQuery(esQueryParam, elasticsearchClient -> {
+            try {
+                BooleanResponse pingReponse = elasticsearchClient.ping();
+                return pingReponse.value();
+            } catch (Exception e) {
+                log.error(e.getMessage(), e);
+                return false;
+            }
+        });
+    }
+
+    @Override
+    public String query(BaseQueryParam queryParam) {
+        EsQueryParam esQueryParam = (EsQueryParam) queryParam;
+        return connectQuery(esQueryParam, elasticsearchClient -> {
+            SearchRequest searchRequest = SearchRequest.of(s -> s
+                    .index(esQueryParam.getIndexName())
+                    .withJson(StrUtil.getReader(esQueryParam.getQuerySql()))
+            );
+            try {
+                SearchResponse<Object> searchResponse = elasticsearchClient.search(searchRequest, Object.class);
+                List<Object> resultList = new ArrayList<>();
+                for (Hit<Object> hit : searchResponse.hits().hits()) {
+                    resultList.add(hit.source());
+                }
+                return JSONUtil.toJsonStr(resultList);
+            } catch (Exception e) {
+                log.error(e.getMessage(), e);
+            }
+            return null;
+        });
+    }
+
+    private <T> T connectQuery(EsQueryParam esQueryParam, Function<ElasticsearchClient, T> consumer){
+        // 创建用户名密码对象
+        BasicCredentialsProvider basicCredentialsProvider = new BasicCredentialsProvider();
+        basicCredentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(esQueryParam.getUsername(), esQueryParam.getPassword()));
+
+        // 设置 连接地址和端口
+        RestClientBuilder restClientBuilder = RestClient.builder(new HttpHost(esQueryParam.getHost(), esQueryParam.getPort()));
+        restClientBuilder.setHttpClientConfigCallback(httpClientBuilder ->
+                httpClientBuilder.setDefaultCredentialsProvider(basicCredentialsProvider)
+                        .setDefaultHeaders(
+                                ListUtil.of(
+                                        new BasicHeader(
+                                                HttpHeaders.CONTENT_TYPE, ContentType.APPLICATION_JSON.toString())))
+                        .addInterceptorLast(
+                                (HttpResponseInterceptor)
+                                        (response, context) ->
+                                                response.addHeader("X-Elastic-Product", "Elasticsearch")));
+        // 创建 Elasticsearch 客户端
+        try(RestClient restClient = restClientBuilder.build();
+            ElasticsearchTransport elasticsearchTransport = new RestClientTransport(restClient, new JacksonJsonpMapper());) {
+            ElasticsearchClient elasticsearchClient = new ElasticsearchClient(elasticsearchTransport);
+            return consumer.apply(elasticsearchClient);
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+        return null;
+    }
+
+//    public static void main(String[] args) {
+//        ElasticsearchExecutor ss = new ElasticsearchExecutor();
+//        EsQueryParam esQueryParam = new EsQueryParam();
+//        esQueryParam.setHost("localhost");
+//        esQueryParam.setPort(9200);
+//        esQueryParam.setUsername("elastic");
+//        esQueryParam.setPassword("Xy7t7yS4dIb6s28IBWqm");
+//        esQueryParam.setIndexName("library");
+//        esQueryParam.setQuerySql("{\"query\":{\"match_all\":{}}}");
+//        System.out.println(ss.query(esQueryParam));
+//    }
+}

+ 127 - 0
src/main/java/org/springblade/csetl/engine/InfluxdbExecutor.java

@@ -0,0 +1,127 @@
+/*
+ * Copyright (c) 2018-2028, AoKunSang All rights reserved.
+ * 我问青山何时老,青山问我几时闲,
+ * 不是闲人闲不得,能闲必非等闲人。
+ */
+package org.springblade.csetl.engine;
+
+import cn.hutool.core.util.StrUtil;
+import com.influxdb.client.InfluxDBClient;
+import com.influxdb.client.InfluxDBClientFactory;
+import com.influxdb.query.FluxRecord;
+import com.influxdb.query.FluxTable;
+import lombok.extern.slf4j.Slf4j;
+import org.influxdb.InfluxDB;
+import org.influxdb.InfluxDBFactory;
+import org.influxdb.dto.Query;
+import org.influxdb.dto.QueryResult;
+import org.springblade.csetl.dto.BaseQueryParam;
+import org.springblade.csetl.dto.InfluxdbQueryParam;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * influxdb执行器
+ *
+ * @author wookvn
+ * @datetime 2025-02-05 15:16:33
+ */
+@Slf4j
+@Component
+public class InfluxdbExecutor implements SqlExecutor<List<Map<String, Object>>> {
+
+    @Override
+    public Boolean check(BaseQueryParam queryParam) {
+        InfluxdbQueryParam influxdbQueryParam = (InfluxdbQueryParam) queryParam;
+        if(influxdbQueryParam.isFluxV2()) {
+            //如果有token,则不使用userpass
+            try(InfluxDBClient client =
+                        StrUtil.isNotBlank(influxdbQueryParam.getToken())
+                                ? InfluxDBClientFactory.create(InfluxdbQueryParam.urlOf(influxdbQueryParam), influxdbQueryParam.getToken().toCharArray())
+                                : InfluxDBClientFactory.create(InfluxdbQueryParam.urlOf(influxdbQueryParam), influxdbQueryParam.getUsername(), influxdbQueryParam.getPassword().toCharArray());){
+                return client.ping();
+            } catch (Exception e) {
+                log.error(e.getMessage(), e);
+                return false;
+            }
+        } else {
+            try(InfluxDB influxdb = InfluxDBFactory.connect(InfluxdbQueryParam.urlOf(influxdbQueryParam), influxdbQueryParam.getUsername(), influxdbQueryParam.getPassword());){
+                return influxdb.ping().isGood();
+            } catch (Exception e) {
+                log.error(e.getMessage(), e);
+                return false;
+            }
+        }
+    }
+
+    @Override
+    public List<Map<String, Object>> query(BaseQueryParam queryParam) {
+        InfluxdbQueryParam influxdbQueryParam = (InfluxdbQueryParam) queryParam;
+        return influxdbQueryParam.isFluxV2() ? fluxQuery(influxdbQueryParam) : influxQLQuery(influxdbQueryParam);
+    }
+
+    /**
+     * <p>influxdb1.x版本查询方式</p>
+     * @author wookvn
+     * @datetime 2025-02-05 13:33:33
+     * @param influxdbQueryParam: (参数说明)
+     **/
+    List<Map<String, Object>> influxQLQuery(InfluxdbQueryParam influxdbQueryParam) {
+        try(InfluxDB influxDB = InfluxDBFactory.connect(InfluxdbQueryParam.urlOf(influxdbQueryParam), influxdbQueryParam.getUsername(), influxdbQueryParam.getPassword());){
+            QueryResult result = influxDB.query(new Query(influxdbQueryParam.getQuerySql(), influxdbQueryParam.getDatabase()));
+            List<Map<String, Object>> resultList = new ArrayList<>();
+            for (QueryResult.Result res : result.getResults()) {
+                for (QueryResult.Series series : res.getSeries()) {
+//                    series.getTags();  series.getName();
+                    Map<String, Object> dataMap = new HashMap<>();
+                    //字段名列表
+                    List<String> columns = series.getColumns();
+                    for (List<Object> row : series.getValues()) {
+                        // 遍历字段(假设查询如 SELECT field1, field2 FROM ...)
+                        for (int i = 0; i < row.size(); i++) {
+                            String fieldName = columns.get(i);
+                            Object value = row.get(i);
+                            dataMap.put(fieldName, value);
+                        }
+                        resultList.add(dataMap);
+                    }
+                }
+            }
+            return resultList;
+        }catch (Exception e){
+            log.error(e.getMessage(), e);
+        }
+        return null;
+    }
+
+    /**
+     * <p>flux2.x版本查询方式</p>
+     * @author wookvn
+     * @datetime 2025-02-05 13:35:52
+     * @param influxdbQueryParam: (参数说明)
+     **/
+    List<Map<String, Object>> fluxQuery(InfluxdbQueryParam influxdbQueryParam) {
+        try(InfluxDBClient client =
+                    StrUtil.isNotBlank(influxdbQueryParam.getToken())
+                            ? InfluxDBClientFactory.create(InfluxdbQueryParam.urlOf(influxdbQueryParam), influxdbQueryParam.getToken().toCharArray())
+                            : InfluxDBClientFactory.create(InfluxdbQueryParam.urlOf(influxdbQueryParam), influxdbQueryParam.getUsername(), influxdbQueryParam.getPassword().toCharArray());){
+            List<FluxTable> tables = client.getQueryApi().query(influxdbQueryParam.getQuerySql());
+            List<Map<String, Object>> resultList = new ArrayList<>();
+            for (FluxTable table : tables) {
+                Map<String, Object> dataMap = new HashMap<>();
+                for (FluxRecord record : table.getRecords()) {
+                    dataMap.put(record.getField(), record.getValue());
+                }
+                resultList.add(dataMap);
+            }
+            return resultList;
+        }catch (Exception e){
+            log.error(e.getMessage(), e);
+        }
+        return null;
+    }
+}

+ 33 - 0
src/main/java/org/springblade/csetl/engine/SqlExecutor.java

@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 2018-2028, aokunsang All rights reserved.
+ * 我问青山何时老,青山问我几时闲,
+ * 不是闲人闲不得,能闲必非等闲人。
+ */
+package org.springblade.csetl.engine;
+
+import org.springblade.csetl.dto.BaseQueryParam;
+
+/**
+ * SQL执行器接口
+ *
+ * @author wookvn
+ * @datetime 2025-02-05 15:14:18
+ */
+public interface SqlExecutor<T> {
+
+    /**
+     * 检查连接
+     *
+     * @param queryParam 参数
+     * @return 检查结果
+     */
+    public Boolean check(BaseQueryParam queryParam);
+
+    /**
+     * 查询
+     *
+     * @param queryParam 参数
+     * @return 查询结果
+     */
+    public T query(BaseQueryParam queryParam);
+}

+ 7 - 9
src/main/resources/application-dev.yml

@@ -11,9 +11,9 @@ platomix:
       tempWorkspace: /Users/wookvn/Downloads/upload/test
       clusterCredentialPath: /Users/wookvn/Documents/working/hadoop-3.2.4/etc/hadoop
    preview-redis:
-      host: 121.204.253.223
-      port: 6379
-      auth: ltbiydhao5
+      host: 125.77.165.122
+      port: 4379
+      auth: Platomix@redis123
       database: 4
    sftp:
       host: 121.204.253.223
@@ -111,11 +111,9 @@ spring:
          datasource:
            master:
              driver-class-name: com.mysql.cj.jdbc.Driver
-             url: jdbc:mysql://39.103.207.159:3306/digital_operation?useSSL=false&useUnicode=true&characterEncoding=utf-8&autoReconnect=true&allowPublicKeyRetrieval=true
-             username: digital
-             password: Dgb6inMBYtsMT#rS
-#             url: jdbc:mysql://121.204.249.37:3306/digital_operation?useSSL=false&useUnicode=true&characterEncoding=utf-8&autoReconnect=true&allowPublicKeyRetrieval=true
-#             username: root
-#             password: Platomix@mysql123
+             url: jdbc:mysql://125.77.165.122:3307/digital_operation?useSSL=false&useUnicode=true&characterEncoding=utf-8&autoReconnect=true&allowPublicKeyRetrieval=true
+             username: root
+             password: Platomix@mysql123
+
 apimngr:
    insertUrl: http://121.204.252.205:8081/api/apimngr/insertNoAuth