diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 88ab866..caf8774 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,5 +1,5 @@ # docker镜像 -image: git.mesalab.cn:7443/nezha/nz-build-env:1.3 +image: git.mesalab.cn:7443/nezha/nz-build-env:1.5 # 定义全局变量 variables: MINIO_HOST: 'http://192.168.40.48:2020/' diff --git a/pom.xml b/pom.xml index 6bd3670..d1e3ad2 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ org.springframework.boot spring-boot-starter-parent - 2.4.4 + 3.1.3 net.geedge @@ -15,7 +15,7 @@ nz-agent nezha prometheus config sync agent - 1.8 + 21 2.17.0 1.3.1 @@ -28,6 +28,7 @@ org.projectlombok lombok + 1.18.30 true @@ -53,6 +54,7 @@ org.apache.httpcomponents httpclient + 4.5.13 org.springframework.boot @@ -70,11 +72,6 @@ ${commons.fileupload.version} - - org.apache.httpcomponents - httpmime - - org.snmp4j @@ -88,6 +85,13 @@ reactive-streams + + + org.apache.httpcomponents.client5 + httpclient5 + 5.1.3 + + @@ -118,10 +122,9 @@ org.apache.maven.plugins maven-compiler-plugin - 3.2 + 3.11.0 - 8 - 8 + ${java.version} UTF-8 diff --git a/src/main/java/net/geedge/confagent/config/RestTemplateConfig.java b/src/main/java/net/geedge/confagent/config/RestTemplateConfig.java index 2813801..937afd1 100644 --- a/src/main/java/net/geedge/confagent/config/RestTemplateConfig.java +++ b/src/main/java/net/geedge/confagent/config/RestTemplateConfig.java @@ -1,22 +1,23 @@ package net.geedge.confagent.config; -import org.apache.http.HeaderElement; -import org.apache.http.HeaderElementIterator; -import org.apache.http.HttpResponse; -import org.apache.http.client.HttpClient; -import org.apache.http.client.config.RequestConfig; -import org.apache.http.config.Registry; -import org.apache.http.config.RegistryBuilder; -import org.apache.http.conn.ConnectionKeepAliveStrategy; -import org.apache.http.conn.socket.ConnectionSocketFactory; -import org.apache.http.conn.socket.PlainConnectionSocketFactory; +import org.apache.hc.client5.http.ConnectionKeepAliveStrategy; +import org.apache.hc.client5.http.classic.HttpClient; +import org.apache.hc.client5.http.config.RequestConfig; +import org.apache.hc.client5.http.impl.classic.HttpClientBuilder; +import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager; +import org.apache.hc.client5.http.socket.ConnectionSocketFactory; +import org.apache.hc.client5.http.socket.PlainConnectionSocketFactory; +import org.apache.hc.client5.http.ssl.SSLConnectionSocketFactory; +import org.apache.hc.core5.http.HeaderElement; +import org.apache.hc.core5.http.HttpResponse; +import org.apache.hc.core5.http.config.Registry; +import org.apache.hc.core5.http.config.RegistryBuilder; +import org.apache.hc.core5.http.message.BasicHeaderElementIterator; +import org.apache.hc.core5.http.protocol.HttpContext; +import org.apache.hc.core5.util.TimeValue; +import org.apache.hc.core5.util.Timeout; import org.apache.http.conn.ssl.NoopHostnameVerifier; -import org.apache.http.conn.ssl.SSLConnectionSocketFactory; -import org.apache.http.impl.client.HttpClientBuilder; -import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; -import org.apache.http.message.BasicHeaderElementIterator; import org.apache.http.protocol.HTTP; -import org.apache.http.protocol.HttpContext; import org.apache.http.ssl.TrustStrategy; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.web.client.RestTemplateBuilder; @@ -119,9 +120,9 @@ public class RestTemplateConfig { connectionManager.setMaxTotal(maxTotal); // 路由是对maxTotal的细分 connectionManager.setDefaultMaxPerRoute(maxPerRoute); - RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(socketTimeout)// 服务器返回数据(response)的时间,超过该时间抛出readtimeout - .setConnectTimeout(connectionTimeout)// 连接上服务器(握手成功)的时间,超出该时间抛出connect timeout - .setConnectionRequestTimeout(connectionRequestTimeout)// 从连接池中获取连接的超时时间,超过该时间未拿到可用连接,会抛出org.apache.http.conn.ConnectionPoolTimeoutException:Timeout + RequestConfig requestConfig = RequestConfig.custom().setResponseTimeout(Timeout.ofMilliseconds(socketTimeout))// 服务器返回数据(response)的时间,超过该时间抛出readtimeout + .setConnectTimeout(Timeout.ofMilliseconds(connectionTimeout))// 连接上服务器(握手成功)的时间,超出该时间抛出connect timeout + .setConnectionRequestTimeout(Timeout.ofMilliseconds(connectionRequestTimeout))// 从连接池中获取连接的超时时间,超过该时间未拿到可用连接,会抛出org.apache.http.conn.ConnectionPoolTimeoutException:Timeout // waiting for connection from pool .build(); return HttpClientBuilder.create().setDefaultRequestConfig(requestConfig).setConnectionManager(connectionManager) @@ -137,22 +138,20 @@ public class RestTemplateConfig { public ConnectionKeepAliveStrategy connectionKeepAliveStrategy() { return new ConnectionKeepAliveStrategy() { @Override - public long getKeepAliveDuration(HttpResponse response, HttpContext context) { - // Honor 'keep-alive' header - HeaderElementIterator it = new BasicHeaderElementIterator( - response.headerIterator(HTTP.CONN_KEEP_ALIVE)); + public TimeValue getKeepAliveDuration(HttpResponse httpResponse, HttpContext httpContext) { + BasicHeaderElementIterator it = new BasicHeaderElementIterator(httpResponse.headerIterator(HTTP.CONN_KEEP_ALIVE)); while (it.hasNext()) { - HeaderElement he = it.nextElement(); - String param = he.getName(); - String value = he.getValue(); + HeaderElement next = it.next(); + String param = next.getName(); + String value = next.getValue(); if (value != null && "timeout".equalsIgnoreCase(param)) { try { - return Long.parseLong(value) * 1000; - } catch (NumberFormatException ignore) { + return TimeValue.ofMilliseconds(Integer.valueOf(value) * 1000); + } catch (NumberFormatException e) { } } } - return keepAliveTime * 1000; + return TimeValue.ofMilliseconds(keepAliveTime * 1000); } }; } diff --git a/src/main/java/net/geedge/confagent/controller/ConfigController.java b/src/main/java/net/geedge/confagent/controller/ConfigController.java index 81268d3..d64f640 100644 --- a/src/main/java/net/geedge/confagent/controller/ConfigController.java +++ b/src/main/java/net/geedge/confagent/controller/ConfigController.java @@ -19,8 +19,8 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.io.File; import java.util.List; diff --git a/src/main/java/net/geedge/confagent/controller/CortexController.java b/src/main/java/net/geedge/confagent/controller/CortexController.java index 9ef0caf..4d9073d 100644 --- a/src/main/java/net/geedge/confagent/controller/CortexController.java +++ b/src/main/java/net/geedge/confagent/controller/CortexController.java @@ -22,8 +22,8 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import org.springframework.web.client.RestTemplate; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.io.OutputStream; import java.net.URI; import java.nio.charset.Charset; diff --git a/src/main/java/net/geedge/confagent/controller/HealthyController.java b/src/main/java/net/geedge/confagent/controller/HealthyController.java index 3e043ae..6595bb0 100644 --- a/src/main/java/net/geedge/confagent/controller/HealthyController.java +++ b/src/main/java/net/geedge/confagent/controller/HealthyController.java @@ -4,7 +4,7 @@ import java.util.Date; import java.util.HashMap; import java.util.Map; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; diff --git a/src/main/java/net/geedge/confagent/controller/LokiController.java b/src/main/java/net/geedge/confagent/controller/LokiController.java index bebc260..563799a 100644 --- a/src/main/java/net/geedge/confagent/controller/LokiController.java +++ b/src/main/java/net/geedge/confagent/controller/LokiController.java @@ -10,10 +10,10 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import javax.servlet.ServletInputStream; -import javax.servlet.ServletOutputStream; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.ServletInputStream; +import jakarta.servlet.ServletOutputStream; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; @@ -189,7 +189,7 @@ public class LokiController extends BaseController { } public void requestLoki(String lokiPath, String token, HttpServletRequest request, HttpServletResponse response) { - String queryString = ReflectUtil.invoke(request, "getQueryString"); + String queryString = request.getQueryString(); String targetUrl = String.format("%s:%s%s?%s", "127.0.0.1", 13100, lokiPath,Tool.StrUtil.emptyToDefault(queryString, "")); String url = UrlBuilder.ofHttp(targetUrl, Charset.forName("utf-8")).toString(); @@ -227,7 +227,11 @@ public class LokiController extends BaseController { String responseMessage = conn.getResponseMessage(); Map> responseHeaders = conn.getHeaderFields(); response.reset(); - response.setStatus(responseCode, responseMessage); + + response.setStatus(responseCode); + if (responseCode > 400) { + response.sendError(responseCode, responseMessage); + } // 复制响应头 for (Map.Entry> en : responseHeaders.entrySet()) { String key = en.getKey(); diff --git a/src/main/java/net/geedge/confagent/controller/OTAController.java b/src/main/java/net/geedge/confagent/controller/OTAController.java index 48c7100..9a718e7 100644 --- a/src/main/java/net/geedge/confagent/controller/OTAController.java +++ b/src/main/java/net/geedge/confagent/controller/OTAController.java @@ -1,6 +1,7 @@ package net.geedge.confagent.controller; import cn.hutool.log.Log; +import jakarta.servlet.http.HttpServletRequest; import net.geedge.confagent.util.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; @@ -9,8 +10,10 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; -import javax.servlet.http.HttpServletRequest; -import java.io.*; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; @RestController public class OTAController extends BaseController{ diff --git a/src/main/java/net/geedge/confagent/controller/PrometheusController.java b/src/main/java/net/geedge/confagent/controller/PrometheusController.java index 0521638..ca3bc8a 100644 --- a/src/main/java/net/geedge/confagent/controller/PrometheusController.java +++ b/src/main/java/net/geedge/confagent/controller/PrometheusController.java @@ -1,47 +1,36 @@ package net.geedge.confagent.controller; +import cn.hutool.core.net.url.UrlBuilder; +import cn.hutool.core.net.url.UrlPath; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.URLUtil; +import cn.hutool.http.HttpConnection; +import cn.hutool.log.Log; +import io.micrometer.core.instrument.Metrics; +import io.micrometer.core.instrument.Tags; +import jakarta.servlet.ServletInputStream; +import jakarta.servlet.ServletOutputStream; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import net.geedge.confagent.annotation.UnCheckToken; +import net.geedge.confagent.util.ConfagentUtil; +import net.geedge.confagent.util.R; +import net.geedge.confagent.util.RCode; +import net.geedge.confagent.util.Tool; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.HttpEntity; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.client.RestTemplate; + import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; import java.nio.charset.Charset; -import java.util.Arrays; -import java.util.Enumeration; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import javax.servlet.ServletInputStream; -import javax.servlet.ServletOutputStream; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.http.HttpEntity; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.client.RestTemplate; - -import cn.hutool.core.net.url.UrlBuilder; -import cn.hutool.core.net.url.UrlPath; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.ReflectUtil; -import cn.hutool.core.util.URLUtil; -import cn.hutool.http.HttpConnection; -import cn.hutool.log.Log; -import io.micrometer.core.instrument.Metrics; -import io.micrometer.core.instrument.Tags; -import net.geedge.confagent.annotation.UnCheckToken; -import net.geedge.confagent.util.ConfagentUtil; -import net.geedge.confagent.util.R; -import net.geedge.confagent.util.RCode; -import net.geedge.confagent.util.Tool; +import java.util.*; @RestController @RequestMapping("/prometheus") @@ -179,7 +168,7 @@ public class PrometheusController extends BaseController{ Enumeration headerNames = request.getHeaderNames(); while (headerNames.hasMoreElements()) { String hn = headerNames.nextElement(); - ReflectUtil.invoke(conn,"addRequestProperty",hn,request.getHeader(hn)); + conn.addRequestProperty(hn,request.getHeader(hn)); } if (!"GET".equalsIgnoreCase(method)) { conn.setDoOutput(true); @@ -193,13 +182,17 @@ public class PrometheusController extends BaseController{ connInputStream = (responseCode < 400)? conn.getInputStream():conn.getErrorStream(); String responseMessage = conn.getResponseMessage(); Map> responseHeaders = conn.getHeaderFields(); - response.setStatus(responseCode, responseMessage); + + response.setStatus(responseCode); + if (responseCode > 400) { + response.sendError(responseCode, responseMessage); + } //复制响应头 for(Map.Entry> en : responseHeaders.entrySet()) { String key = en.getKey(); if (Tool.StrUtil.isEmpty(key) || "Transfer-Encoding".equals(key)) continue; List value = en.getValue(); - ReflectUtil.invoke(response,"addHeader",key,Tool.StrUtil.join("; ",value)); + response.addHeader(key, Tool.StrUtil.join("; ",value)); } Tool.IoUtil.copy(connInputStream, resOutputStream); diff --git a/src/main/java/net/geedge/confagent/controller/TalonProxyController.java b/src/main/java/net/geedge/confagent/controller/TalonProxyController.java index 3b11d38..76796a5 100644 --- a/src/main/java/net/geedge/confagent/controller/TalonProxyController.java +++ b/src/main/java/net/geedge/confagent/controller/TalonProxyController.java @@ -9,6 +9,8 @@ import cn.hutool.core.util.URLUtil; import cn.hutool.http.Header; import cn.hutool.log.Log; import com.alibaba.fastjson.JSONObject; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import net.geedge.confagent.util.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.io.ByteArrayResource; @@ -26,10 +28,8 @@ import org.springframework.web.client.RestClientException; import org.springframework.web.client.RestTemplate; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartHttpServletRequest; -import org.springframework.web.multipart.commons.CommonsMultipartResolver; +import org.springframework.web.multipart.support.StandardServletMultipartResolver; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; import java.nio.charset.Charset; import java.util.Enumeration; import java.util.List; @@ -232,8 +232,7 @@ public class TalonProxyController extends BaseController { // talon token headers.add(HttpHeaders.AUTHORIZATION, targetToken); - CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext()); - commonsMultipartResolver.setDefaultEncoding("UTF-8"); + StandardServletMultipartResolver commonsMultipartResolver = new StandardServletMultipartResolver(); if (commonsMultipartResolver.isMultipart(request)) { MultipartBodyBuilder multipartBodyBuilder = new MultipartBodyBuilder(); diff --git a/src/main/java/net/geedge/confagent/interceptor/TokenInterceptor.java b/src/main/java/net/geedge/confagent/interceptor/TokenInterceptor.java index c2965b2..f95d7cf 100644 --- a/src/main/java/net/geedge/confagent/interceptor/TokenInterceptor.java +++ b/src/main/java/net/geedge/confagent/interceptor/TokenInterceptor.java @@ -1,22 +1,20 @@ package net.geedge.confagent.interceptor; -import java.io.IOException; -import java.io.PrintWriter; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.web.method.HandlerMethod; -import org.springframework.web.servlet.HandlerInterceptor; - import cn.hutool.log.Log; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import net.geedge.confagent.annotation.UnCheckToken; import net.geedge.confagent.util.ConfagentUtil; import net.geedge.confagent.util.R; import net.geedge.confagent.util.RCode; import net.geedge.confagent.util.Tool; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.web.method.HandlerMethod; +import org.springframework.web.servlet.HandlerInterceptor; + +import java.io.IOException; +import java.io.PrintWriter; @Component public class TokenInterceptor implements HandlerInterceptor { diff --git a/src/main/java/net/geedge/confagent/util/ConfagentUtil.java b/src/main/java/net/geedge/confagent/util/ConfagentUtil.java index f828a32..5837d85 100644 --- a/src/main/java/net/geedge/confagent/util/ConfagentUtil.java +++ b/src/main/java/net/geedge/confagent/util/ConfagentUtil.java @@ -1,5 +1,12 @@ package net.geedge.confagent.util; +import cn.hutool.core.io.IORuntimeException; +import cn.hutool.log.Log; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.annotation.Order; + import java.io.File; import java.io.IOException; import java.io.OutputStream; @@ -8,15 +15,6 @@ import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; -import javax.servlet.http.HttpServletResponse; - -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Configuration; -import org.springframework.core.annotation.Order; - -import cn.hutool.core.io.IORuntimeException; -import cn.hutool.log.Log; - @Configuration @Order(value = 1) public class ConfagentUtil {