From 06cd926e5b4e58a150f8bb7a2b887593b52b1e9a Mon Sep 17 00:00:00 2001 From: yangtao Date: Thu, 4 May 2023 11:37:21 +0800 Subject: [PATCH] =?UTF-8?q?1.=E5=8D=87=E7=BA=A7jdk17=E5=92=8C=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E4=BE=9D=E8=B5=96=202,=E5=88=A0=E9=99=A4=E9=83=A8?= =?UTF-8?q?=E5=88=86=E6=95=B0=E6=8D=AE=E5=BA=93=E9=A9=B1=E5=8A=A8(logback?= =?UTF-8?q?=20=E5=86=B2=E7=AA=81)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dbapi-assembly/binary.xml | 4 +- dbapi-assembly/pom.xml | 8 +- dbapi-cluster-apiServer/pom.xml | 13 +- .../dbapi/apiserver/DBApiApiServer.java | 29 --- .../dbapi/apiserver/conf/FilterConfig.java | 38 --- .../dbapi/apiserver/conf/ServletConfig.java | 48 ---- .../application-apiServer.properties | 21 -- .../src/main/resources/logback-apiServer.xml | 55 ----- dbapi-cluster-gateway/pom.xml | 18 +- .../dbapi/gateway/DBApiGateWay.java | 30 --- .../dbapi/gateway/filter/GatewayIPFilter.java | 47 ---- .../main/resources/application-gateway.yml | 30 --- .../src/main/resources/logback-gateway.xml | 64 ----- dbapi-cluster-manager/pom.xml | 7 +- .../dbapi/manager/DBApiManager.java | 27 --- .../resources/application-manager.properties | 12 - .../src/main/resources/logback-manager.xml | 39 --- dbapi-common/pom.xml | 8 +- .../freakchicken/dbapi/common/ApiConfig.java | 24 +- .../dbapi/common/ApiConfigVersion.java | 68 +++++- .../freakchicken/dbapi/common}/ApiSql.java | 2 +- dbapi-controller/pom.xml | 12 +- .../dbapi/basic/conf/CrossConfig.java | 2 +- .../conf/JwtAuthenticationInterceptor.java | 4 +- .../basic/controller/ApiConfigController.java | 42 ++-- .../controller/DataSourceController.java | 2 +- .../basic/controller/SystemController.java | 24 +- .../controller/SystemControllerBack.java | 68 ++++++ dbapi-plugin/pom.xml | 59 +---- .../dbapi/plugin/AlarmPlugin.java | 2 +- .../dbapi/plugin/impl/EmailAlarmPlugin.java | 2 +- dbapi-service/pom.xml | 147 ++--------- .../dbapi/basic/dao/ApiSqlMapper.java | 3 +- .../dbapi/basic/domain/ESApiConfig.java | 45 ---- .../dbapi/basic/es/ESClientPool.java | 36 --- .../dbapi/basic/es/ESPoolManager.java | 38 --- .../dbapi/basic/es/RestClientFactory.java | 51 ---- .../dbapi/basic/executor/ESExecutor.java | 92 ------- .../dbapi/basic/executor/SQLExecutor.java | 141 ----------- .../dbapi/basic/filter/ApiAuthFilter.java | 7 +- .../dbapi/basic/filter/ApiHeaderFilter.java | 4 +- .../dbapi/basic/filter/ApiIPFilter.java | 6 +- .../dbapi/basic/log/AccessLogKafkaReader.java | 7 +- .../dbapi/basic/service/ApiConfigService.java | 2 +- .../dbapi/basic/service/ApiService.java | 2 +- .../basic/service/ESApiConfigService.java | 13 - .../dbapi/basic/service/IPService.java | 2 +- .../basic/service/SQLApiConfigService.java | 14 -- .../dbapi/basic/servlet/APIServlet.java | 149 +++++++++--- .../dbapi/basic/servlet/TokenServlet.java | 6 +- .../freakchicken/dbapi/basic/util/IPUtil.java | 3 +- .../freakchicken/dbapi/basic/util/MD5.java | 6 +- .../src/main/resources/application.properties | 37 +-- .../resources/application.properties.back | 82 +++++++ dbapi-standalone/pom.xml | 16 +- .../freakchicken/dbapi/DBApiStandalone.java | 8 +- .../freakchicken/dbapi/conf/FilterConfig.java | 13 +- .../dbapi/conf/ServletConfig.java | 21 +- dbapi-ui/favicon.ico | Bin 0 -> 43602 bytes dbapi-ui/index.html | 1 + dbapi-ui/pom.xml | 6 +- pom.xml | 229 ++++++++++++------ 62 files changed, 661 insertions(+), 1335 deletions(-) rename dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/domain/SQLApiConfig.java => dbapi-common/src/main/java/com/gitee/freakchicken/dbapi/common/ApiConfigVersion.java (36%) rename {dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/domain => dbapi-common/src/main/java/com/gitee/freakchicken/dbapi/common}/ApiSql.java (92%) create mode 100644 dbapi-controller/src/main/java/com/gitee/freakchicken/dbapi/basic/controller/SystemControllerBack.java delete mode 100644 dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/domain/ESApiConfig.java delete mode 100644 dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/es/ESClientPool.java delete mode 100644 dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/es/ESPoolManager.java delete mode 100644 dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/es/RestClientFactory.java delete mode 100644 dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/executor/ESExecutor.java delete mode 100644 dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/executor/SQLExecutor.java delete mode 100644 dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/service/ESApiConfigService.java delete mode 100644 dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/service/SQLApiConfigService.java create mode 100644 dbapi-service/src/main/resources/application.properties.back create mode 100644 dbapi-ui/favicon.ico create mode 100644 dbapi-ui/index.html diff --git a/dbapi-assembly/binary.xml b/dbapi-assembly/binary.xml index 7dc0052..24bd98a 100644 --- a/dbapi-assembly/binary.xml +++ b/dbapi-assembly/binary.xml @@ -1,6 +1,6 @@ - + xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/2.1.1 http://maven.apache.org/xsd/assembly-2.1.1.xsd"> bin tar.gz diff --git a/dbapi-assembly/pom.xml b/dbapi-assembly/pom.xml index 578450a..a0bcd68 100644 --- a/dbapi-assembly/pom.xml +++ b/dbapi-assembly/pom.xml @@ -5,15 +5,15 @@ com.gitee.freakchicken.dbapi dbapi - 3.3.0 + 3.2.1 4.0.0 dbapi-assembly - 8 - 8 + 17 + 17 UTF-8 UTF-8 UTF-8 @@ -50,7 +50,9 @@ + org.apache.maven.plugins maven-assembly-plugin + 3.5.0 binary.xml diff --git a/dbapi-cluster-apiServer/pom.xml b/dbapi-cluster-apiServer/pom.xml index d0bd967..15ca5cf 100644 --- a/dbapi-cluster-apiServer/pom.xml +++ b/dbapi-cluster-apiServer/pom.xml @@ -5,15 +5,15 @@ dbapi com.gitee.freakchicken.dbapi - 3.3.0 + 3.2.1 4.0.0 dbapi-cluster-apiServer - 8 - 8 + 17 + 17 UTF-8 UTF-8 UTF-8 @@ -22,12 +22,6 @@ - - - com.gitee.freakchicken.dbapi dbapi-service @@ -48,6 +42,7 @@ org.apache.maven.plugins maven-jar-plugin + 3.3.0 **/*.xml diff --git a/dbapi-cluster-apiServer/src/main/java/com/gitee/freakchicken/dbapi/apiserver/DBApiApiServer.java b/dbapi-cluster-apiServer/src/main/java/com/gitee/freakchicken/dbapi/apiserver/DBApiApiServer.java index a505a84..e69de29 100644 --- a/dbapi-cluster-apiServer/src/main/java/com/gitee/freakchicken/dbapi/apiserver/DBApiApiServer.java +++ b/dbapi-cluster-apiServer/src/main/java/com/gitee/freakchicken/dbapi/apiserver/DBApiApiServer.java @@ -1,29 +0,0 @@ -package com.gitee.freakchicken.dbapi.apiserver; - -import org.mybatis.spring.annotation.MapperScan; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cache.annotation.EnableCaching; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.FilterType; -import org.springframework.scheduling.annotation.EnableAsync; - -@SpringBootApplication -@MapperScan("com.gitee.freakchicken.dbapi.basic.dao") -@EnableCaching -@EnableAsync -@ComponentScan(value = {"com.gitee.freakchicken.dbapi.basic", "com.gitee.freakchicken.dbapi.apiserver"}, - excludeFilters = { - @ComponentScan.Filter(type = FilterType.REGEX, pattern = { - "com.gitee.freakchicken.dbapi.basic.filter.ApiIPFilter", //filter会自动注册 - "com.gitee.freakchicken.dbapi.basic.conf.*",//安装包启动的时候排除controller相关 - "com.gitee.freakchicken.dbapi.basic.controller.*" //安装包启动的时候排除controller相关 - }) - }) -//@PropertySource("application-apiServer.properties") -public class DBApiApiServer { - public static void main(String[] args) { - System.setProperty("spring.profiles.active", "apiServer"); - SpringApplication.run(DBApiApiServer.class, args); - } -} diff --git a/dbapi-cluster-apiServer/src/main/java/com/gitee/freakchicken/dbapi/apiserver/conf/FilterConfig.java b/dbapi-cluster-apiServer/src/main/java/com/gitee/freakchicken/dbapi/apiserver/conf/FilterConfig.java index 03db5e6..e69de29 100644 --- a/dbapi-cluster-apiServer/src/main/java/com/gitee/freakchicken/dbapi/apiserver/conf/FilterConfig.java +++ b/dbapi-cluster-apiServer/src/main/java/com/gitee/freakchicken/dbapi/apiserver/conf/FilterConfig.java @@ -1,38 +0,0 @@ -package com.gitee.freakchicken.dbapi.apiserver.conf; - -import com.gitee.freakchicken.dbapi.basic.filter.ApiAuthFilter; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.web.servlet.FilterRegistrationBean; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -/** - * @description: 用于注册Filter - * @program: dbApi - * @author: kensan - * @create: 2022-04-16 12:43 - */ -@Slf4j -@Configuration -public class FilterConfig { - @Value("${dbapi.api.context}") - String apiContext; - - @Autowired - private ApiAuthFilter apiAuthFilter; - - @Bean - public FilterRegistrationBean authFilter() { - int authFilterOrder = 2; - String format = String.format("/%s/*", apiContext); - FilterRegistrationBean registrationBean = new FilterRegistrationBean(); - registrationBean.setFilter(apiAuthFilter); - registrationBean.addUrlPatterns(format); - registrationBean.setOrder(authFilterOrder); - registrationBean.setEnabled(true); - log.info("regist authFilter for {} UrlPatterns, and order is {}",format,authFilterOrder); - return registrationBean; - } -} diff --git a/dbapi-cluster-apiServer/src/main/java/com/gitee/freakchicken/dbapi/apiserver/conf/ServletConfig.java b/dbapi-cluster-apiServer/src/main/java/com/gitee/freakchicken/dbapi/apiserver/conf/ServletConfig.java index e9fd1c5..e69de29 100644 --- a/dbapi-cluster-apiServer/src/main/java/com/gitee/freakchicken/dbapi/apiserver/conf/ServletConfig.java +++ b/dbapi-cluster-apiServer/src/main/java/com/gitee/freakchicken/dbapi/apiserver/conf/ServletConfig.java @@ -1,48 +0,0 @@ -package com.gitee.freakchicken.dbapi.apiserver.conf; - -import com.gitee.freakchicken.dbapi.basic.servlet.APIServlet; -import com.gitee.freakchicken.dbapi.basic.servlet.TokenServlet; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.web.servlet.ServletRegistrationBean; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -/** - * @description: - * @program: dbApi - * @author: kensan - * @create: 2022-04-16 12:45 - */ -@Slf4j -@Configuration -public class ServletConfig { - @Value("${dbapi.api.context}") - String apiContext; - - @Autowired - private APIServlet apiServlet; - - @Autowired - private TokenServlet tokenServlet; - - - @Bean - public ServletRegistrationBean getServletRegistrationBean() { - String format = String.format("/%s/*", apiContext); - ServletRegistrationBean bean = new ServletRegistrationBean(apiServlet); - bean.addUrlMappings(format); - log.info("regist APIServlet servelet for {} urlMappings",format); - return bean; - } - - @Bean - public ServletRegistrationBean tokenServletRegistrationBean() { - ServletRegistrationBean bean = new ServletRegistrationBean(tokenServlet); - bean.addUrlMappings("/token/generate"); - log.info("regist tokenServlet servelet"); - return bean; - } -} diff --git a/dbapi-cluster-apiServer/src/main/resources/application-apiServer.properties b/dbapi-cluster-apiServer/src/main/resources/application-apiServer.properties index e072c11..e69de29 100644 --- a/dbapi-cluster-apiServer/src/main/resources/application-apiServer.properties +++ b/dbapi-cluster-apiServer/src/main/resources/application-apiServer.properties @@ -1,21 +0,0 @@ -spring.application.name=${dbapi.cluster.api.name} -logging.config=classpath:logback-apiServer.xml -dbapi.mode=cluster -spring.cache.type=redis - -#################################### please modify config below ##################################### - -server.port=8524 - - - - - - - - - - - - - diff --git a/dbapi-cluster-apiServer/src/main/resources/logback-apiServer.xml b/dbapi-cluster-apiServer/src/main/resources/logback-apiServer.xml index d57ec68..e69de29 100644 --- a/dbapi-cluster-apiServer/src/main/resources/logback-apiServer.xml +++ b/dbapi-cluster-apiServer/src/main/resources/logback-apiServer.xml @@ -1,55 +0,0 @@ - - - - - - - - - %date{yyyy-MM-dd HH:mm:ss.SSS} [%level] %logger{96}:[%line] - %msg%n - - UTF-8 - - - - - ${log.base}/dbapi-apiServer.log - - ${log.base}/dbapi-apiServer.%d{yyyy-MM-dd}.%i.log - 168 - 200MB - - - - %date{yyyy-MM-dd HH:mm:ss.SSS} [%level] %logger{96}:[%line] - %msg%n - - UTF-8 - - - - - ${log.base}/dbapi-access.log - - ${log.base}/dbapi-access.%d{yyyy-MM-dd}.%i.log - 168 - 200MB - - - %msg%n - UTF-8 - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/dbapi-cluster-gateway/pom.xml b/dbapi-cluster-gateway/pom.xml index 6798933..b19d7c1 100644 --- a/dbapi-cluster-gateway/pom.xml +++ b/dbapi-cluster-gateway/pom.xml @@ -5,15 +5,15 @@ dbapi com.gitee.freakchicken.dbapi - 3.3.0 + 3.2.1 4.0.0 dbapi-cluster-gateway - 8 - 8 + 17 + 17 UTF-8 UTF-8 UTF-8 @@ -25,17 +25,6 @@ org.springframework.cloud spring-cloud-starter-gateway - - @@ -58,6 +47,7 @@ org.apache.maven.plugins maven-jar-plugin + 3.3.0 **/*.xml diff --git a/dbapi-cluster-gateway/src/main/java/com/gitee/freakchicken/dbapi/gateway/DBApiGateWay.java b/dbapi-cluster-gateway/src/main/java/com/gitee/freakchicken/dbapi/gateway/DBApiGateWay.java index e3dbe9e..e69de29 100644 --- a/dbapi-cluster-gateway/src/main/java/com/gitee/freakchicken/dbapi/gateway/DBApiGateWay.java +++ b/dbapi-cluster-gateway/src/main/java/com/gitee/freakchicken/dbapi/gateway/DBApiGateWay.java @@ -1,30 +0,0 @@ -package com.gitee.freakchicken.dbapi.gateway; - -import org.mybatis.spring.annotation.MapperScan; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cache.annotation.EnableCaching; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.FilterType; - -@SpringBootApplication -@ComponentScan(value = {"com.gitee.freakchicken.dbapi.basic", "com.gitee.freakchicken.dbapi.gateway"}, - excludeFilters = { - @ComponentScan.Filter(type = FilterType.REGEX, pattern = { - "com.gitee.freakchicken.dbapi.basic.filter.*", //filter会自动注册,要排除 - "com.gitee.freakchicken.dbapi.basic.controller.*", //安装包启动的时候排除 controller.jar - "com.gitee.freakchicken.dbapi.basic.conf.*", //安装包启动的时候排除 controller.jar - "com.gitee.freakchicken.dbapi.basic.service.LoadPluginOnSpringReady" - }) - }) -@MapperScan("com.gitee.freakchicken.dbapi.basic.dao") -@EnableCaching -//@PropertySource("classpath:application-gateway.yml") -public class DBApiGateWay { - public static void main(String[] args) { - System.setProperty("spring.profiles.active", "gateway"); - System.setProperty("reactor.netty.http.server.accessLogEnabled","true"); - SpringApplication.run(DBApiGateWay.class, args); - } - -} diff --git a/dbapi-cluster-gateway/src/main/java/com/gitee/freakchicken/dbapi/gateway/filter/GatewayIPFilter.java b/dbapi-cluster-gateway/src/main/java/com/gitee/freakchicken/dbapi/gateway/filter/GatewayIPFilter.java index fb5f11e..e69de29 100644 --- a/dbapi-cluster-gateway/src/main/java/com/gitee/freakchicken/dbapi/gateway/filter/GatewayIPFilter.java +++ b/dbapi-cluster-gateway/src/main/java/com/gitee/freakchicken/dbapi/gateway/filter/GatewayIPFilter.java @@ -1,47 +0,0 @@ -package com.gitee.freakchicken.dbapi.gateway.filter; - -import com.alibaba.fastjson.JSON; -import com.gitee.freakchicken.dbapi.basic.service.IPService; -import com.gitee.freakchicken.dbapi.common.ResponseDto; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.cloud.gateway.filter.GatewayFilterChain; -import org.springframework.cloud.gateway.filter.GlobalFilter; -import org.springframework.core.Ordered; -import org.springframework.core.io.buffer.DataBuffer; -import org.springframework.http.HttpStatus; -import org.springframework.http.server.reactive.ServerHttpRequest; -import org.springframework.http.server.reactive.ServerHttpResponse; -import org.springframework.stereotype.Component; -import org.springframework.web.server.ServerWebExchange; -import reactor.core.publisher.Mono; - -@Component -@Slf4j -public class GatewayIPFilter implements GlobalFilter, Ordered { - - @Autowired - IPService ipService; - - @Override - public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { - ServerHttpRequest request = exchange.getRequest(); - ServerHttpResponse response = exchange.getResponse(); - // 从request对象中获取客户端ip - String clientIp = request.getRemoteAddress().getHostString(); - if (!ipService.checkIP(clientIp)) { - log.info("ip forbidden : {}", clientIp); -// response.setStatusCode(HttpStatus.UNAUTHORIZED); - String data = JSON.toJSONString(ResponseDto.fail("Illegal ip (" + clientIp + "), access forbidden")); - DataBuffer wrap = response.bufferFactory().wrap(data.getBytes()); - return response.writeWith(Mono.just(wrap)); - } - // 合法请求,放⾏,执⾏后续的过滤器 - return chain.filter(exchange); - } - - @Override - public int getOrder() { - return 0; - } -} diff --git a/dbapi-cluster-gateway/src/main/resources/application-gateway.yml b/dbapi-cluster-gateway/src/main/resources/application-gateway.yml index 113a9d4..e69de29 100644 --- a/dbapi-cluster-gateway/src/main/resources/application-gateway.yml +++ b/dbapi-cluster-gateway/src/main/resources/application-gateway.yml @@ -1,30 +0,0 @@ -spring: - application: - name: ${dbapi.cluster.gateway.name} - cloud: - gateway: - routes: - - id: api_route - uri: lb://${dbapi.cluster.api.name} - predicates: - - Path=/${dbapi.api.context}/** - - id: token_route - uri: lb://${dbapi.cluster.api.name} - predicates: - - Path=/token/generate - - globalcors: - cors-configurations: - '[/**]': - allowed-origins: '*' - allowed-methods: '*' - allowed-headers: "*" - cache: - type: redis -logging: - config: classpath:logback-gateway.xml - -#################################### please modify config below ##################################### - -server: - port: 8525 \ No newline at end of file diff --git a/dbapi-cluster-gateway/src/main/resources/logback-gateway.xml b/dbapi-cluster-gateway/src/main/resources/logback-gateway.xml index 89017e5..e69de29 100644 --- a/dbapi-cluster-gateway/src/main/resources/logback-gateway.xml +++ b/dbapi-cluster-gateway/src/main/resources/logback-gateway.xml @@ -1,64 +0,0 @@ - - - - - - - - - %date{yyyy-MM-dd HH:mm:ss.SSS} [%level] %logger{96}:[%line] - %msg%n - - UTF-8 - - - - - ${log.base}/dbapi-gateway.log - - ${log.base}/dbapi-gateway.%d{yyyy-MM-dd}.%i.log - 168 - 200MB - - - - %date{yyyy-MM-dd HH:mm:ss.SSS} [%level] %logger{96}:[%line] - %msg%n - - UTF-8 - - - - - - ${log.base}/dbapi-gateway-access.log - - ${log.base}/dbapi-gateway-access.%d{yyyy-MM-dd}.%i.log - 168 - 200MB - - - - %date{yyyy-MM-dd HH:mm:ss.SSS} - %msg%n - - UTF-8 - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/dbapi-cluster-manager/pom.xml b/dbapi-cluster-manager/pom.xml index e0e6b16..93cf2af 100644 --- a/dbapi-cluster-manager/pom.xml +++ b/dbapi-cluster-manager/pom.xml @@ -5,15 +5,15 @@ dbapi com.gitee.freakchicken.dbapi - 3.3.0 + 3.2.1 4.0.0 dbapi-cluster-manager - 8 - 8 + 17 + 17 UTF-8 UTF-8 UTF-8 @@ -43,6 +43,7 @@ org.apache.maven.plugins maven-jar-plugin + 3.3.0 **/*.xml diff --git a/dbapi-cluster-manager/src/main/java/com/gitee/freakchicken/dbapi/manager/DBApiManager.java b/dbapi-cluster-manager/src/main/java/com/gitee/freakchicken/dbapi/manager/DBApiManager.java index 2afe60a..e69de29 100644 --- a/dbapi-cluster-manager/src/main/java/com/gitee/freakchicken/dbapi/manager/DBApiManager.java +++ b/dbapi-cluster-manager/src/main/java/com/gitee/freakchicken/dbapi/manager/DBApiManager.java @@ -1,27 +0,0 @@ -package com.gitee.freakchicken.dbapi.manager; - -import org.mybatis.spring.annotation.MapperScan; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cache.annotation.EnableCaching; -import org.springframework.cloud.client.discovery.EnableDiscoveryClient; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.FilterType; - -@SpringBootApplication -@ComponentScan(value = "com.gitee.freakchicken.dbapi.basic", excludeFilters = { - @ComponentScan.Filter(type = FilterType.REGEX, pattern = { - "com.gitee.freakchicken.dbapi.basic.filter.*" - }) -}) -@MapperScan("com.gitee.freakchicken.dbapi.basic.dao") -@EnableCaching -//@PropertySource("application-manager.properties") -@EnableDiscoveryClient -public class DBApiManager { - public static void main(String[] args) { - System.setProperty("spring.profiles.active","manager"); - SpringApplication.run(DBApiManager.class, args); - } - -} diff --git a/dbapi-cluster-manager/src/main/resources/application-manager.properties b/dbapi-cluster-manager/src/main/resources/application-manager.properties index 873a196..e69de29 100644 --- a/dbapi-cluster-manager/src/main/resources/application-manager.properties +++ b/dbapi-cluster-manager/src/main/resources/application-manager.properties @@ -1,12 +0,0 @@ -spring.application.name=${dbapi.cluster.manager.name} -logging.config=classpath:logback-manager.xml -dbapi.mode=cluster -spring.cache.type=redis - -#################################### please modify config below ##################################### - -server.port=8523 - - - - diff --git a/dbapi-cluster-manager/src/main/resources/logback-manager.xml b/dbapi-cluster-manager/src/main/resources/logback-manager.xml index a39a776..e69de29 100644 --- a/dbapi-cluster-manager/src/main/resources/logback-manager.xml +++ b/dbapi-cluster-manager/src/main/resources/logback-manager.xml @@ -1,39 +0,0 @@ - - - - - - - - - %date{yyyy-MM-dd HH:mm:ss.SSS} [%level] %logger{96}:[%line] - %msg%n - - UTF-8 - - - - - ${log.base}/dbapi-manager.log - - ${log.base}/dbapi-manager.%d{yyyy-MM-dd}.%i.log - 168 - 200MB - - - - %date{yyyy-MM-dd HH:mm:ss.SSS} [%level] %logger{96}:[%line] - %msg%n - - UTF-8 - - - - - - - - - - - - - \ No newline at end of file diff --git a/dbapi-common/pom.xml b/dbapi-common/pom.xml index 9e02f2a..4ec1f29 100644 --- a/dbapi-common/pom.xml +++ b/dbapi-common/pom.xml @@ -5,7 +5,7 @@ com.gitee.freakchicken.dbapi dbapi - 3.3.0 + 3.2.1 4.0.0 dbapi-common @@ -14,8 +14,8 @@ https://gitee.com/freakchicken/db-api - 8 - 8 + 17 + 17 UTF-8 UTF-8 UTF-8 @@ -25,7 +25,6 @@ com.baomidou mybatis-plus-annotation - 3.2.0 compile @@ -36,7 +35,6 @@ com.alibaba fastjson - 1.2.62 compile diff --git a/dbapi-common/src/main/java/com/gitee/freakchicken/dbapi/common/ApiConfig.java b/dbapi-common/src/main/java/com/gitee/freakchicken/dbapi/common/ApiConfig.java index 95c815a..b5e19d0 100644 --- a/dbapi-common/src/main/java/com/gitee/freakchicken/dbapi/common/ApiConfig.java +++ b/dbapi-common/src/main/java/com/gitee/freakchicken/dbapi/common/ApiConfig.java @@ -31,8 +31,8 @@ public class ApiConfig implements Serializable { @TableField(value = "datasource_id") String datasourceId; - // @TableField(exist = false) - // List sqlList; + @TableField(exist = false) + List sqlList; /** * application/x-www-form-urlencoded 类API对应的参数 @@ -49,14 +49,14 @@ public class ApiConfig implements Serializable { @TableField("group_id") String groupId; - // @TableField(value = "cache_plugin", insertStrategy = FieldStrategy.NOT_EMPTY) - // String cachePlugin; + @TableField(value = "cache_plugin", insertStrategy = FieldStrategy.NOT_EMPTY) + String cachePlugin; /** * 缓存插件参数 */ - // @TableField(value = "cache_plugin_params", updateStrategy = FieldStrategy.IGNORED) - // String cachePluginParams; + @TableField(value = "cache_plugin_params", updateStrategy = FieldStrategy.IGNORED) + String cachePluginParams; @TableField(value = "create_time") String createTime; @@ -70,8 +70,8 @@ public class ApiConfig implements Serializable { /** * 是否打开事务,1-是;0-否 */ - // @TableField("open_trans") - // Integer openTrans; + @TableField("open_trans") + Integer openTrans; /** * application/json 类API对应的json参数示例 @@ -79,9 +79,9 @@ public class ApiConfig implements Serializable { @TableField(value = "json_param", updateStrategy = FieldStrategy.IGNORED) String jsonParam; - // @TableField(exist = false) - // String alarmPlugin; + @TableField(exist = false) + String alarmPlugin; - // @TableField(exist = false) - // String alarmPluginParam; + @TableField(exist = false) + String alarmPluginParam; } diff --git a/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/domain/SQLApiConfig.java b/dbapi-common/src/main/java/com/gitee/freakchicken/dbapi/common/ApiConfigVersion.java similarity index 36% rename from dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/domain/SQLApiConfig.java rename to dbapi-common/src/main/java/com/gitee/freakchicken/dbapi/common/ApiConfigVersion.java index e35c1bb..2d5479b 100644 --- a/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/domain/SQLApiConfig.java +++ b/dbapi-common/src/main/java/com/gitee/freakchicken/dbapi/common/ApiConfigVersion.java @@ -1,26 +1,52 @@ -package com.gitee.freakchicken.dbapi.basic.domain; +package com.gitee.freakchicken.dbapi.common; -import com.baomidou.mybatisplus.annotation.*; +import com.baomidou.mybatisplus.annotation.FieldStrategy; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import java.io.Serializable; import java.util.List; + @Data -@TableName(value = "sql_api_config") -public class SQLApiConfig { - - @TableField("api_id") - String apiId; +@TableName(value = "api_config_version") +public class ApiConfigVersion implements Serializable { - @TableField("open_trans") - Integer openTrans; + + @TableId(value = "id") + String id; @TableField - String alarmPlugin; + String name; @TableField - String alarmPluginParam; + String note; + + @TableField + String path; + + @TableField(value = "datasource_id") + String datasourceId; + + @TableField(exist = false) + List sqlList; + + /** + * application/x-www-form-urlencoded 类API对应的参数 + */ + @TableField(updateStrategy = FieldStrategy.IGNORED) + String params; + + @TableField + Integer status; + + @TableField + Integer previlege; + + @TableField("group_id") + String groupId; @TableField(value = "cache_plugin", insertStrategy = FieldStrategy.NOT_EMPTY) String cachePlugin; @@ -37,6 +63,24 @@ public class SQLApiConfig { @TableField(value = "update_time") String updateTime; + @TableField(value = "content_type") + String contentType; + + /** + * 是否打开事务,1-是;0-否 + */ + @TableField("open_trans") + Integer openTrans; + + /** + * application/json 类API对应的json参数示例 + */ + @TableField(value = "json_param", updateStrategy = FieldStrategy.IGNORED) + String jsonParam; + @TableField(exist = false) - List sqlList; + String alarmPlugin; + + @TableField(exist = false) + String alarmPluginParam; } diff --git a/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/domain/ApiSql.java b/dbapi-common/src/main/java/com/gitee/freakchicken/dbapi/common/ApiSql.java similarity index 92% rename from dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/domain/ApiSql.java rename to dbapi-common/src/main/java/com/gitee/freakchicken/dbapi/common/ApiSql.java index 4eb8bd9..181612b 100644 --- a/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/domain/ApiSql.java +++ b/dbapi-common/src/main/java/com/gitee/freakchicken/dbapi/common/ApiSql.java @@ -1,4 +1,4 @@ -package com.gitee.freakchicken.dbapi.basic.domain; +package com.gitee.freakchicken.dbapi.common; import com.baomidou.mybatisplus.annotation.*; import lombok.Data; diff --git a/dbapi-controller/pom.xml b/dbapi-controller/pom.xml index 3329709..4bc913f 100644 --- a/dbapi-controller/pom.xml +++ b/dbapi-controller/pom.xml @@ -5,7 +5,7 @@ dbapi com.gitee.freakchicken.dbapi - 3.3.0 + 3.2.1 4.0.0 @@ -13,8 +13,8 @@ 包含controller和ui模块编译出来的html静态文件 - 8 - 8 + 17 + 17 UTF-8 UTF-8 UTF-8 @@ -42,8 +42,9 @@ + org.apache.maven.plugins maven-clean-plugin - 3.1.0 + 3.2.0 true @@ -61,6 +62,7 @@ org.apache.maven.plugins maven-jar-plugin + 3.3.0 **/*.xml @@ -103,7 +105,7 @@ - + diff --git a/dbapi-controller/src/main/java/com/gitee/freakchicken/dbapi/basic/conf/CrossConfig.java b/dbapi-controller/src/main/java/com/gitee/freakchicken/dbapi/basic/conf/CrossConfig.java index 8828282..5d5da96 100644 --- a/dbapi-controller/src/main/java/com/gitee/freakchicken/dbapi/basic/conf/CrossConfig.java +++ b/dbapi-controller/src/main/java/com/gitee/freakchicken/dbapi/basic/conf/CrossConfig.java @@ -9,7 +9,7 @@ public class CrossConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") - .allowedOrigins("*") + .allowedOriginPatterns("*") .allowedMethods("GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS") .allowCredentials(true) .maxAge(3600) diff --git a/dbapi-controller/src/main/java/com/gitee/freakchicken/dbapi/basic/conf/JwtAuthenticationInterceptor.java b/dbapi-controller/src/main/java/com/gitee/freakchicken/dbapi/basic/conf/JwtAuthenticationInterceptor.java index c04d28f..7ec8f25 100644 --- a/dbapi-controller/src/main/java/com/gitee/freakchicken/dbapi/basic/conf/JwtAuthenticationInterceptor.java +++ b/dbapi-controller/src/main/java/com/gitee/freakchicken/dbapi/basic/conf/JwtAuthenticationInterceptor.java @@ -3,6 +3,8 @@ package com.gitee.freakchicken.dbapi.basic.conf; import com.gitee.freakchicken.dbapi.basic.service.UserService; import com.gitee.freakchicken.dbapi.basic.domain.User; import com.gitee.freakchicken.dbapi.basic.util.JwtUtils; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpMethod; @@ -11,8 +13,6 @@ import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; import java.io.PrintWriter; @Component diff --git a/dbapi-controller/src/main/java/com/gitee/freakchicken/dbapi/basic/controller/ApiConfigController.java b/dbapi-controller/src/main/java/com/gitee/freakchicken/dbapi/basic/controller/ApiConfigController.java index 81c35fa..cf7eda0 100644 --- a/dbapi-controller/src/main/java/com/gitee/freakchicken/dbapi/basic/controller/ApiConfigController.java +++ b/dbapi-controller/src/main/java/com/gitee/freakchicken/dbapi/basic/controller/ApiConfigController.java @@ -5,7 +5,6 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.serializer.SerializerFeature; -import com.gitee.freakchicken.dbapi.basic.domain.ApiSql; import com.gitee.freakchicken.dbapi.basic.domain.DataSource; import com.gitee.freakchicken.dbapi.basic.domain.Group; import com.gitee.freakchicken.dbapi.basic.service.ApiConfigService; @@ -15,18 +14,19 @@ import com.gitee.freakchicken.dbapi.basic.util.JdbcUtil; import com.gitee.freakchicken.dbapi.basic.util.PoolManager; import com.gitee.freakchicken.dbapi.basic.util.SqlEngineUtil; import com.gitee.freakchicken.dbapi.common.ApiConfig; +import com.gitee.freakchicken.dbapi.common.ApiSql; import com.gitee.freakchicken.dbapi.common.ResponseDto; import com.github.freakchick.orange.SqlMeta; +import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.IOUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; -import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.OutputStream; +import java.nio.charset.StandardCharsets; import java.sql.SQLException; import java.util.Arrays; import java.util.List; @@ -47,18 +47,22 @@ public class ApiConfigController { @Value("${dbapi.mode}") String mode; + @Value("${dbapi.api.context}") + String apiContext; - @Autowired - ApiConfigService apiConfigService; + private final ApiConfigService apiConfigService; - @Autowired - DataSourceService dataSourceService; + private final DataSourceService dataSourceService; - @Autowired - GroupService groupService; + private final GroupService groupService; - @Value("${dbapi.api.context}") - String apiContext; + + + public ApiConfigController(ApiConfigService apiConfigService, DataSourceService dataSourceService, GroupService groupService) { + this.apiConfigService = apiConfigService; + this.dataSourceService = dataSourceService; + this.groupService = groupService; + } @RequestMapping("/context") public String add() { @@ -142,7 +146,7 @@ public class ApiConfigController { OutputStream os = null; //输出流 try { os = response.getOutputStream(); - os.write(docs.getBytes("utf-8")); + os.write(docs.getBytes(StandardCharsets.UTF_8)); } catch (Exception e) { e.printStackTrace(); } finally { @@ -165,7 +169,7 @@ public class ApiConfigController { OutputStream os = null; try { os = response.getOutputStream(); - os.write(s.getBytes("utf-8")); + os.write(s.getBytes(StandardCharsets.UTF_8)); } catch (Exception e) { e.printStackTrace(); } finally { @@ -188,7 +192,7 @@ public class ApiConfigController { OutputStream os = null; try { os = response.getOutputStream(); - os.write(s.getBytes("utf-8")); + os.write(s.getBytes(StandardCharsets.UTF_8)); } catch (Exception e) { e.printStackTrace(); } finally { @@ -204,7 +208,7 @@ public class ApiConfigController { @RequestMapping(value = "/import", produces = "application/json;charset=UTF-8") public void uploadFile(@RequestParam("file") MultipartFile file) throws IOException { - String s = IOUtils.toString(file.getInputStream(), "utf-8"); + String s = IOUtils.toString(file.getInputStream(), StandardCharsets.UTF_8); JSONObject jsonObject = JSON.parseObject(s); List configs = JSON.parseArray(jsonObject.getJSONArray("api").toJSONString(), ApiConfig.class); List sqls = JSON.parseArray(jsonObject.getJSONArray("sql").toJSONString(), ApiSql.class); @@ -215,7 +219,7 @@ public class ApiConfigController { @RequestMapping(value = "/importGroup", produces = "application/json;charset=UTF-8") public void importGroup(@RequestParam("file") MultipartFile file) throws IOException { - String s = IOUtils.toString(file.getInputStream(), "utf-8"); + String s = IOUtils.toString(file.getInputStream(), StandardCharsets.UTF_8); List configs = JSON.parseArray(s, Group.class); groupService.insertBatch(configs); @@ -227,8 +231,7 @@ public class ApiConfigController { try { DataSource dataSource = dataSourceService.detail(datasourceId); connection = PoolManager.getPooledConnection(dataSource); - Map map = JSON.parseObject(params, Map.class); - SqlMeta sqlMeta = SqlEngineUtil.getEngine().parse(sql, map); + SqlMeta sqlMeta = SqlEngineUtil.getEngine().parse(sql, JSONObject.parseObject(params)); Object data = JdbcUtil.executeSql(connection, sqlMeta.getSql(), sqlMeta.getJdbcParamValues()); return ResponseDto.successWithData(data); } catch (Exception e) { @@ -247,8 +250,7 @@ public class ApiConfigController { @RequestMapping("/parseDynamicSql") public ResponseDto parseDynamicSql(String sql, String params) { try { - Map map = JSON.parseObject(params, Map.class); - SqlMeta sqlMeta = SqlEngineUtil.getEngine().parse(sql, map); + SqlMeta sqlMeta = SqlEngineUtil.getEngine().parse(sql, JSONObject.parseObject(params)); return ResponseDto.successWithData(sqlMeta); } catch (Exception e) { return ResponseDto.fail(e.getMessage()); diff --git a/dbapi-controller/src/main/java/com/gitee/freakchicken/dbapi/basic/controller/DataSourceController.java b/dbapi-controller/src/main/java/com/gitee/freakchicken/dbapi/basic/controller/DataSourceController.java index 30f3aeb..6f717cf 100644 --- a/dbapi-controller/src/main/java/com/gitee/freakchicken/dbapi/basic/controller/DataSourceController.java +++ b/dbapi-controller/src/main/java/com/gitee/freakchicken/dbapi/basic/controller/DataSourceController.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSON; import com.gitee.freakchicken.dbapi.basic.domain.DataSource; import com.gitee.freakchicken.dbapi.basic.service.DataSourceService; import com.gitee.freakchicken.dbapi.basic.util.JdbcUtil; +import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.IOUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -14,7 +15,6 @@ import org.springframework.web.bind.annotation.RestController; import com.gitee.freakchicken.dbapi.common.ResponseDto; import org.springframework.web.multipart.MultipartFile; -import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.OutputStream; import java.sql.Connection; diff --git a/dbapi-controller/src/main/java/com/gitee/freakchicken/dbapi/basic/controller/SystemController.java b/dbapi-controller/src/main/java/com/gitee/freakchicken/dbapi/basic/controller/SystemController.java index f8f1eef..52d6a8c 100644 --- a/dbapi-controller/src/main/java/com/gitee/freakchicken/dbapi/basic/controller/SystemController.java +++ b/dbapi-controller/src/main/java/com/gitee/freakchicken/dbapi/basic/controller/SystemController.java @@ -1,13 +1,11 @@ package com.gitee.freakchicken.dbapi.basic.controller; -import com.gitee.freakchicken.dbapi.basic.service.NacosService; +import jakarta.servlet.http.HttpServletRequest; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import javax.servlet.http.HttpServletRequest; @RestController @Slf4j @@ -19,8 +17,6 @@ public class SystemController { @Value("${dbapi.mode}") String mode; - @Autowired - NacosService nacosService; @Value("${dbapi.api.context}") String apiContext; @@ -42,25 +38,11 @@ public class SystemController { @RequestMapping("/getIPPort") public String getIPPort(HttpServletRequest request) { - - if ("standalone".equals(mode)) { - return request.getServerName() + ":" + request.getServerPort() + "/" + apiContext; - } else if ("cluster".equals(mode)) { - return nacosService.getGatewayAddress() + "/" + apiContext; - } else { - return null; - } + return request.getServerName() + ":" + request.getServerPort() + "/" + apiContext; } @RequestMapping("/getIP") public String getIP(HttpServletRequest request) { - - if ("standalone".equals(mode)) { - return request.getServerName() + ":" + request.getServerPort(); - } else if ("cluster".equals(mode)) { - return nacosService.getGatewayAddress(); - } else { - return null; - } + return request.getServerName() + ":" + request.getServerPort(); } } diff --git a/dbapi-controller/src/main/java/com/gitee/freakchicken/dbapi/basic/controller/SystemControllerBack.java b/dbapi-controller/src/main/java/com/gitee/freakchicken/dbapi/basic/controller/SystemControllerBack.java new file mode 100644 index 0000000..531250a --- /dev/null +++ b/dbapi-controller/src/main/java/com/gitee/freakchicken/dbapi/basic/controller/SystemControllerBack.java @@ -0,0 +1,68 @@ +/* +package com.gitee.freakchicken.dbapi.basic.controller; + +import com.gitee.freakchicken.dbapi.basic.service.NacosService; +import jakarta.servlet.http.HttpServletRequest; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + + +@RestController +@Slf4j +@RequestMapping("/system") +public class SystemControllerBack { + @Value("${version}") + String version; + + @Value("${dbapi.mode}") + String mode; + + @Autowired + NacosService nacosService; + + @Value("${dbapi.api.context}") + String apiContext; + + @RequestMapping("/version") + public String getVersion() { + return version; + } + + @RequestMapping("/mode") + public String mode() { + String docker = System.getenv("DOCKER"); + if ("true".equals(docker)) { + return mode + " in docker"; + } else { + return mode; + } + } + + @RequestMapping("/getIPPort") + public String getIPPort(HttpServletRequest request) { + + if ("standalone".equals(mode)) { + return request.getServerName() + ":" + request.getServerPort() + "/" + apiContext; + } else if ("cluster".equals(mode)) { + return nacosService.getGatewayAddress() + "/" + apiContext; + } else { + return null; + } + } + + @RequestMapping("/getIP") + public String getIP(HttpServletRequest request) { + + if ("standalone".equals(mode)) { + return request.getServerName() + ":" + request.getServerPort(); + } else if ("cluster".equals(mode)) { + return nacosService.getGatewayAddress(); + } else { + return null; + } + } +} +*/ diff --git a/dbapi-plugin/pom.xml b/dbapi-plugin/pom.xml index c61df3c..4f376c2 100644 --- a/dbapi-plugin/pom.xml +++ b/dbapi-plugin/pom.xml @@ -5,7 +5,7 @@ com.gitee.freakchicken.dbapi dbapi - 3.3.0 + 3.2.1 4.0.0 @@ -15,8 +15,8 @@ https://gitee.com/freakchicken/db-api - 8 - 8 + 17 + 17 UTF-8 UTF-8 UTF-8 @@ -33,38 +33,32 @@ com.alibaba fastjson - 1.2.62 - + ch.qos.logback logback-core - 1.2.3 ch.qos.logback logback-access - 1.2.3 ch.qos.logback logback-classic - 1.2.3 - - - javax.servlet - javax.servlet-api org.apache.commons commons-email - 1.5 + + + org.apache.tomcat.embed + tomcat-embed-core @@ -80,41 +74,6 @@ - - - - org.apache.maven.plugins - maven-javadoc-plugin - - - attach-javadocs - - jar - - - - -Xdoclint:none - - - - - - - - - - org.apache.maven.plugins - maven-source-plugin - - - attach-sources - - jar - - - - - \ No newline at end of file diff --git a/dbapi-plugin/src/main/java/com/gitee/freakchicken/dbapi/plugin/AlarmPlugin.java b/dbapi-plugin/src/main/java/com/gitee/freakchicken/dbapi/plugin/AlarmPlugin.java index e217a89..7efcd3e 100644 --- a/dbapi-plugin/src/main/java/com/gitee/freakchicken/dbapi/plugin/AlarmPlugin.java +++ b/dbapi-plugin/src/main/java/com/gitee/freakchicken/dbapi/plugin/AlarmPlugin.java @@ -2,10 +2,10 @@ package com.gitee.freakchicken.dbapi.plugin; import com.gitee.freakchicken.dbapi.common.ApiConfig; +import jakarta.servlet.http.HttpServletRequest; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.servlet.http.HttpServletRequest; public abstract class AlarmPlugin implements BasePlugin { diff --git a/dbapi-plugin/src/main/java/com/gitee/freakchicken/dbapi/plugin/impl/EmailAlarmPlugin.java b/dbapi-plugin/src/main/java/com/gitee/freakchicken/dbapi/plugin/impl/EmailAlarmPlugin.java index 30f5706..6f37925 100644 --- a/dbapi-plugin/src/main/java/com/gitee/freakchicken/dbapi/plugin/impl/EmailAlarmPlugin.java +++ b/dbapi-plugin/src/main/java/com/gitee/freakchicken/dbapi/plugin/impl/EmailAlarmPlugin.java @@ -3,12 +3,12 @@ package com.gitee.freakchicken.dbapi.plugin.impl; import com.gitee.freakchicken.dbapi.common.ApiConfig; import com.gitee.freakchicken.dbapi.plugin.AlarmPlugin; import com.gitee.freakchicken.dbapi.plugin.PluginConf; +import jakarta.servlet.http.HttpServletRequest; import org.apache.commons.mail.DefaultAuthenticator; import org.apache.commons.mail.Email; import org.apache.commons.mail.EmailException; import org.apache.commons.mail.SimpleEmail; -import javax.servlet.http.HttpServletRequest; import java.text.MessageFormat; import java.text.SimpleDateFormat; import java.util.Date; diff --git a/dbapi-service/pom.xml b/dbapi-service/pom.xml index d2e9a99..0161de0 100644 --- a/dbapi-service/pom.xml +++ b/dbapi-service/pom.xml @@ -5,15 +5,15 @@ dbapi com.gitee.freakchicken.dbapi - 3.3.0 + 3.2.1 4.0.0 dbapi-service - 8 - 8 + 17 + 17 UTF-8 UTF-8 UTF-8 @@ -22,7 +22,6 @@ - com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery @@ -37,87 +36,23 @@ com.gitee.freakchicken.dbapi dbapi-plugin - - - javax.servlet - javax.servlet-api - 3.1.0 - - com.auth0 java-jwt 3.8.3 - - com.taosdata.jdbc - taos-jdbcdriver - 2.0.18 - - - - org.apache.hive - hive-jdbc - 1.1.0 - - - servlet-api - javax.servlet - - - derby - org.apache.derby - - - slf4j-log4j12 - org.slf4j - - - slf4j-api - org.slf4j - - - jetty-all - org.eclipse.jetty.aggregate - - - - - - org.apache.hadoop - hadoop-common - 2.7.5 - - - servlet-api - javax.servlet - - - slf4j-log4j12 - org.slf4j - - - slf4j-api - org.slf4j - - - - mysql mysql-connector-java - 8.0.15 org.postgresql postgresql - 42.1.4 com.microsoft.sqlserver mssql-jdbc - 6.1.0.jre8 slf4j-api @@ -128,7 +63,6 @@ ru.yandex.clickhouse clickhouse-jdbc - 0.2.4 slf4j-api @@ -137,34 +71,29 @@ - org.apache.kylin - kylin-jdbc - 3.1.1 + com.baomidou + mybatis-plus-boot-starter - slf4j-api - org.slf4j + org.springframework.boot + spring-boot-dependencies + + + org.mybatis + mybatis-spring - + - org.xerial - sqlite-jdbc - 3.23.1 + org.mybatis + mybatis-spring + 3.0.1 - - - - - - - com.baomidou - mybatis-plus-boot-starter - 3.2.0 + dynamic-datasource-spring-boot-starter slf4j-api @@ -172,23 +101,13 @@ - - com.baomidou - dynamic-datasource-spring-boot-starter - 3.2.0 - - - slf4j-api - org.slf4j - - + org.xerial + sqlite-jdbc - com.alibaba druid - 1.1.9 @@ -200,12 +119,10 @@ com.alibaba fastjson - 1.2.62 commons-io commons-io - 2.6 @@ -233,7 +150,6 @@ net.sf.ehcache ehcache - 2.10.6 slf4j-api @@ -245,40 +161,20 @@ io.github.freakchick orange - 1.0 commons-codec commons-codec - 1.15 - org.springframework - spring-web + org.springframework.boot + spring-boot-starter-web - org.springframework.kafka spring-kafka - - - org.elasticsearch.client - elasticsearch-rest-client - 8.5.3 - - - - org.apache.commons - commons-text - 1.9 - - @@ -289,8 +185,9 @@ org.apache.maven.plugins maven-jar-plugin + 3.3.0 - + **/*.xml **/*.properties **/*.db diff --git a/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/dao/ApiSqlMapper.java b/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/dao/ApiSqlMapper.java index 6a852f2..eb995ef 100644 --- a/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/dao/ApiSqlMapper.java +++ b/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/dao/ApiSqlMapper.java @@ -1,8 +1,7 @@ package com.gitee.freakchicken.dbapi.basic.dao; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.gitee.freakchicken.dbapi.basic.domain.ApiSql; - +import com.gitee.freakchicken.dbapi.common.ApiSql; import org.apache.ibatis.annotations.Delete; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; diff --git a/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/domain/ESApiConfig.java b/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/domain/ESApiConfig.java deleted file mode 100644 index 1dee19f..0000000 --- a/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/domain/ESApiConfig.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.gitee.freakchicken.dbapi.basic.domain; - -import com.baomidou.mybatisplus.annotation.FieldStrategy; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.io.Serializable; - -@Data -@TableName(value = "es_api_config") -public class ESApiConfig implements Serializable { - - @TableField("api_id") - String apiId; - - @TableField - String method; - - @TableField - String endpoint; - - @TableField - String body; - - @TableField - String alarmPlugin; - - @TableField - String alarmPluginParam; - - @TableField(value = "cache_plugin", insertStrategy = FieldStrategy.NOT_EMPTY) - String cachePlugin; - - @TableField(value = "cache_plugin_params", updateStrategy = FieldStrategy.IGNORED) - String cachePluginParams; - - @TableField(value = "transform_plugin", insertStrategy = FieldStrategy.NOT_EMPTY) - String transformPlugin; - - @TableField(value = "transform_plugin_params") - String transformPluginParams; - -} diff --git a/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/es/ESClientPool.java b/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/es/ESClientPool.java deleted file mode 100644 index 4e7b49d..0000000 --- a/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/es/ESClientPool.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.gitee.freakchicken.dbapi.basic.es; - -import org.apache.commons.pool2.impl.GenericObjectPool; -import org.apache.commons.pool2.impl.GenericObjectPoolConfig; -import org.elasticsearch.client.RestClient; - -public class ESClientPool { - - GenericObjectPool pool; - - public ESClientPool(String address) { - GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig<>(); - poolConfig.setMinEvictableIdleTimeMillis(10000); - poolConfig.setNumTestsPerEvictionRun(3); - poolConfig.setMaxIdle(3); - poolConfig.setMaxTotal(5); - poolConfig.setMinIdle(1); - poolConfig.setMinEvictableIdleTimeMillis(-1); - poolConfig.setTestOnBorrow(false); - poolConfig.setTestOnReturn(false); - pool = new GenericObjectPool(new RestClientFactory(address), poolConfig); - } - - public RestClient getConnection() throws Exception { - return pool.borrowObject(); - } - - public void closeConnection(RestClient client){ - pool.returnObject(client); - } - - public void close(){ - pool.close(); - } - -} diff --git a/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/es/ESPoolManager.java b/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/es/ESPoolManager.java deleted file mode 100644 index ba164df..0000000 --- a/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/es/ESPoolManager.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.gitee.freakchicken.dbapi.basic.es; -import org.elasticsearch.client.RestClient; - -import com.gitee.freakchicken.dbapi.basic.domain.DataSource; - -import java.util.concurrent.ConcurrentHashMap; - -/** - * @program: api - * @description: - * @author: jiangqiang - * @create: 2020-12-11 10:51 - **/ - -public class ESPoolManager { - - //所有数据源的连接池存在map里 - static ConcurrentHashMap map = new ConcurrentHashMap<>(); - - public static RestClient getJdbcConnectionPool(DataSource dataSource) throws Exception { - ESClientPool pool = new ESClientPool(dataSource.getUrl()); - map.put(dataSource.getId(),pool); - return pool.getConnection(); - } - - //删除数据库连接池 - public static void removeJdbcConnectionPool(String id) { - ESClientPool pool = map.get(id); - pool.close(); - - } - - public static RestClient getPooledConnection(DataSource dataSource) throws Exception { - ESClientPool pool = map.get(dataSource.getId()); - RestClient connection = pool.getConnection(); - return connection; - } -} \ No newline at end of file diff --git a/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/es/RestClientFactory.java b/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/es/RestClientFactory.java deleted file mode 100644 index c573b7c..0000000 --- a/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/es/RestClientFactory.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.gitee.freakchicken.dbapi.basic.es; - -import org.apache.commons.pool2.PooledObject; -import org.apache.commons.pool2.PooledObjectFactory; -import org.apache.commons.pool2.impl.DefaultPooledObject; -import org.apache.http.HttpHost; -import org.elasticsearch.client.RestClient; - -import java.util.Arrays; -import java.util.List; -import java.util.stream.Collectors; - -public class RestClientFactory implements PooledObjectFactory { - - HttpHost[] httpHosts; - - public RestClientFactory(String address) { - String[] hosts = address.split(","); - List list = Arrays.asList(hosts).stream().map(t -> { - String[] hostPort = t.split(";"); - return new HttpHost(hostPort[0], Integer.parseInt(hostPort[1]), "http"); - }).collect(Collectors.toList()); - httpHosts = list.toArray(new HttpHost[list.size()]); - } - - @Override - public PooledObject makeObject() throws Exception { - RestClient restClient = RestClient.builder(httpHosts).build(); - return new DefaultPooledObject<>(restClient); - } - - @Override - public void destroyObject(PooledObject pooledObject) throws Exception { - pooledObject.getObject().close(); - } - - @Override - public boolean validateObject(PooledObject pooledObject) { - return false; - } - - @Override - public void activateObject(PooledObject pooledObject) throws Exception { - - } - - @Override - public void passivateObject(PooledObject pooledObject) throws Exception { - - } -} diff --git a/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/executor/ESExecutor.java b/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/executor/ESExecutor.java deleted file mode 100644 index 460030b..0000000 --- a/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/executor/ESExecutor.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.gitee.freakchicken.dbapi.basic.executor; - -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; -import com.gitee.freakchicken.dbapi.basic.domain.DataSource; - -import com.gitee.freakchicken.dbapi.common.ApiConfig; -import com.gitee.freakchicken.dbapi.common.ResponseDto; -import com.gitee.freakchicken.dbapi.plugin.CachePlugin; - -import org.elasticsearch.client.Request; -import org.elasticsearch.client.RestClient; -import org.springframework.stereotype.Component; - -import java.util.Map; - -import javax.servlet.http.HttpServletRequest; - -import org.elasticsearch.client.Response; -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.text.StringSubstitutor; -import org.apache.http.HttpEntity; -import org.springframework.beans.factory.annotation.Autowired; -import org.apache.http.util.EntityUtils; -import com.gitee.freakchicken.dbapi.basic.service.ESApiConfigService; -import com.gitee.freakchicken.dbapi.basic.domain.ESApiConfig; -import com.gitee.freakchicken.dbapi.basic.es.ESPoolManager; -import com.gitee.freakchicken.dbapi.basic.util.ThreadUtils; - -import com.gitee.freakchicken.dbapi.plugin.PluginManager; - -import com.gitee.freakchicken.dbapi.plugin.AlarmPlugin; -import lombok.extern.slf4j.Slf4j; - -@Slf4j -@Component -public class ESExecutor { - - @Autowired - ESApiConfigService ESApiConfigService; - - public ResponseDto execute(ApiConfig config, DataSource datasource, Map param, - HttpServletRequest servletRequest) - throws Exception { - - ESApiConfig eSApiConfig = null; - try { - - eSApiConfig = ESApiConfigService.getConfigByApiId(config.getId()); - // 从缓存获取数据 - if (StringUtils.isNoneBlank(eSApiConfig.getCachePlugin())) { - CachePlugin cachePlugin = PluginManager.getCachePlugin(eSApiConfig.getCachePlugin()); - Object o = cachePlugin.get(config, param); - if (o != null) { - return ResponseDto.apiSuccess(o); // 如果缓存有数据直接返回 - } - } - - RestClient restClient = ESPoolManager.getPooledConnection(datasource); - - Request request = new Request(eSApiConfig.getMethod(), eSApiConfig.getEndpoint()); - - StringSubstitutor StringSubstitutor = new StringSubstitutor(param); - String content = StringSubstitutor.replace(eSApiConfig.getBody()); - request.setJsonEntity(content); - - Response response = restClient.performRequest(request); - HttpEntity entity = response.getEntity(); - String s = EntityUtils.toString(entity); - JSONObject parseObject = JSON.parseObject(s); - - return ResponseDto.apiSuccess(parseObject); - } catch (Exception e) { - if (StringUtils.isNotBlank(eSApiConfig.getAlarmPlugin())) { - try { - String pluginParam = eSApiConfig.getAlarmPluginParam(); - AlarmPlugin alarmPlugin = PluginManager.getAlarmPlugin(eSApiConfig.getAlarmPlugin()); - ThreadUtils.submitAlarmTask(new Runnable() { - @Override - public void run() { - alarmPlugin.alarm(e, config, servletRequest, pluginParam); - } - }); - } catch (Exception error) { - log.error(eSApiConfig.getAlarmPlugin() + " error!", error); - } - } - throw new RuntimeException(e.getMessage()); - } - } - -} diff --git a/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/executor/SQLExecutor.java b/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/executor/SQLExecutor.java deleted file mode 100644 index 8ddfccd..0000000 --- a/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/executor/SQLExecutor.java +++ /dev/null @@ -1,141 +0,0 @@ -package com.gitee.freakchicken.dbapi.basic.executor; - -import com.alibaba.druid.pool.DruidPooledConnection; - -import com.alibaba.fastjson.JSONObject; -import com.gitee.freakchicken.dbapi.basic.domain.ApiSql; -import com.gitee.freakchicken.dbapi.basic.domain.DataSource; -import com.gitee.freakchicken.dbapi.basic.domain.SQLApiConfig; -import com.gitee.freakchicken.dbapi.basic.util.JdbcUtil; -import com.gitee.freakchicken.dbapi.basic.util.PoolManager; -import com.gitee.freakchicken.dbapi.basic.util.SqlEngineUtil; -import com.gitee.freakchicken.dbapi.basic.util.ThreadUtils; -import com.gitee.freakchicken.dbapi.basic.service.SQLApiConfigService; - -import com.gitee.freakchicken.dbapi.common.ApiConfig; -import com.gitee.freakchicken.dbapi.common.ResponseDto; -import com.gitee.freakchicken.dbapi.plugin.CachePlugin; -import com.gitee.freakchicken.dbapi.plugin.PluginManager; -import com.gitee.freakchicken.dbapi.plugin.TransformPlugin; -import com.gitee.freakchicken.dbapi.plugin.AlarmPlugin; -import com.github.freakchick.orange.SqlMeta; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import java.sql.Connection; -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import javax.servlet.http.HttpServletRequest; - -@Slf4j -@Component -public class SQLExecutor { - - @Autowired - SQLApiConfigService SQLApiConfigService; - - public ResponseDto execute(ApiConfig config, DataSource datasource, Map sqlParam, HttpServletRequest request) throws Exception { - SQLApiConfig SQLApiConfig = null; - try { - SQLApiConfig = SQLApiConfigService.getConfigByApiId(config.getId()); - - // 从缓存获取数据 - if (StringUtils.isNoneBlank(SQLApiConfig.getCachePlugin())) { - CachePlugin cachePlugin = PluginManager.getCachePlugin(SQLApiConfig.getCachePlugin()); - Object o = cachePlugin.get(config, sqlParam); - if (o != null) { - return ResponseDto.apiSuccess(o); // 如果缓存有数据直接返回 - } - } - - List sqlList = SQLApiConfig.getSqlList(); - - DruidPooledConnection connection = PoolManager.getPooledConnection(datasource); - boolean flag = SQLApiConfig.getOpenTrans() == 1 ? true : false; - // 执行sql - List dataList = executeSql(connection, sqlList, sqlParam, flag); - - // 执行数据转换 - for (int i = 0; i < sqlList.size(); i++) { - ApiSql apiSql = sqlList.get(i); - Object data = dataList.get(i); - // 如果此单条sql是查询类sql,并且配置了数据转换插件 - if (data instanceof Iterable && StringUtils.isNotBlank(apiSql.getTransformPlugin())) { - log.info("transform plugin execute"); - List sourceData = (List) (data); // 查询类sql的返回结果才可以这样强制转换,只有查询类sql才可以配置转换插件 - TransformPlugin transformPlugin = PluginManager.getTransformPlugin(apiSql.getTransformPlugin()); - Object resData = transformPlugin.transform(sourceData, apiSql.getTransformPluginParams()); - dataList.set(i, resData);// 重新设置值 - } - } - Object res = dataList; - // 如果只有单条sql,返回结果不是数组格式 - if (dataList.size() == 1) { - res = dataList.get(0); - } - ResponseDto dto = ResponseDto.apiSuccess(res); - // 设置缓存 - if (StringUtils.isNoneBlank(SQLApiConfig.getCachePlugin())) { - CachePlugin cachePlugin = PluginManager.getCachePlugin(SQLApiConfig.getCachePlugin()); - cachePlugin.set(config, sqlParam, dto.getData()); - } - return dto; - } catch (Exception e) { - if (StringUtils.isNotBlank(SQLApiConfig.getAlarmPlugin())) { - try { - String param = SQLApiConfig.getAlarmPluginParam(); - AlarmPlugin alarmPlugin = PluginManager.getAlarmPlugin(SQLApiConfig.getAlarmPlugin()); - ThreadUtils.submitAlarmTask(new Runnable() { - @Override - public void run() { - alarmPlugin.alarm(e, config, request, param); - } - }); - } catch (Exception error) { - log.error(SQLApiConfig.getAlarmPlugin() + " error!", error); - } - } - throw new RuntimeException(e.getMessage()); - } - } - - public List executeSql(Connection connection, List sqlList, Map sqlParam, - boolean flag) { - List dataList = new ArrayList<>(); - try { - if (flag) - connection.setAutoCommit(false); - else - connection.setAutoCommit(true); - for (ApiSql apiSql : sqlList) { - SqlMeta sqlMeta = SqlEngineUtil.getEngine().parse(apiSql.getSqlText(), sqlParam); - Object data = JdbcUtil.executeSql(connection, sqlMeta.getSql(), sqlMeta.getJdbcParamValues()); - dataList.add(data); - } - if (flag) - connection.commit(); - return dataList; - } catch (Exception e) { - try { - if (flag) - connection.rollback(); - } catch (SQLException ex) { - ex.printStackTrace(); - } - throw new RuntimeException(e); - } finally { - if (connection != null) { - try { - connection.close(); - } catch (SQLException e) { - e.printStackTrace(); - } - } - } - } -} diff --git a/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/filter/ApiAuthFilter.java b/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/filter/ApiAuthFilter.java index 602c2d7..7b599af 100644 --- a/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/filter/ApiAuthFilter.java +++ b/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/filter/ApiAuthFilter.java @@ -10,6 +10,9 @@ import com.gitee.freakchicken.dbapi.basic.util.IPUtil; import com.gitee.freakchicken.dbapi.basic.util.ThreadUtils; import com.gitee.freakchicken.dbapi.common.ApiConfig; import com.gitee.freakchicken.dbapi.common.ResponseDto; +import jakarta.servlet.*; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; @@ -17,10 +20,6 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; - -import javax.servlet.*; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.List; import java.util.UUID; diff --git a/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/filter/ApiHeaderFilter.java b/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/filter/ApiHeaderFilter.java index 7c9cbc5..309471f 100644 --- a/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/filter/ApiHeaderFilter.java +++ b/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/filter/ApiHeaderFilter.java @@ -1,9 +1,9 @@ package com.gitee.freakchicken.dbapi.basic.filter; +import jakarta.servlet.*; +import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; -import javax.servlet.*; -import javax.servlet.http.HttpServletResponse; import java.io.IOException; @Slf4j diff --git a/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/filter/ApiIPFilter.java b/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/filter/ApiIPFilter.java index 0d8bc59..ead3a87 100644 --- a/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/filter/ApiIPFilter.java +++ b/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/filter/ApiIPFilter.java @@ -4,15 +4,15 @@ import com.alibaba.fastjson.JSON; import com.gitee.freakchicken.dbapi.basic.service.IPService; import com.gitee.freakchicken.dbapi.basic.util.IPUtil; import com.gitee.freakchicken.dbapi.common.ResponseDto; +import jakarta.servlet.*; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import lombok.AllArgsConstructor; import lombok.Data; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import javax.servlet.*; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; diff --git a/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/log/AccessLogKafkaReader.java b/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/log/AccessLogKafkaReader.java index 95366f6..58cd860 100644 --- a/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/log/AccessLogKafkaReader.java +++ b/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/log/AccessLogKafkaReader.java @@ -3,6 +3,7 @@ package com.gitee.freakchicken.dbapi.basic.log; import com.alibaba.fastjson.JSON; import com.gitee.freakchicken.dbapi.basic.dao.AccessLogMapper; import com.gitee.freakchicken.dbapi.basic.domain.AccessLog; +import jakarta.annotation.PostConstruct; import org.apache.kafka.clients.consumer.ConsumerConfig; import org.apache.kafka.clients.consumer.ConsumerRecord; import org.apache.kafka.clients.consumer.ConsumerRecords; @@ -16,9 +17,11 @@ import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; import org.springframework.boot.builder.SpringApplicationBuilder; -import javax.annotation.PostConstruct; +import java.time.Duration; +import java.time.temporal.ChronoUnit; import java.util.Collections; import java.util.Properties; +import java.util.concurrent.TimeUnit; @MapperScan("com.gitee.freakchicken.dbapi.basic.dao") @EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class}) @@ -56,7 +59,7 @@ public class AccessLogKafkaReader { consumer.subscribe(Collections.singletonList(topic)); while (true) { - ConsumerRecords consumerRecords = consumer.poll(100); + ConsumerRecords consumerRecords = consumer.poll(Duration.of(100, ChronoUnit.MILLIS)); for (ConsumerRecord record : consumerRecords) { AccessLog accessLog = JSON.parseObject(record.value().toString(), AccessLog.class); diff --git a/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/service/ApiConfigService.java b/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/service/ApiConfigService.java index b8c0207..1af43c5 100644 --- a/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/service/ApiConfigService.java +++ b/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/service/ApiConfigService.java @@ -9,10 +9,10 @@ import com.gitee.freakchicken.dbapi.basic.dao.ApiSqlMapper; import com.gitee.freakchicken.dbapi.basic.dao.DataSourceMapper; import com.gitee.freakchicken.dbapi.basic.dao.AlarmMapper; import com.gitee.freakchicken.dbapi.basic.domain.ApiDto; -import com.gitee.freakchicken.dbapi.basic.domain.ApiSql; import com.gitee.freakchicken.dbapi.basic.util.UUIDUtil; import com.gitee.freakchicken.dbapi.common.ApiConfig; import com.gitee.freakchicken.dbapi.basic.domain.Alarm; +import com.gitee.freakchicken.dbapi.common.ApiSql; import com.gitee.freakchicken.dbapi.common.ResponseDto; import com.gitee.freakchicken.dbapi.plugin.CachePlugin; import com.gitee.freakchicken.dbapi.plugin.PluginManager; diff --git a/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/service/ApiService.java b/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/service/ApiService.java index 3b9bdf1..52229be 100644 --- a/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/service/ApiService.java +++ b/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/service/ApiService.java @@ -5,11 +5,11 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.dynamic.datasource.annotation.DS; import com.gitee.freakchicken.dbapi.common.ApiConfig; +import jakarta.servlet.http.HttpServletRequest; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; -import javax.servlet.http.HttpServletRequest; import java.util.*; import java.util.stream.Collectors; diff --git a/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/service/ESApiConfigService.java b/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/service/ESApiConfigService.java deleted file mode 100644 index 6192ddd..0000000 --- a/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/service/ESApiConfigService.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.gitee.freakchicken.dbapi.basic.service; - -import org.springframework.stereotype.Service; - -import com.gitee.freakchicken.dbapi.basic.domain.ESApiConfig; - -@Service -public class ESApiConfigService { - - public ESApiConfig getConfigByApiId(String apiId){ - return null; - } -} diff --git a/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/service/IPService.java b/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/service/IPService.java index 7385298..836e421 100644 --- a/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/service/IPService.java +++ b/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/service/IPService.java @@ -3,13 +3,13 @@ package com.gitee.freakchicken.dbapi.basic.service; import com.baomidou.dynamic.datasource.annotation.DS; import com.gitee.freakchicken.dbapi.basic.dao.IPMapper; import com.gitee.freakchicken.dbapi.basic.util.IPRuleCache; +import jakarta.annotation.PostConstruct; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import javax.annotation.PostConstruct; import java.util.*; import java.util.stream.Collectors; diff --git a/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/service/SQLApiConfigService.java b/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/service/SQLApiConfigService.java deleted file mode 100644 index 8dcca21..0000000 --- a/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/service/SQLApiConfigService.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.gitee.freakchicken.dbapi.basic.service; - -import org.springframework.stereotype.Service; - -import com.gitee.freakchicken.dbapi.basic.domain.SQLApiConfig; - -@Service -public class SQLApiConfigService { - - public SQLApiConfig getConfigByApiId(String apiId){ - return null; - } - -} diff --git a/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/servlet/APIServlet.java b/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/servlet/APIServlet.java index d27d25c..79da041 100644 --- a/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/servlet/APIServlet.java +++ b/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/servlet/APIServlet.java @@ -1,36 +1,45 @@ package com.gitee.freakchicken.dbapi.basic.servlet; +import com.alibaba.druid.pool.DruidPooledConnection; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.TypeReference; import com.gitee.freakchicken.dbapi.basic.domain.DataSource; -import com.gitee.freakchicken.dbapi.basic.executor.SQLExecutor; -import com.gitee.freakchicken.dbapi.basic.executor.ESExecutor; import com.gitee.freakchicken.dbapi.basic.service.ApiConfigService; import com.gitee.freakchicken.dbapi.basic.service.ApiService; import com.gitee.freakchicken.dbapi.basic.service.DataSourceService; import com.gitee.freakchicken.dbapi.basic.service.IPService; - +import com.gitee.freakchicken.dbapi.basic.util.JdbcUtil; +import com.gitee.freakchicken.dbapi.basic.util.PoolManager; +import com.gitee.freakchicken.dbapi.basic.util.SqlEngineUtil; +import com.gitee.freakchicken.dbapi.basic.util.ThreadUtils; import com.gitee.freakchicken.dbapi.common.ApiConfig; - +import com.gitee.freakchicken.dbapi.common.ApiSql; import com.gitee.freakchicken.dbapi.common.ResponseDto; - +import com.gitee.freakchicken.dbapi.plugin.AlarmPlugin; +import com.gitee.freakchicken.dbapi.plugin.CachePlugin; +import com.gitee.freakchicken.dbapi.plugin.PluginManager; +import com.gitee.freakchicken.dbapi.plugin.TransformPlugin; +import com.github.freakchick.orange.SqlMeta; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; - +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.MediaType; import org.springframework.stereotype.Component; - -import javax.servlet.ServletException; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; - +import java.nio.charset.StandardCharsets; +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; import java.util.Map; @Slf4j @@ -50,12 +59,6 @@ public class APIServlet extends HttpServlet { @Value("${dbapi.api.context}") String apiContext; - @Autowired - SQLExecutor SQLExecutor; - - @Autowired - ESExecutor ESExecutor; - @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { log.debug("servlet execute"); @@ -70,6 +73,7 @@ public class APIServlet extends HttpServlet { } catch (Exception e) { response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); + assert out != null; out.append(JSON.toJSONString(ResponseDto.fail(e.toString()))); log.error(e.toString(), e); } finally { @@ -86,7 +90,7 @@ public class APIServlet extends HttpServlet { public ResponseDto process(String path, HttpServletRequest request, HttpServletResponse response) { - // // 校验接口是否存在 +// // 校验接口是否存在 ApiConfig config = apiConfigService.getConfig(path); if (config == null) { response.setStatus(HttpServletResponse.SC_NOT_FOUND); @@ -102,30 +106,107 @@ public class APIServlet extends HttpServlet { Map sqlParam = getParams(request, config); - ResponseDto res = null; - if ("es".equals(datasource.getType())) { - res = ESExecutor.execute(config, datasource, sqlParam, request); - } else { - res = SQLExecutor.execute(config, datasource, sqlParam, request); + //从缓存获取数据 + if (StringUtils.isNoneBlank(config.getCachePlugin())) { + CachePlugin cachePlugin = PluginManager.getCachePlugin(config.getCachePlugin()); + Object o = cachePlugin.get(config, sqlParam); + if (o != null) { + return ResponseDto.apiSuccess(o); //如果缓存有数据直接返回 + } } - return res; - + List sqlList = config.getSqlList(); + DruidPooledConnection connection = PoolManager.getPooledConnection(datasource); + //是否开启事务 + boolean flag = config.getOpenTrans() == 1; + //执行sql + List dataList = executeSql(connection, sqlList, sqlParam, flag); + + //执行数据转换 + for (int i = 0; i < sqlList.size(); i++) { + ApiSql apiSql = sqlList.get(i); + Object data = dataList.get(i); + //如果此单条sql是查询类sql,并且配置了数据转换插件 + if (data instanceof Iterable && StringUtils.isNotBlank(apiSql.getTransformPlugin())) { + log.info("transform plugin execute"); + List sourceData = (List) data; //查询类sql的返回结果才可以这样强制转换,只有查询类sql才可以配置转换插件 + TransformPlugin transformPlugin = PluginManager.getTransformPlugin(apiSql.getTransformPlugin()); + Object resData = transformPlugin.transform(sourceData, apiSql.getTransformPluginParams()); + dataList.set(i, resData);//重新设置值 + } + } + Object res = dataList; + //如果只有单条sql,返回结果不是数组格式 + if (dataList.size() == 1) { + res = dataList.get(0); + } + ResponseDto dto = ResponseDto.apiSuccess(res); + //设置缓存 + if (StringUtils.isNoneBlank(config.getCachePlugin())) { + CachePlugin cachePlugin = PluginManager.getCachePlugin(config.getCachePlugin()); + cachePlugin.set(config, sqlParam, dto.getData()); + } + return dto; } catch (Exception e) { - + //如果API配置了告警 + if (StringUtils.isNotBlank(config.getAlarmPlugin())) { + try { + log.info(config.getAlarmPlugin()); + AlarmPlugin alarmPlugin = PluginManager.getAlarmPlugin(config.getAlarmPlugin()); + ThreadUtils.submitAlarmTask(new Runnable() { + @Override + public void run() { + alarmPlugin.alarm(e, config, request, config.getAlarmPluginParam()); + } + }); + } catch (Exception error) { + log.error(config.getAlarmPlugin() + " error!", error); + } + } throw new RuntimeException(e.getMessage()); } } + public List executeSql(Connection connection, List sqlList, Map sqlParam, boolean flag) { + List dataList = new ArrayList<>(); + try { + connection.setAutoCommit(!flag); + for (ApiSql apiSql : sqlList) { + SqlMeta sqlMeta = SqlEngineUtil.getEngine().parse(apiSql.getSqlText(), sqlParam); + Object data = JdbcUtil.executeSql(connection, sqlMeta.getSql(), sqlMeta.getJdbcParamValues()); + dataList.add(data); + } + if (flag) + connection.commit(); + return dataList; + } catch (Exception e) { + try { + if (flag) + connection.rollback(); + } catch (SQLException ex) { + ex.printStackTrace(); + } + throw new RuntimeException(e); + } finally { + if (connection != null) { + try { + connection.close(); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + } + private Map getParams(HttpServletRequest request, ApiConfig apiConfig) { - /** + /* * Content-Type格式说明: * {@see Content-Type} * type/subtype(;parameter)? type */ String unParseContentType = request.getContentType(); - // 如果是浏览器get请求过来,取出来的contentType是null + //如果是浏览器get请求过来,取出来的contentType是null if (unParseContentType == null) { unParseContentType = MediaType.APPLICATION_FORM_URLENCODED_VALUE; } @@ -135,13 +216,14 @@ public class APIServlet extends HttpServlet { String contentType = contentTypeArr[0]; Map params = null; - // 如果是application/json请求,不管接口规定的content-type是什么,接口都可以访问,且请求参数都以json body 为准 + //如果是application/json请求,不管接口规定的content-type是什么,接口都可以访问,且请求参数都以json body 为准 if (contentType.equalsIgnoreCase(MediaType.APPLICATION_JSON_VALUE)) { JSONObject jo = getHttpJsonBody(request); + assert jo != null; params = JSONObject.parseObject(jo.toJSONString(), new TypeReference>() { }); } - // 如果是application/x-www-form-urlencoded请求,先判断接口规定的content-type是不是确实是application/x-www-form-urlencoded + //如果是application/x-www-form-urlencoded请求,先判断接口规定的content-type是不是确实是application/x-www-form-urlencoded else if (contentType.equalsIgnoreCase(MediaType.APPLICATION_FORM_URLENCODED_VALUE)) { if (MediaType.APPLICATION_FORM_URLENCODED_VALUE.equalsIgnoreCase(apiConfig.getContentType())) { params = apiService.getSqlParam(request, apiConfig); @@ -157,7 +239,7 @@ public class APIServlet extends HttpServlet { private JSONObject getHttpJsonBody(HttpServletRequest request) { try { - InputStreamReader in = new InputStreamReader(request.getInputStream(), "utf-8"); + InputStreamReader in = new InputStreamReader(request.getInputStream(), StandardCharsets.UTF_8); BufferedReader br = new BufferedReader(in); StringBuilder sb = new StringBuilder(); String line = null; @@ -165,8 +247,7 @@ public class APIServlet extends HttpServlet { sb.append(line); } br.close(); - JSONObject jsonObject = JSON.parseObject(sb.toString()); - return jsonObject; + return JSON.parseObject(sb.toString()); } catch (Exception e) { log.error(e.getMessage(), e); } finally { diff --git a/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/servlet/TokenServlet.java b/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/servlet/TokenServlet.java index 89887f5..2c0b95c 100644 --- a/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/servlet/TokenServlet.java +++ b/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/servlet/TokenServlet.java @@ -3,13 +3,13 @@ package com.gitee.freakchicken.dbapi.basic.servlet; import com.alibaba.fastjson.JSON; import com.gitee.freakchicken.dbapi.basic.domain.AppToken; import com.gitee.freakchicken.dbapi.basic.service.AppTokenService; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; import java.io.PrintWriter; @Slf4j diff --git a/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/util/IPUtil.java b/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/util/IPUtil.java index 9d89600..9e9f8be 100644 --- a/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/util/IPUtil.java +++ b/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/util/IPUtil.java @@ -1,6 +1,7 @@ package com.gitee.freakchicken.dbapi.basic.util; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; + import java.io.IOException; import java.net.Inet4Address; import java.net.InetAddress; diff --git a/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/util/MD5.java b/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/util/MD5.java index ca15664..6bfde36 100644 --- a/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/util/MD5.java +++ b/dbapi-service/src/main/java/com/gitee/freakchicken/dbapi/basic/util/MD5.java @@ -1,7 +1,7 @@ package com.gitee.freakchicken.dbapi.basic.util; +import org.apache.commons.codec.binary.Base64; import org.apache.commons.codec.digest.DigestUtils; -import sun.misc.BASE64Encoder; import java.io.UnsupportedEncodingException; import java.security.MessageDigest; @@ -20,10 +20,8 @@ public class MD5 { public static String EncoderByMd5(String str) throws NoSuchAlgorithmException, UnsupportedEncodingException { //确定计算方法 MessageDigest md5 = MessageDigest.getInstance("MD5"); - BASE64Encoder base64en = new BASE64Encoder(); //加密后的字符串 - String newstr = base64en.encode(md5.digest(str.getBytes("utf-8"))); - return newstr; + return Base64.encodeBase64String(md5.digest(str.getBytes("utf-8"))); } /** diff --git a/dbapi-service/src/main/resources/application.properties b/dbapi-service/src/main/resources/application.properties index 552a86e..3c479c5 100644 --- a/dbapi-service/src/main/resources/application.properties +++ b/dbapi-service/src/main/resources/application.properties @@ -5,8 +5,8 @@ server.servlet.encoding.charset=UTF-8 server.servlet.encoding.enabled=true server.tomcat.uri-encoding=UTF-8 -spring.cache.type=ehcache -spring.cache.ehcache.config=classpath:ehcache.xml +spring.cache.redis.time-to-live=180000 +spring.cache.type=redis spring.jackson.date-format=yyyy-MM-dd HH:mm:ss spring.jackson.time-zone=GMT+8 @@ -37,28 +37,28 @@ spring.datasource.dynamic.primary=meta-db dbapi.api.context=api # metadata database address -spring.datasource.dynamic.datasource.meta-db.driver-class-name=org.sqlite.JDBC -spring.datasource.dynamic.datasource.meta-db.url=jdbc:sqlite::resource:sqlite.db -spring.datasource.dynamic.datasource.meta-db.username= -spring.datasource.dynamic.datasource.meta-db.password= +#spring.datasource.dynamic.datasource.meta-db.driver-class-name=org.sqlite.JDBC +#spring.datasource.dynamic.datasource.meta-db.url=jdbc:sqlite::resource:sqlite.db +#spring.datasource.dynamic.datasource.meta-db.username= +#spring.datasource.dynamic.datasource.meta-db.password= # metadata database address -# spring.datasource.dynamic.datasource.meta-db.driver-class-name=com.mysql.cj.jdbc.Driver -# spring.datasource.dynamic.datasource.meta-db.url=jdbc:mysql://127.0.0.1:3306/dbapi?useSSL=false&characterEncoding=UTF-8&serverTimezone=GMT%2B8 -# spring.datasource.dynamic.datasource.meta-db.username=root -# spring.datasource.dynamic.datasource.meta-db.password=root +spring.datasource.dynamic.datasource.meta-db.driver-class-name=com.mysql.cj.jdbc.Driver +spring.datasource.dynamic.datasource.meta-db.url=jdbc:mysql://124.222.180.87:3306/dbapi?useSSL=false&characterEncoding=UTF-8&serverTimezone=GMT%2B8 +spring.datasource.dynamic.datasource.meta-db.username=root +spring.datasource.dynamic.datasource.meta-db.password=Angel5540,. # the writer to write access log to database, value can be null/db/kafka # "db" means dbapi writes access log to database directly # "kafka" means dbapi writes access log to kafka, you need to collect log from kafka to database yourself # "null" means dbapi only writes access log to disk file(logs/dbapi-access.log), you need to collect log from disk to database yourself -access.log.writer=null +access.log.writer=db # access log database(recommend clickhouse) address spring.datasource.dynamic.datasource.access-log-db.driver-class-name=com.mysql.cj.jdbc.Driver -spring.datasource.dynamic.datasource.access-log-db.url=jdbc:mysql://192.168.xx.xx:3306/dbapi?useSSL=false&characterEncoding=UTF-8&serverTimezone=GMT%2B8 -spring.datasource.dynamic.datasource.access-log-db.username= -spring.datasource.dynamic.datasource.access-log-db.password= +spring.datasource.dynamic.datasource.access-log-db.url=jdbc:mysql://124.222.180.87:3306/dbapi?useSSL=false&characterEncoding=UTF-8&serverTimezone=GMT%2B8 +spring.datasource.dynamic.datasource.access-log-db.username=root +spring.datasource.dynamic.datasource.access-log-db.password=Angel5540,. spring.datasource.dynamic.datasource.access-log-db.druid.break-after-acquire-failure=true # kafka address, needed if access.log.writer=kafka @@ -74,9 +74,10 @@ spring.cloud.nacos.discovery.password=nacos spring.cloud.nacos.discovery.namespace=public # redis address, needed if cluster mode -spring.redis.host=localhost -spring.redis.port=6379 -spring.redis.database=0 -spring.redis.password= +spring.data.redis.host=124.222.180.87 +spring.data.redis.port=6379 +spring.data.redis.password=Angel5540,. +spring.data.redis.database=0 + diff --git a/dbapi-service/src/main/resources/application.properties.back b/dbapi-service/src/main/resources/application.properties.back new file mode 100644 index 0000000..0c18dad --- /dev/null +++ b/dbapi-service/src/main/resources/application.properties.back @@ -0,0 +1,82 @@ +version=3.2.1 + +server.servlet.encoding.force=true +server.servlet.encoding.charset=UTF-8 +server.servlet.encoding.enabled=true +server.tomcat.uri-encoding=UTF-8 + +spring.cache.type=ehcache +spring.cache.ehcache.config=classpath:ehcache.xml +spring.jackson.date-format=yyyy-MM-dd HH:mm:ss +spring.jackson.time-zone=GMT+8 + +spring.datasource.type=com.alibaba.druid.pool.DruidDataSource + +#logging.level.com.gitee.freakchicken.dbapi.gateway.filter.GatewayIPFilter=debug +#logging.level.com.gitee.freakchicken.dbapi.basic.filter=debug +#logging.level.com.gitee.freakchicken.dbapi.basic.servlet=debug + +# show mybatis sql +#logging.level.com.gitee.freakchicken.dbapi.basic.dao=debug +#show api Sql +#logging.level.com.gitee.freakchicken.dbapi.basic.util.JdbcUtil=debug +# plugin log level +#logging.level.com.gitee.freakchicken.dbapi.plugin.TransformPlugin=DEBUG +#logging.level.com.gitee.freakchicken.dbapi.plugin.CachePlugin=DEBUG + +# name of role in cluster mode +dbapi.cluster.api.name=DBApi-cluster-apiServer +dbapi.cluster.gateway.name=DBApi-cluster-gateway +dbapi.cluster.manager.name=DBApi-cluster-manager + +spring.datasource.dynamic.druid.filters=stat,slf4j +spring.datasource.dynamic.primary=meta-db + +#################################### please configure properties below ##################################### +# api context +dbapi.api.context=api + +# metadata database address +#spring.datasource.dynamic.datasource.meta-db.driver-class-name=org.sqlite.JDBC +#spring.datasource.dynamic.datasource.meta-db.url=jdbc:sqlite::resource:sqlite.db +#spring.datasource.dynamic.datasource.meta-db.username= +#spring.datasource.dynamic.datasource.meta-db.password= + +# metadata database address + spring.datasource.dynamic.datasource.meta-db.driver-class-name=com.mysql.cj.jdbc.Driver + spring.datasource.dynamic.datasource.meta-db.url=jdbc:mysql://124.222.180.87:3306/dbapi?useSSL=false&characterEncoding=UTF-8&serverTimezone=GMT%2B8 + spring.datasource.dynamic.datasource.meta-db.username=root + spring.datasource.dynamic.datasource.meta-db.password=Angel5540,. + +# the writer to write access log to database, value can be null/db/kafka +# "db" means dbapi writes access log to database directly +# "kafka" means dbapi writes access log to kafka, you need to collect log from kafka to database yourself +# "null" means dbapi only writes access log to disk file(logs/dbapi-access.log), you need to collect log from disk to database yourself +access.log.writer=db + +# access log database(recommend clickhouse) address +spring.datasource.dynamic.datasource.access-log-db.driver-class-name=com.mysql.cj.jdbc.Driver +spring.datasource.dynamic.datasource.access-log-db.url=jdbc:mysql://124.222.180.87:3306/dbapi?useSSL=false&characterEncoding=UTF-8&serverTimezone=GMT%2B8 +spring.datasource.dynamic.datasource.access-log-db.username=root +spring.datasource.dynamic.datasource.access-log-db.password=Angel5540,. +spring.datasource.dynamic.datasource.access-log-db.druid.break-after-acquire-failure=true + +# kafka address, needed if access.log.writer=kafka +access.log.kafka.topic=dbapi_access_log +spring.kafka.bootstrap-servers=127.0.0.1:9092 + +############################## if cluster, please configure properties below ############################## + +# nacos address, needed if cluster mode +spring.cloud.nacos.server-addr=127.0.0.1:8848 +spring.cloud.nacos.discovery.username=nacos +spring.cloud.nacos.discovery.password=nacos +spring.cloud.nacos.discovery.namespace=public + +# redis address, needed if cluster mode +spring.redis.host=124.222.180.87 +spring.redis.port=6379 +spring.redis.database=0 +spring.redis.password=Angel5540,. + + diff --git a/dbapi-standalone/pom.xml b/dbapi-standalone/pom.xml index 4d085ac..1cdafbe 100644 --- a/dbapi-standalone/pom.xml +++ b/dbapi-standalone/pom.xml @@ -5,7 +5,7 @@ com.gitee.freakchicken.dbapi dbapi - 3.3.0 + 3.2.1 4.0.0 @@ -13,8 +13,8 @@ 包含controller html; servlet; filter - 8 - 8 + 17 + 17 UTF-8 UTF-8 UTF-8 @@ -27,12 +27,6 @@ com.gitee.freakchicken.dbapi dbapi-controller - - - - - - @@ -48,8 +42,9 @@ + org.apache.maven.plugins maven-clean-plugin - 3.1.0 + 3.2.0 true @@ -67,6 +62,7 @@ org.apache.maven.plugins maven-jar-plugin + 3.3.0 **/*.xml diff --git a/dbapi-standalone/src/main/java/com/gitee/freakchicken/dbapi/DBApiStandalone.java b/dbapi-standalone/src/main/java/com/gitee/freakchicken/dbapi/DBApiStandalone.java index 5565098..06db7be 100644 --- a/dbapi-standalone/src/main/java/com/gitee/freakchicken/dbapi/DBApiStandalone.java +++ b/dbapi-standalone/src/main/java/com/gitee/freakchicken/dbapi/DBApiStandalone.java @@ -17,6 +17,12 @@ import org.springframework.scheduling.annotation.EnableAsync; public class DBApiStandalone { public static void main(String[] args) { System.setProperty("spring.profiles.active","standalone"); - SpringApplication.run(DBApiStandalone.class, args); + + try { + SpringApplication.run(DBApiStandalone.class, args); + }catch(Throwable e) { + e.printStackTrace(); + } + } } diff --git a/dbapi-standalone/src/main/java/com/gitee/freakchicken/dbapi/conf/FilterConfig.java b/dbapi-standalone/src/main/java/com/gitee/freakchicken/dbapi/conf/FilterConfig.java index 542d12f..dc3e23f 100644 --- a/dbapi-standalone/src/main/java/com/gitee/freakchicken/dbapi/conf/FilterConfig.java +++ b/dbapi-standalone/src/main/java/com/gitee/freakchicken/dbapi/conf/FilterConfig.java @@ -3,6 +3,7 @@ package com.gitee.freakchicken.dbapi.conf; import com.gitee.freakchicken.dbapi.basic.filter.ApiAuthFilter; import com.gitee.freakchicken.dbapi.basic.filter.ApiHeaderFilter; import com.gitee.freakchicken.dbapi.basic.filter.ApiIPFilter; +import jakarta.servlet.Filter; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; @@ -30,11 +31,11 @@ public class FilterConfig { @Bean - public FilterRegistrationBean apiHeaderFilter() { + public FilterRegistrationBean apiHeaderFilter() { // issues/I51LOI int apiHeaderFilterOrder = 1; String format = String.format("/%s/*", apiContext); - FilterRegistrationBean registrationBean = new FilterRegistrationBean(); + FilterRegistrationBean registrationBean = new FilterRegistrationBean<>(); registrationBean.setFilter(new ApiHeaderFilter()); registrationBean.addUrlPatterns(format); registrationBean.setOrder(apiHeaderFilterOrder); @@ -44,10 +45,10 @@ public class FilterConfig { } @Bean - public FilterRegistrationBean ipFilter() { + public FilterRegistrationBean ipFilter() { int ipfilterOrder = 2; String format = String.format("/%s/*", apiContext); - FilterRegistrationBean registrationBean = new FilterRegistrationBean(); + FilterRegistrationBean registrationBean = new FilterRegistrationBean<>(); registrationBean.setFilter(apiIPFilter); registrationBean.addUrlPatterns(format); registrationBean.setOrder(ipfilterOrder); @@ -57,10 +58,10 @@ public class FilterConfig { } @Bean - public FilterRegistrationBean authFilter() { + public FilterRegistrationBean authFilter() { int authFilterOrder = 3; String format = String.format("/%s/*", apiContext); - FilterRegistrationBean registrationBean = new FilterRegistrationBean(); + FilterRegistrationBean registrationBean = new FilterRegistrationBean<>(); registrationBean.setFilter(apiAuthFilter); registrationBean.addUrlPatterns(format); registrationBean.setOrder(authFilterOrder); diff --git a/dbapi-standalone/src/main/java/com/gitee/freakchicken/dbapi/conf/ServletConfig.java b/dbapi-standalone/src/main/java/com/gitee/freakchicken/dbapi/conf/ServletConfig.java index 43f4d03..54544f9 100644 --- a/dbapi-standalone/src/main/java/com/gitee/freakchicken/dbapi/conf/ServletConfig.java +++ b/dbapi-standalone/src/main/java/com/gitee/freakchicken/dbapi/conf/ServletConfig.java @@ -2,8 +2,8 @@ package com.gitee.freakchicken.dbapi.conf; import com.gitee.freakchicken.dbapi.basic.servlet.APIServlet; import com.gitee.freakchicken.dbapi.basic.servlet.TokenServlet; +import jakarta.servlet.http.HttpServlet; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.web.servlet.ServletRegistrationBean; import org.springframework.context.annotation.Bean; @@ -21,24 +21,27 @@ public class ServletConfig { @Value("${dbapi.api.context}") private String apiContext; - @Autowired - private APIServlet apiServlet; + private final APIServlet apiServlet; - @Autowired - private TokenServlet tokenServlet; + private final TokenServlet tokenServlet; + + public ServletConfig(APIServlet apiServlet, TokenServlet tokenServlet) { + this.apiServlet = apiServlet; + this.tokenServlet = tokenServlet; + } @Bean - public ServletRegistrationBean getServletRegistrationBean() { + public ServletRegistrationBean getServletRegistrationBean() { String format = String.format("/%s/*", apiContext); - ServletRegistrationBean bean = new ServletRegistrationBean(apiServlet); + ServletRegistrationBean bean = new ServletRegistrationBean<>(apiServlet); bean.addUrlMappings(format); log.info("regist APIServlet servelet for {} urlMappings",format); return bean; } @Bean - public ServletRegistrationBean tokenServletRegistrationBean() { - ServletRegistrationBean bean = new ServletRegistrationBean(tokenServlet); + public ServletRegistrationBean tokenServletRegistrationBean() { + ServletRegistrationBean bean = new ServletRegistrationBean<>(tokenServlet); bean.addUrlMappings("/token/generate"); log.info("regist tokenServlet servelet "); return bean; diff --git a/dbapi-ui/favicon.ico b/dbapi-ui/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..256c516c70e7fce9aad1763ef589d3a14da5e1cc GIT binary patch literal 43602 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 K^*yxu{eJ+pcb?+_ literal 0 HcmV?d00001 diff --git a/dbapi-ui/index.html b/dbapi-ui/index.html new file mode 100644 index 0000000..d5b55bd --- /dev/null +++ b/dbapi-ui/index.html @@ -0,0 +1 @@ +dbapi
\ No newline at end of file diff --git a/dbapi-ui/pom.xml b/dbapi-ui/pom.xml index 44af9aa..5c7188f 100644 --- a/dbapi-ui/pom.xml +++ b/dbapi-ui/pom.xml @@ -5,15 +5,15 @@ com.gitee.freakchicken.dbapi dbapi - 3.3.0 + 3.2.1 4.0.0 dbapi-ui - 8 - 8 + 17 + 17 true true diff --git a/pom.xml b/pom.xml index 9f8d412..99f9936 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ com.gitee.freakchicken.dbapi dbapi - 3.3.0 + 3.2.1 DBApi build http api from sql without other code @@ -15,12 +15,15 @@ pom - 8 - 8 + 17 + 17 UTF-8 UTF-8 UTF-8 freakchicken + 3.0.3 + 4.0.4 + 1.4.7 @@ -28,7 +31,7 @@ release - dbapi-ui + dbapi-common dbapi-plugin dbapi-service @@ -50,63 +53,6 @@ dbapi-common dbapi-plugin - - - - org.apache.maven.plugins - maven-source-plugin - 2.2.1 - - - attach-sources - - jar-no-fork - - - - - - org.apache.maven.plugins - maven-javadoc-plugin - 3.2.0 - - package - - - date - - - - - - attach-javadocs - package - - jar - - - none - - - - - - org.apache.maven.plugins - maven-gpg-plugin - 1.0 - - - sign-artifacts - verify - - sign - - - - - - - @@ -118,16 +64,34 @@ org.springframework.boot spring-boot-dependencies - 2.3.2.RELEASE + ${spring-boot.version} pom import - - + + org.springframework.boot + spring-boot-starter-cache + ${spring-boot.version} + + + org.springframework.boot + spring-boot-starter-web + ${spring-boot.version} + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + 2022.0.0.0-RC1 + + + org.springframework.cloud + spring-cloud-starter-gateway + ${spring-cloud.version} + org.springframework.cloud spring-cloud-dependencies - Hoxton.SR9 + 2022.0.2 pom import @@ -135,7 +99,7 @@ com.alibaba.cloud spring-cloud-alibaba-dependencies - 2.2.6.RELEASE + 2022.0.0.0-RC1 pom import @@ -182,24 +146,147 @@ dbapi-cluster-apiServer ${project.version}
+ + com.alibaba + fastjson + 1.2.67_noneautotype2 + compile + + + + com.baomidou + mybatis-plus-annotation + 3.5.3.1 + compile + + + + mysql + mysql-connector-java + 8.0.28 + + + org.postgresql + postgresql + 42.2.27 + + + com.microsoft.sqlserver + mssql-jdbc + 12.2.0.jre8 + + + ru.yandex.clickhouse + clickhouse-jdbc + 0.2.4 + + + org.projectlombok + lombok + 1.18.26 + + + + + com.baomidou + mybatis-plus-boot-starter + 3.5.3.1 + + + + ch.qos.logback + logback-core + ${logback.version} + + + ch.qos.logback + logback-access + ${logback.version} + + + ch.qos.logback + logback-classic + ${logback.version} + + + org.apache.commons + commons-email + 1.5 + + + commons-io + commons-io + 2.7 + + + com.alibaba + druid + 1.1.9 + + + + com.baomidou + dynamic-datasource-spring-boot-starter + 3.6.1 + + + org.xerial + sqlite-jdbc + 3.41.2.1 + + + + net.sf.ehcache + ehcache + 2.10.6 + + + slf4j-api + org.slf4j + + + + + + io.github.freakchick + orange + 1.0 + + + org.apache.tomcat.embed + tomcat-embed-core + 10.1.5 + + + org.springframework.kafka + spring-kafka + 3.0.6 + - + org.apache.maven.plugins maven-compiler-plugin + 3.11.0 - 1.8 - 1.8 + 17 + 17 utf-8 + org.apache.maven.plugins maven-clean-plugin - 3.1.0 + 3.2.0 true @@ -260,6 +347,4 @@ https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/ - - \ No newline at end of file -- Gitee