diff --git a/common/src/main/java/com/alibaba/nacos/common/http/AbstractApacheHttpClientFactory.java b/common/src/main/java/com/alibaba/nacos/common/http/AbstractApacheHttpClientFactory.java
index 1d3c32e397c..5d70ef14c83 100644
--- a/common/src/main/java/com/alibaba/nacos/common/http/AbstractApacheHttpClientFactory.java
+++ b/common/src/main/java/com/alibaba/nacos/common/http/AbstractApacheHttpClientFactory.java
@@ -30,9 +30,15 @@ public abstract class AbstractApacheHttpClientFactory extends AbstractHttpClient
@Override
public final NacosRestTemplate createNacosRestTemplate() {
+ final HttpClientConfig originalRequestConfig = buildHttpClientConfig();
final RequestConfig requestConfig = getRequestConfig();
- return new NacosRestTemplate(assignLogger(),
- new DefaultHttpClientRequest(HttpClients.custom().setDefaultRequestConfig(requestConfig).build()));
+ return new NacosRestTemplate(assignLogger(), new DefaultHttpClientRequest(
+ HttpClients.custom().setDefaultRequestConfig(requestConfig)
+ .setUserAgent(originalRequestConfig.getUserAgent())
+ .setMaxConnTotal(originalRequestConfig.getMaxConnTotal())
+ .setMaxConnPerRoute(originalRequestConfig.getMaxConnPerRoute())
+ .setConnectionTimeToLive(originalRequestConfig.getConnTimeToLive(),
+ originalRequestConfig.getConnTimeToLiveTimeUnit()).build()));
}
}
diff --git a/common/src/main/java/com/alibaba/nacos/common/http/AbstractHttpClientFactory.java b/common/src/main/java/com/alibaba/nacos/common/http/AbstractHttpClientFactory.java
index dd85b874461..54b0fd715c9 100644
--- a/common/src/main/java/com/alibaba/nacos/common/http/AbstractHttpClientFactory.java
+++ b/common/src/main/java/com/alibaba/nacos/common/http/AbstractHttpClientFactory.java
@@ -67,15 +67,20 @@ public void onChanged(String filePath) {
@Override
public NacosAsyncRestTemplate createNacosAsyncRestTemplate() {
- RequestConfig requestConfig = getRequestConfig();
+ final HttpClientConfig originalRequestConfig = buildHttpClientConfig();
+ final RequestConfig requestConfig = getRequestConfig();
return new NacosAsyncRestTemplate(assignLogger(), new DefaultAsyncHttpClientRequest(
- HttpAsyncClients.custom().setDefaultRequestConfig(requestConfig).build()));
+ HttpAsyncClients.custom().setDefaultRequestConfig(requestConfig)
+ .setMaxConnTotal(originalRequestConfig.getMaxConnTotal())
+ .setMaxConnPerRoute(originalRequestConfig.getMaxConnPerRoute())
+ .setUserAgent(originalRequestConfig.getUserAgent()).build()));
}
protected RequestConfig getRequestConfig() {
HttpClientConfig httpClientConfig = buildHttpClientConfig();
return RequestConfig.custom().setConnectTimeout(httpClientConfig.getConTimeOutMillis())
.setSocketTimeout(httpClientConfig.getReadTimeOutMillis())
+ .setConnectionRequestTimeout(httpClientConfig.getConnectionRequestTimeout())
.setMaxRedirects(httpClientConfig.getMaxRedirects()).build();
}
diff --git a/common/src/main/java/com/alibaba/nacos/common/http/BaseHttpClient.java b/common/src/main/java/com/alibaba/nacos/common/http/BaseHttpClient.java
index 7881af077a7..18bd1782d04 100644
--- a/common/src/main/java/com/alibaba/nacos/common/http/BaseHttpClient.java
+++ b/common/src/main/java/com/alibaba/nacos/common/http/BaseHttpClient.java
@@ -16,7 +16,6 @@
package com.alibaba.nacos.common.http;
-import com.alibaba.nacos.common.constant.HttpHeaderConsts;
import com.alibaba.nacos.common.http.handler.ResponseHandler;
import com.alibaba.nacos.common.http.param.Header;
import com.alibaba.nacos.common.http.param.Query;
@@ -103,7 +102,7 @@ protected HttpRequestBase build(String url, Header header, Object body, String m
final BaseHttpMethod httpMethod = BaseHttpMethod.sourceOf(method);
final HttpRequestBase httpRequestBase = httpMethod.init(url);
HttpUtils.initRequestHeader(httpRequestBase, header);
- HttpUtils.initRequestEntity(httpRequestBase, body, header.getValue(HttpHeaderConsts.CONTENT_TYPE));
+ HttpUtils.initRequestEntity(httpRequestBase, body, header);
return httpRequestBase;
}
diff --git a/common/src/main/java/com/alibaba/nacos/common/http/BaseHttpMethod.java b/common/src/main/java/com/alibaba/nacos/common/http/BaseHttpMethod.java
index 4ccb2407b0d..b53cfa36d24 100644
--- a/common/src/main/java/com/alibaba/nacos/common/http/BaseHttpMethod.java
+++ b/common/src/main/java/com/alibaba/nacos/common/http/BaseHttpMethod.java
@@ -84,6 +84,16 @@ protected HttpRequestBase createRequest(String url) {
}
},
+ /**
+ * delete Large request.
+ */
+ DELETE_LARGE(HttpMethod.DELETE_LARGE) {
+ @Override
+ protected HttpRequestBase createRequest(String url) {
+ return new HttpDeleteWithEntity(url);
+ }
+ },
+
/**
* head request.
*/
@@ -155,6 +165,10 @@ public static BaseHttpMethod sourceOf(String name) {
/**
* get Large implemented.
+ *
+ * Mainly used for GET request parameters are relatively large, can not be placed on the URL, so it needs to be
+ * placed in the body.
+ *
*/
public static class HttpGetWithEntity extends HttpEntityEnclosingRequestBase {
@@ -171,4 +185,26 @@ public String getMethod() {
}
}
+ /**
+ * delete Large implemented.
+ *
+ * Mainly used for DELETE request parameters are relatively large, can not be placed on the URL, so it needs to be
+ * placed in the body.
+ *
+ */
+ public static class HttpDeleteWithEntity extends HttpEntityEnclosingRequestBase {
+
+ public static final String METHOD_NAME = "DELETE";
+
+ public HttpDeleteWithEntity(String url) {
+ super();
+ setURI(URI.create(url));
+ }
+
+ @Override
+ public String getMethod() {
+ return METHOD_NAME;
+ }
+ }
+
}
diff --git a/common/src/main/java/com/alibaba/nacos/common/http/HttpClientConfig.java b/common/src/main/java/com/alibaba/nacos/common/http/HttpClientConfig.java
index cc5b9993bad..ae50ab485b6 100644
--- a/common/src/main/java/com/alibaba/nacos/common/http/HttpClientConfig.java
+++ b/common/src/main/java/com/alibaba/nacos/common/http/HttpClientConfig.java
@@ -16,6 +16,8 @@
package com.alibaba.nacos.common.http;
+import java.util.concurrent.TimeUnit;
+
/**
* http client config build.
*
@@ -23,16 +25,62 @@
*/
public class HttpClientConfig {
+ /**
+ * connect time out.
+ */
private final int conTimeOutMillis;
+ /**
+ * read time out.
+ */
private final int readTimeOutMillis;
+ /**
+ * connTimeToLive.
+ */
+ private final long connTimeToLive;
+
+ /**
+ * connTimeToLiveTimeUnit.
+ */
+ private final TimeUnit connTimeToLiveTimeUnit;
+
+ /**
+ * connectionRequestTimeout.
+ */
+ private final int connectionRequestTimeout;
+
+ /**
+ * max redirect.
+ */
private final int maxRedirects;
- public HttpClientConfig(int conTimeOutMillis, int readTimeOutMillis, int maxRedirects) {
+ /**
+ * max connect total.
+ */
+ private final int maxConnTotal;
+
+ /**
+ * Assigns maximum connection per route value.
+ */
+ private final int maxConnPerRoute;
+
+ /**
+ * user agent.
+ */
+ private final String userAgent;
+
+ public HttpClientConfig(int conTimeOutMillis, int readTimeOutMillis, long connTimeToLive, TimeUnit timeUnit,
+ int connectionRequestTimeout, int maxRedirects, int maxConnTotal, int maxConnPerRoute, String userAgent) {
this.conTimeOutMillis = conTimeOutMillis;
this.readTimeOutMillis = readTimeOutMillis;
+ this.connTimeToLive = connTimeToLive;
+ this.connTimeToLiveTimeUnit = timeUnit;
+ this.connectionRequestTimeout = connectionRequestTimeout;
this.maxRedirects = maxRedirects;
+ this.maxConnTotal = maxConnTotal;
+ this.maxConnPerRoute = maxConnPerRoute;
+ this.userAgent = userAgent;
}
public int getConTimeOutMillis() {
@@ -43,10 +91,34 @@ public int getReadTimeOutMillis() {
return readTimeOutMillis;
}
+ public long getConnTimeToLive() {
+ return connTimeToLive;
+ }
+
+ public TimeUnit getConnTimeToLiveTimeUnit() {
+ return connTimeToLiveTimeUnit;
+ }
+
+ public int getConnectionRequestTimeout() {
+ return connectionRequestTimeout;
+ }
+
public int getMaxRedirects() {
return maxRedirects;
}
+ public int getMaxConnTotal() {
+ return maxConnTotal;
+ }
+
+ public int getMaxConnPerRoute() {
+ return maxConnPerRoute;
+ }
+
+ public String getUserAgent() {
+ return userAgent;
+ }
+
public static HttpClientConfigBuilder builder() {
return new HttpClientConfigBuilder();
}
@@ -57,8 +129,20 @@ public static final class HttpClientConfigBuilder {
private int readTimeOutMillis = -1;
+ private long connTimeToLive = -1;
+
+ private TimeUnit connTimeToLiveTimeUnit = TimeUnit.MILLISECONDS;
+
+ private int connectionRequestTimeout = -1;
+
private int maxRedirects = 50;
+ private int maxConnTotal = 0;
+
+ private int maxConnPerRoute = 0;
+
+ private String userAgent;
+
public HttpClientConfigBuilder setConTimeOutMillis(int conTimeOutMillis) {
this.conTimeOutMillis = conTimeOutMillis;
return this;
@@ -69,13 +153,40 @@ public HttpClientConfigBuilder setReadTimeOutMillis(int readTimeOutMillis) {
return this;
}
+ public HttpClientConfigBuilder setConnectionTimeToLive(long connTimeToLive, TimeUnit connTimeToLiveTimeUnit) {
+ this.connTimeToLive = connTimeToLive;
+ this.connTimeToLiveTimeUnit = connTimeToLiveTimeUnit;
+ return this;
+ }
+
+ public HttpClientConfigBuilder setConnectionRequestTimeout(int connectionRequestTimeout) {
+ this.connectionRequestTimeout = connectionRequestTimeout;
+ return this;
+ }
+
public HttpClientConfigBuilder setMaxRedirects(int maxRedirects) {
this.maxRedirects = maxRedirects;
return this;
}
+ public HttpClientConfigBuilder setMaxConnTotal(int maxConnTotal) {
+ this.maxConnTotal = maxConnTotal;
+ return this;
+ }
+
+ public HttpClientConfigBuilder setMaxConnPerRoute(int maxConnPerRoute) {
+ this.maxConnPerRoute = maxConnPerRoute;
+ return this;
+ }
+
+ public HttpClientConfigBuilder setUserAgent(String userAgent) {
+ this.userAgent = userAgent;
+ return this;
+ }
+
public HttpClientConfig build() {
- return new HttpClientConfig(conTimeOutMillis, readTimeOutMillis, maxRedirects);
+ return new HttpClientConfig(conTimeOutMillis, readTimeOutMillis, connTimeToLive, connTimeToLiveTimeUnit,
+ connectionRequestTimeout, maxRedirects, maxConnTotal, maxConnPerRoute, userAgent);
}
}
}
diff --git a/common/src/main/java/com/alibaba/nacos/common/http/HttpUtils.java b/common/src/main/java/com/alibaba/nacos/common/http/HttpUtils.java
index 97f6f53600f..7f5238a6aad 100644
--- a/common/src/main/java/com/alibaba/nacos/common/http/HttpUtils.java
+++ b/common/src/main/java/com/alibaba/nacos/common/http/HttpUtils.java
@@ -16,15 +16,17 @@
package com.alibaba.nacos.common.http;
-import com.alibaba.nacos.common.http.handler.RequestHandler;
+import com.alibaba.nacos.common.constant.HttpHeaderConsts;
import com.alibaba.nacos.common.http.param.Header;
import com.alibaba.nacos.common.http.param.Query;
+import com.alibaba.nacos.common.utils.JacksonUtils;
import com.alibaba.nacos.common.utils.StringUtils;
import org.apache.http.HttpEntity;
import org.apache.http.HttpEntityEnclosingRequest;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpRequestBase;
+import org.apache.http.entity.ByteArrayEntity;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.message.BasicNameValuePair;
@@ -70,17 +72,22 @@ public static void initRequestHeader(HttpRequestBase requestBase, Header header)
*
* @param requestBase requestBase {@link HttpRequestBase}
* @param body body
- * @param mediaType mediaType {@link ContentType}
+ * @param header request header
* @throws Exception exception
*/
- public static void initRequestEntity(HttpRequestBase requestBase, Object body, String mediaType) throws Exception {
+ public static void initRequestEntity(HttpRequestBase requestBase, Object body, Header header) throws Exception {
if (body == null) {
return;
}
if (requestBase instanceof HttpEntityEnclosingRequest) {
HttpEntityEnclosingRequest request = (HttpEntityEnclosingRequest) requestBase;
- ContentType contentType = ContentType.create(mediaType);
- StringEntity entity = new StringEntity(RequestHandler.parse(body), contentType);
+ ContentType contentType = ContentType.create(header.getValue(HttpHeaderConsts.CONTENT_TYPE), header.getCharset());
+ HttpEntity entity;
+ if (body instanceof byte[]) {
+ entity = new ByteArrayEntity((byte[]) body, contentType);
+ } else {
+ entity = new StringEntity(body instanceof String ? (String) body : JacksonUtils.toJson(body), contentType);
+ }
request.setEntity(entity);
}
}
diff --git a/common/src/main/java/com/alibaba/nacos/common/http/client/NacosAsyncRestTemplate.java b/common/src/main/java/com/alibaba/nacos/common/http/client/NacosAsyncRestTemplate.java
index 082400113ee..ad9ff06cbd0 100644
--- a/common/src/main/java/com/alibaba/nacos/common/http/client/NacosAsyncRestTemplate.java
+++ b/common/src/main/java/com/alibaba/nacos/common/http/client/NacosAsyncRestTemplate.java
@@ -105,6 +105,27 @@ public void delete(String url, Header header, Query query, Type responseType
execute(url, HttpMethod.DELETE, new RequestHttpEntity(header, query), responseType, callback);
}
+ /**
+ * async http delete large request, when the parameter exceeds the URL limit, you can use this method to put the
+ * parameter into the body pass.
+ *
+ * {@code responseType} can be an RestResult or RestResult data {@code T} type
+ *
+ *
{@code callback} Result callback execution,
+ * if you need response headers, you can convert the received RestResult to HttpRestResult.
+ *
+ * @param url url
+ * @param header http header param
+ * @param body body
+ * @param responseType return type
+ * @param callback callback {@link Callback#onReceive(com.alibaba.nacos.common.model.RestResult)}
+ */
+ public void delete(String url, Header header, String body, Type responseType, Callback callback) {
+ execute(url, HttpMethod.DELETE_LARGE,
+ new RequestHttpEntity(header.setContentType(MediaType.APPLICATION_JSON), Query.EMPTY, body),
+ responseType, callback);
+ }
+
/**
* async http put Create a new resource by PUTting the given body to http request.
*
diff --git a/common/src/main/java/com/alibaba/nacos/common/http/client/NacosRestTemplate.java b/common/src/main/java/com/alibaba/nacos/common/http/client/NacosRestTemplate.java
index f7b3693a522..1d60c2e4cff 100644
--- a/common/src/main/java/com/alibaba/nacos/common/http/client/NacosRestTemplate.java
+++ b/common/src/main/java/com/alibaba/nacos/common/http/client/NacosRestTemplate.java
@@ -427,6 +427,26 @@ public HttpRestResult exchangeForm(String url, Header header, Query query
return execute(url, httpMethod, requestHttpEntity, responseType);
}
+ /**
+ * Execute the HTTP method to the given URI template, writing the given request entity to the request, and returns
+ * the response as {@link HttpRestResult}.
+ *
+ * @param url url
+ * @param config HttpClientConfig
+ * @param header http header param
+ * @param query http query param
+ * @param body http body param
+ * @param httpMethod http method
+ * @param responseType return type
+ * @return {@link HttpRestResult}
+ * @throws Exception ex
+ */
+ public HttpRestResult exchange(String url, HttpClientConfig config, Header header, Query query,
+ Object body, String httpMethod, Type responseType) throws Exception {
+ RequestHttpEntity requestHttpEntity = new RequestHttpEntity(config, header, query, body);
+ return execute(url, httpMethod, requestHttpEntity, responseType);
+ }
+
/**
* Set the request interceptors that this accessor should use.
*
diff --git a/common/src/main/java/com/alibaba/nacos/common/http/client/request/DefaultHttpClientRequest.java b/common/src/main/java/com/alibaba/nacos/common/http/client/request/DefaultHttpClientRequest.java
index 2a84c390b3c..d59010532d4 100644
--- a/common/src/main/java/com/alibaba/nacos/common/http/client/request/DefaultHttpClientRequest.java
+++ b/common/src/main/java/com/alibaba/nacos/common/http/client/request/DefaultHttpClientRequest.java
@@ -65,7 +65,7 @@ static HttpRequestBase build(URI uri, String method, RequestHttpEntity requestHt
&& requestHttpEntity.getBody() instanceof Map) {
HttpUtils.initRequestFromEntity(httpRequestBase, (Map) requestHttpEntity.getBody(), headers.getCharset());
} else {
- HttpUtils.initRequestEntity(httpRequestBase, requestHttpEntity.getBody(), headers.getValue(HttpHeaderConsts.CONTENT_TYPE));
+ HttpUtils.initRequestEntity(httpRequestBase, requestHttpEntity.getBody(), headers);
}
replaceDefaultConfig(httpRequestBase, requestHttpEntity.getHttpClientConfig());
return httpRequestBase;
diff --git a/common/src/main/java/com/alibaba/nacos/common/http/client/request/JdkHttpClientRequest.java b/common/src/main/java/com/alibaba/nacos/common/http/client/request/JdkHttpClientRequest.java
index 7649b4eb5f1..fd921158c33 100644
--- a/common/src/main/java/com/alibaba/nacos/common/http/client/request/JdkHttpClientRequest.java
+++ b/common/src/main/java/com/alibaba/nacos/common/http/client/request/JdkHttpClientRequest.java
@@ -90,7 +90,7 @@ public HttpClientResponse execute(URI uri, String httpMethod, RequestHttpEntity
conn.setConnectTimeout(this.httpClientConfig.getConTimeOutMillis());
conn.setReadTimeout(this.httpClientConfig.getReadTimeOutMillis());
conn.setRequestMethod(httpMethod);
- if (body != null) {
+ if (body != null && !"".equals(body)) {
String contentType = headers.getValue(HttpHeaderConsts.CONTENT_TYPE);
String bodyStr = JacksonUtils.toJson(body);
if (MediaType.APPLICATION_FORM_URLENCODED.equals(contentType)) {
diff --git a/common/src/main/java/com/alibaba/nacos/common/http/param/Header.java b/common/src/main/java/com/alibaba/nacos/common/http/param/Header.java
index c581d7b26cd..fcaf31c72b1 100644
--- a/common/src/main/java/com/alibaba/nacos/common/http/param/Header.java
+++ b/common/src/main/java/com/alibaba/nacos/common/http/param/Header.java
@@ -18,6 +18,7 @@
import com.alibaba.nacos.api.common.Constants;
import com.alibaba.nacos.common.constant.HttpHeaderConsts;
+import com.alibaba.nacos.common.utils.MapUtils;
import com.alibaba.nacos.common.utils.StringUtils;
import java.util.ArrayList;
@@ -129,8 +130,10 @@ public Header addAll(List list) {
* @param params parameters
*/
public void addAll(Map params) {
- for (Map.Entry entry : params.entrySet()) {
- addParam(entry.getKey(), entry.getValue());
+ if (MapUtils.isNotEmpty(params)) {
+ for (Map.Entry entry : params.entrySet()) {
+ addParam(entry.getKey(), entry.getValue());
+ }
}
}
@@ -142,9 +145,11 @@ public void addAll(Map params) {
* @param headers original response header
*/
public void setOriginalResponseHeader(Map> headers) {
- this.originalResponseHeader.putAll(headers);
- for (Map.Entry> entry : this.originalResponseHeader.entrySet()) {
- addParam(entry.getKey(), entry.getValue().get(0));
+ if (MapUtils.isNotEmpty(headers)) {
+ this.originalResponseHeader.putAll(headers);
+ for (Map.Entry> entry : this.originalResponseHeader.entrySet()) {
+ addParam(entry.getKey(), entry.getValue().get(0));
+ }
}
}
diff --git a/common/src/main/java/com/alibaba/nacos/common/http/param/Query.java b/common/src/main/java/com/alibaba/nacos/common/http/param/Query.java
index 1b241334343..4c4029e4246 100644
--- a/common/src/main/java/com/alibaba/nacos/common/http/param/Query.java
+++ b/common/src/main/java/com/alibaba/nacos/common/http/param/Query.java
@@ -16,6 +16,8 @@
package com.alibaba.nacos.common.http.param;
+import com.alibaba.nacos.common.utils.MapUtils;
+
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.LinkedHashMap;
@@ -68,8 +70,10 @@ public Object getValue(String key) {
* @return this query
*/
public Query initParams(Map params) {
- for (Map.Entry entry : params.entrySet()) {
- addParam(entry.getKey(), entry.getValue());
+ if (MapUtils.isNotEmpty(params)) {
+ for (Map.Entry entry : params.entrySet()) {
+ addParam(entry.getKey(), entry.getValue());
+ }
}
return this;
}
diff --git a/common/src/main/java/com/alibaba/nacos/common/model/RequestHttpEntity.java b/common/src/main/java/com/alibaba/nacos/common/model/RequestHttpEntity.java
index b2c03253d07..2240002e671 100644
--- a/common/src/main/java/com/alibaba/nacos/common/model/RequestHttpEntity.java
+++ b/common/src/main/java/com/alibaba/nacos/common/model/RequestHttpEntity.java
@@ -26,7 +26,6 @@
* Represents an HTTP request , consisting of headers and body.
*
* @author mai.jh
- * @date 2020/5/23
*/
public class RequestHttpEntity {
@@ -36,7 +35,7 @@ public class RequestHttpEntity {
private final Query query;
- private Object body;
+ private final Object body;
public RequestHttpEntity(Header header, Query query) {
this(null, header, query);
diff --git a/common/src/main/java/com/alibaba/nacos/common/utils/HttpMethod.java b/common/src/main/java/com/alibaba/nacos/common/utils/HttpMethod.java
index 688433facab..c605bd9b971 100644
--- a/common/src/main/java/com/alibaba/nacos/common/utils/HttpMethod.java
+++ b/common/src/main/java/com/alibaba/nacos/common/utils/HttpMethod.java
@@ -26,8 +26,10 @@ public class HttpMethod {
public static final String GET = "GET";
- // this is only use in nacos, Custom request type, essentially a get request
-
+ /**
+ * this is only use in nacos, Custom request type, essentially a GET request, Mainly used for GET request parameters
+ * are relatively large,can not be placed on the URL, so it needs to be placed in the body.
+ */
public static final String GET_LARGE = "GET-LARGE";
public static final String HEAD = "HEAD";
@@ -40,6 +42,12 @@ public class HttpMethod {
public static final String DELETE = "DELETE";
+ /**
+ * this is only use in nacos, Custom request type, essentially a DELETE request, Mainly used for DELETE request
+ * parameters are relatively large, can not be placed on the URL, so it needs to be placed in the body.
+ */
+ public static final String DELETE_LARGE = "DELETE_LARGE";
+
public static final String OPTIONS = "OPTIONS";
public static final String TRACE = "TRACE";
diff --git a/core/src/main/java/com/alibaba/nacos/core/distributed/distro/task/load/DistroLoadDataTask.java b/core/src/main/java/com/alibaba/nacos/core/distributed/distro/task/load/DistroLoadDataTask.java
index b919b6d703d..35f0ec7aedc 100644
--- a/core/src/main/java/com/alibaba/nacos/core/distributed/distro/task/load/DistroLoadDataTask.java
+++ b/core/src/main/java/com/alibaba/nacos/core/distributed/distro/task/load/DistroLoadDataTask.java
@@ -109,7 +109,7 @@ private boolean loadAllDataSnapshotFromRemote(String resourceType) {
return true;
}
} catch (Exception e) {
- Loggers.DISTRO.error("[DISTRO-INIT] load snapshot {} from {} failed.", resourceType, each.getAddress());
+ Loggers.DISTRO.error("[DISTRO-INIT] load snapshot {} from {} failed.", resourceType, each.getAddress(), e);
}
}
return false;
diff --git a/naming/src/main/java/com/alibaba/nacos/naming/consistency/persistent/raft/RaftCore.java b/naming/src/main/java/com/alibaba/nacos/naming/consistency/persistent/raft/RaftCore.java
index e9d4095914a..96e12900aac 100644
--- a/naming/src/main/java/com/alibaba/nacos/naming/consistency/persistent/raft/RaftCore.java
+++ b/naming/src/main/java/com/alibaba/nacos/naming/consistency/persistent/raft/RaftCore.java
@@ -18,11 +18,13 @@
import com.alibaba.nacos.common.executor.ExecutorFactory;
import com.alibaba.nacos.common.executor.NameThreadFactory;
+import com.alibaba.nacos.common.http.Callback;
+import com.alibaba.nacos.common.model.RestResult;
import com.alibaba.nacos.common.utils.JacksonUtils;
+import com.alibaba.nacos.consistency.DataOperation;
import com.alibaba.nacos.core.utils.ApplicationUtils;
import com.alibaba.nacos.core.utils.ClassUtils;
import com.alibaba.nacos.naming.NamingApp;
-import com.alibaba.nacos.consistency.DataOperation;
import com.alibaba.nacos.naming.consistency.Datum;
import com.alibaba.nacos.naming.consistency.KeyBuilder;
import com.alibaba.nacos.naming.consistency.RecordListener;
@@ -41,8 +43,6 @@
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
-import com.ning.http.client.AsyncCompletionHandler;
-import com.ning.http.client.Response;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;
import org.javatuples.Pair;
@@ -55,7 +55,6 @@
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
-import java.net.HttpURLConnection;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
@@ -223,25 +222,28 @@ public void signalPublish(String key, Record value) throws Exception {
continue;
}
final String url = buildUrl(server, API_ON_PUB);
- HttpClient.asyncHttpPostLarge(url, Arrays.asList("key=" + key), content,
- new AsyncCompletionHandler() {
- @Override
- public Integer onCompleted(Response response) throws Exception {
- if (response.getStatusCode() != HttpURLConnection.HTTP_OK) {
- Loggers.RAFT
- .warn("[RAFT] failed to publish data to peer, datumId={}, peer={}, http code={}",
- datum.key, server, response.getStatusCode());
- return 1;
- }
- latch.countDown();
- return 0;
- }
-
- @Override
- public STATE onContentWriteCompleted() {
- return STATE.CONTINUE;
- }
- });
+ HttpClient.asyncHttpPostLarge(url, Arrays.asList("key", key), content, new Callback() {
+ @Override
+ public void onReceive(RestResult result) {
+ if (!result.ok()) {
+ Loggers.RAFT
+ .warn("[RAFT] failed to publish data to peer, datumId={}, peer={}, http code={}",
+ datum.key, server, result.getCode());
+ return;
+ }
+ latch.countDown();
+ }
+
+ @Override
+ public void onError(Throwable throwable) {
+ Loggers.RAFT.error("[RAFT] failed to publish data to peer", throwable);
+ }
+
+ @Override
+ public void onCancel() {
+
+ }
+ });
}
@@ -287,21 +289,29 @@ public void signalDelete(final String key) throws Exception {
for (final String server : peers.allServersWithoutMySelf()) {
String url = buildUrl(server, API_ON_DEL);
- HttpClient.asyncHttpDeleteLarge(url, null, json.toString(), new AsyncCompletionHandler() {
+ HttpClient.asyncHttpDeleteLarge(url, null, json.toString(), new Callback() {
@Override
- public Integer onCompleted(Response response) throws Exception {
- if (response.getStatusCode() != HttpURLConnection.HTTP_OK) {
+ public void onReceive(RestResult result) {
+ if (!result.ok()) {
Loggers.RAFT
.warn("[RAFT] failed to delete data from peer, datumId={}, peer={}, http code={}",
- key, server, response.getStatusCode());
- return 1;
+ key, server, result.getCode());
+ return;
}
RaftPeer local = peers.local();
local.resetLeaderDue();
-
- return 0;
+ }
+
+ @Override
+ public void onError(Throwable throwable) {
+ Loggers.RAFT.error("[RAFT] failed to delete data from peer", throwable);
+ }
+
+ @Override
+ public void onCancel() {
+
}
});
}
@@ -458,22 +468,30 @@ private void sendVote() {
for (final String server : peers.allServersWithoutMySelf()) {
final String url = buildUrl(server, API_VOTE);
try {
- HttpClient.asyncHttpPost(url, null, params, new AsyncCompletionHandler() {
+ HttpClient.asyncHttpPost(url, null, params, new Callback() {
@Override
- public Integer onCompleted(Response response) throws Exception {
- if (response.getStatusCode() != HttpURLConnection.HTTP_OK) {
- Loggers.RAFT
- .error("NACOS-RAFT vote failed: {}, url: {}", response.getResponseBody(), url);
- return 1;
+ public void onReceive(RestResult result) {
+ if (!result.ok()) {
+ Loggers.RAFT.error("NACOS-RAFT vote failed: {}, url: {}", result.getCode(), url);
+ return;
}
- RaftPeer peer = JacksonUtils.toObj(response.getResponseBody(), RaftPeer.class);
+ RaftPeer peer = JacksonUtils.toObj(result.getData(), RaftPeer.class);
Loggers.RAFT.info("received approve from peer: {}", JacksonUtils.toJson(peer));
peers.decideLeader(peer);
- return 0;
+ }
+
+ @Override
+ public void onError(Throwable throwable) {
+ Loggers.RAFT.error("error while sending vote to server: {}", server, throwable);
+ }
+
+ @Override
+ public void onCancel() {
+
}
});
} catch (Exception e) {
@@ -605,28 +623,32 @@ private void sendBeat() throws IOException, InterruptedException {
if (Loggers.RAFT.isDebugEnabled()) {
Loggers.RAFT.debug("send beat to server " + server);
}
- HttpClient.asyncHttpPostLarge(url, null, compressedBytes, new AsyncCompletionHandler() {
+ HttpClient.asyncHttpPostLarge(url, null, compressedBytes, new Callback() {
@Override
- public Integer onCompleted(Response response) throws Exception {
- if (response.getStatusCode() != HttpURLConnection.HTTP_OK) {
- Loggers.RAFT.error("NACOS-RAFT beat failed: {}, peer: {}", response.getResponseBody(),
- server);
+ public void onReceive(RestResult result) {
+ if (!result.ok()) {
+ Loggers.RAFT.error("NACOS-RAFT beat failed: {}, peer: {}", result.getCode(), server);
MetricsMonitor.getLeaderSendBeatFailedException().increment();
- return 1;
+ return;
}
- peers.update(JacksonUtils.toObj(response.getResponseBody(), RaftPeer.class));
+ peers.update(JacksonUtils.toObj(result.getData(), RaftPeer.class));
if (Loggers.RAFT.isDebugEnabled()) {
Loggers.RAFT.debug("receive beat response from: {}", url);
}
- return 0;
}
@Override
- public void onThrowable(Throwable t) {
- Loggers.RAFT.error("NACOS-RAFT error while sending heart-beat to peer: {} {}", server, t);
+ public void onError(Throwable throwable) {
+ Loggers.RAFT.error("NACOS-RAFT error while sending heart-beat to peer: {} {}", server,
+ throwable);
MetricsMonitor.getLeaderSendBeatFailedException().increment();
}
+
+ @Override
+ public void onCancel() {
+
+ }
});
} catch (Exception e) {
Loggers.RAFT.error("error while sending heart-beat to peer: {} {}", server, e);
@@ -746,15 +768,15 @@ public RaftPeer receivedBeat(JsonNode beat) throws Exception {
// update datum entry
String url = buildUrl(remote.ip, API_GET) + "?keys=" + URLEncoder.encode(keys, "UTF-8");
- HttpClient.asyncHttpGet(url, null, null, new AsyncCompletionHandler() {
+ HttpClient.asyncHttpGet(url, null, null, new Callback() {
@Override
- public Integer onCompleted(Response response) throws Exception {
- if (response.getStatusCode() != HttpURLConnection.HTTP_OK) {
- return 1;
+ public void onReceive(RestResult result) {
+ if (!result.ok()) {
+ return;
}
List datumList = JacksonUtils
- .toObj(response.getResponseBody(), new TypeReference>() {
+ .toObj(result.getData(), new TypeReference>() {
});
for (JsonNode datumJson : datumList) {
@@ -823,9 +845,24 @@ public Integer onCompleted(Response response) throws Exception {
OPERATE_LOCK.unlock();
}
}
- TimeUnit.MILLISECONDS.sleep(200);
- return 0;
+ try {
+ TimeUnit.MILLISECONDS.sleep(200);
+ } catch (InterruptedException e) {
+ Loggers.RAFT.error("[RAFT-BEAT] Interrupted error ", e);
+ }
+ return;
+ }
+
+ @Override
+ public void onError(Throwable throwable) {
+ Loggers.RAFT.error("[RAFT-BEAT] failed to sync datum from leader", throwable);
}
+
+ @Override
+ public void onCancel() {
+
+ }
+
});
batch.clear();
diff --git a/naming/src/main/java/com/alibaba/nacos/naming/consistency/persistent/raft/RaftPeerSet.java b/naming/src/main/java/com/alibaba/nacos/naming/consistency/persistent/raft/RaftPeerSet.java
index 68c4b794537..c988049a8ae 100644
--- a/naming/src/main/java/com/alibaba/nacos/naming/consistency/persistent/raft/RaftPeerSet.java
+++ b/naming/src/main/java/com/alibaba/nacos/naming/consistency/persistent/raft/RaftPeerSet.java
@@ -16,6 +16,8 @@
package com.alibaba.nacos.naming.consistency.persistent.raft;
+import com.alibaba.nacos.common.http.Callback;
+import com.alibaba.nacos.common.model.RestResult;
import com.alibaba.nacos.common.notify.NotifyCenter;
import com.alibaba.nacos.common.utils.JacksonUtils;
import com.alibaba.nacos.core.cluster.Member;
@@ -26,8 +28,6 @@
import com.alibaba.nacos.naming.misc.HttpClient;
import com.alibaba.nacos.naming.misc.Loggers;
import com.alibaba.nacos.naming.misc.NetUtils;
-import com.ning.http.client.AsyncCompletionHandler;
-import com.ning.http.client.Response;
import org.apache.commons.collections.SortedBag;
import org.apache.commons.collections.bag.TreeBag;
import org.apache.commons.lang3.StringUtils;
@@ -35,7 +35,6 @@
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
-import java.net.HttpURLConnection;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
@@ -219,20 +218,28 @@ public RaftPeer makeLeader(RaftPeer candidate) {
if (!Objects.equals(peer, candidate) && peer.state == RaftPeer.State.LEADER) {
try {
String url = RaftCore.buildUrl(peer.ip, RaftCore.API_GET_PEER);
- HttpClient.asyncHttpGet(url, null, params, new AsyncCompletionHandler() {
+ HttpClient.asyncHttpGet(url, null, params, new Callback() {
@Override
- public Integer onCompleted(Response response) throws Exception {
- if (response.getStatusCode() != HttpURLConnection.HTTP_OK) {
+ public void onReceive(RestResult result) {
+ if (!result.ok()) {
Loggers.RAFT
- .error("[NACOS-RAFT] get peer failed: {}, peer: {}", response.getResponseBody(),
+ .error("[NACOS-RAFT] get peer failed: {}, peer: {}", result.getCode(),
peer.ip);
peer.state = RaftPeer.State.FOLLOWER;
- return 1;
+ return;
}
-
- update(JacksonUtils.toObj(response.getResponseBody(), RaftPeer.class));
-
- return 0;
+
+ update(JacksonUtils.toObj(result.getData(), RaftPeer.class));
+ }
+
+ @Override
+ public void onError(Throwable throwable) {
+
+ }
+
+ @Override
+ public void onCancel() {
+
}
});
} catch (Exception e) {
diff --git a/naming/src/main/java/com/alibaba/nacos/naming/consistency/persistent/raft/RaftProxy.java b/naming/src/main/java/com/alibaba/nacos/naming/consistency/persistent/raft/RaftProxy.java
index 50aac9bf202..7240014cab4 100644
--- a/naming/src/main/java/com/alibaba/nacos/naming/consistency/persistent/raft/RaftProxy.java
+++ b/naming/src/main/java/com/alibaba/nacos/naming/consistency/persistent/raft/RaftProxy.java
@@ -16,13 +16,13 @@
package com.alibaba.nacos.naming.consistency.persistent.raft;
+import com.alibaba.nacos.common.model.RestResult;
import com.alibaba.nacos.core.utils.ApplicationUtils;
import com.alibaba.nacos.naming.misc.HttpClient;
import com.alibaba.nacos.naming.misc.UtilsAndCommons;
import org.springframework.http.HttpMethod;
import org.springframework.stereotype.Component;
-import java.net.HttpURLConnection;
import java.util.Map;
/**
@@ -48,9 +48,9 @@ public void proxyGet(String server, String api, Map params) thro
}
String url = "http://" + server + ApplicationUtils.getContextPath() + api;
- HttpClient.HttpResult result = HttpClient.httpGet(url, null, params);
- if (result.code != HttpURLConnection.HTTP_OK) {
- throw new IllegalStateException("leader failed, caused by: " + result.content);
+ RestResult result = HttpClient.httpGet(url, null, params);
+ if (!result.ok()) {
+ throw new IllegalStateException("leader failed, caused by: " + result.getMessage());
}
}
@@ -69,7 +69,7 @@ public void proxy(String server, String api, Map params, HttpMet
server = server + UtilsAndCommons.IP_PORT_SPLITER + ApplicationUtils.getPort();
}
String url = "http://" + server + ApplicationUtils.getContextPath() + api;
- HttpClient.HttpResult result;
+ RestResult result;
switch (method) {
case GET:
result = HttpClient.httpGet(url, null, params);
@@ -84,8 +84,8 @@ public void proxy(String server, String api, Map params, HttpMet
throw new RuntimeException("unsupported method:" + method);
}
- if (result.code != HttpURLConnection.HTTP_OK) {
- throw new IllegalStateException("leader failed, caused by: " + result.content);
+ if (!result.ok()) {
+ throw new IllegalStateException("leader failed, caused by: " + result.getMessage());
}
}
@@ -106,9 +106,9 @@ public void proxyPostLarge(String server, String api, String content, Map result = HttpClient.httpPostLarge(url, headers, content);
+ if (!result.ok()) {
+ throw new IllegalStateException("leader failed, caused by: " + result.getMessage());
}
}
}
diff --git a/naming/src/main/java/com/alibaba/nacos/naming/core/SubscribeManager.java b/naming/src/main/java/com/alibaba/nacos/naming/core/SubscribeManager.java
index 1cd1651c15d..d0bfe745c45 100644
--- a/naming/src/main/java/com/alibaba/nacos/naming/core/SubscribeManager.java
+++ b/naming/src/main/java/com/alibaba/nacos/naming/core/SubscribeManager.java
@@ -17,6 +17,7 @@
package com.alibaba.nacos.naming.core;
import com.alibaba.nacos.api.naming.CommonParams;
+import com.alibaba.nacos.common.model.RestResult;
import com.alibaba.nacos.common.utils.JacksonUtils;
import com.alibaba.nacos.core.cluster.Member;
import com.alibaba.nacos.core.cluster.ServerMemberManager;
@@ -31,7 +32,6 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
-import java.net.HttpURLConnection;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
@@ -97,13 +97,13 @@ public List getSubscribers(String serviceName, String namespaceId, b
continue;
}
- HttpClient.HttpResult result = HttpClient.httpGet(
+ RestResult result = HttpClient.httpGet(
"http://" + server.getAddress() + ApplicationUtils.getContextPath()
+ UtilsAndCommons.NACOS_NAMING_CONTEXT + SUBSCRIBER_ON_SYNC_URL, new ArrayList<>(),
paramValues);
- if (HttpURLConnection.HTTP_OK == result.code) {
- Subscribers subscribers = JacksonUtils.toObj(result.content, Subscribers.class);
+ if (!result.ok()) {
+ Subscribers subscribers = JacksonUtils.toObj(result.getData(), Subscribers.class);
subscriberList.addAll(subscribers.getSubscribers());
}
}
diff --git a/naming/src/main/java/com/alibaba/nacos/naming/healthcheck/ClientBeatCheckTask.java b/naming/src/main/java/com/alibaba/nacos/naming/healthcheck/ClientBeatCheckTask.java
index 253e664dcb5..0222804383a 100644
--- a/naming/src/main/java/com/alibaba/nacos/naming/healthcheck/ClientBeatCheckTask.java
+++ b/naming/src/main/java/com/alibaba/nacos/naming/healthcheck/ClientBeatCheckTask.java
@@ -16,6 +16,8 @@
package com.alibaba.nacos.naming.healthcheck;
+import com.alibaba.nacos.common.http.Callback;
+import com.alibaba.nacos.common.model.RestResult;
import com.alibaba.nacos.common.utils.JacksonUtils;
import com.alibaba.nacos.core.utils.ApplicationUtils;
import com.alibaba.nacos.naming.consistency.KeyBuilder;
@@ -31,10 +33,7 @@
import com.alibaba.nacos.naming.misc.UtilsAndCommons;
import com.alibaba.nacos.naming.push.PushService;
import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.ning.http.client.AsyncCompletionHandler;
-import com.ning.http.client.Response;
-import java.net.HttpURLConnection;
import java.util.List;
/**
@@ -140,15 +139,26 @@ private void deleteIp(Instance instance) {
+ UtilsAndCommons.NACOS_NAMING_CONTEXT + "/instance?" + request.toUrl();
// delete instance asynchronously:
- HttpClient.asyncHttpDelete(url, null, null, new AsyncCompletionHandler() {
+ HttpClient.asyncHttpDelete(url, null, null, new Callback() {
@Override
- public Object onCompleted(Response response) throws Exception {
- if (response.getStatusCode() != HttpURLConnection.HTTP_OK) {
+ public void onReceive(RestResult result) {
+ if (!result.ok()) {
Loggers.SRV_LOG
.error("[IP-DEAD] failed to delete ip automatically, ip: {}, caused {}, resp code: {}",
- instance.toJson(), response.getResponseBody(), response.getStatusCode());
+ instance.toJson(), result.getMessage(), result.getCode());
}
- return null;
+ }
+
+ @Override
+ public void onError(Throwable throwable) {
+ Loggers.SRV_LOG
+ .error("[IP-DEAD] failed to delete ip automatically, ip: {}, error: {}", instance.toJson(),
+ throwable);
+ }
+
+ @Override
+ public void onCancel() {
+
}
});
diff --git a/naming/src/main/java/com/alibaba/nacos/naming/healthcheck/HealthCheckCommon.java b/naming/src/main/java/com/alibaba/nacos/naming/healthcheck/HealthCheckCommon.java
index 41a345fc9c3..6df6b3a9d39 100644
--- a/naming/src/main/java/com/alibaba/nacos/naming/healthcheck/HealthCheckCommon.java
+++ b/naming/src/main/java/com/alibaba/nacos/naming/healthcheck/HealthCheckCommon.java
@@ -16,6 +16,7 @@
package com.alibaba.nacos.naming.healthcheck;
+import com.alibaba.nacos.common.model.RestResult;
import com.alibaba.nacos.common.utils.JacksonUtils;
import com.alibaba.nacos.core.cluster.Member;
import com.alibaba.nacos.core.cluster.ServerMemberManager;
@@ -34,7 +35,6 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
-import java.net.HttpURLConnection;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
@@ -92,11 +92,11 @@ public void init() {
JacksonUtils.toJson(list));
}
- HttpClient.HttpResult httpResult = HttpClient.httpPost(
+ RestResult httpResult = HttpClient.httpPost(
"http://" + server.getAddress() + ApplicationUtils.getContextPath()
+ UtilsAndCommons.NACOS_NAMING_CONTEXT + "/api/healthCheckResult", null, params);
- if (httpResult.code != HttpURLConnection.HTTP_OK) {
+ if (!httpResult.ok()) {
Loggers.EVT_LOG.warn("[HEALTH-CHECK-SYNC] failed to send result to {}, result: {}", server,
JacksonUtils.toJson(list));
}
diff --git a/naming/src/main/java/com/alibaba/nacos/naming/misc/HttpClient.java b/naming/src/main/java/com/alibaba/nacos/naming/misc/HttpClient.java
index 7ce2daf3eaa..a93dbd90985 100644
--- a/naming/src/main/java/com/alibaba/nacos/naming/misc/HttpClient.java
+++ b/naming/src/main/java/com/alibaba/nacos/naming/misc/HttpClient.java
@@ -17,49 +17,24 @@
package com.alibaba.nacos.naming.misc;
import com.alibaba.nacos.common.constant.HttpHeaderConsts;
+import com.alibaba.nacos.common.http.Callback;
+import com.alibaba.nacos.common.http.HttpClientConfig;
+import com.alibaba.nacos.common.http.client.NacosAsyncRestTemplate;
+import com.alibaba.nacos.common.http.client.NacosRestTemplate;
+import com.alibaba.nacos.common.http.param.Header;
+import com.alibaba.nacos.common.http.param.MediaType;
+import com.alibaba.nacos.common.http.param.Query;
+import com.alibaba.nacos.common.model.RestResult;
import com.alibaba.nacos.common.utils.HttpMethod;
-import com.alibaba.nacos.common.utils.IoUtils;
import com.alibaba.nacos.common.utils.VersionUtils;
import com.alibaba.nacos.core.utils.ApplicationUtils;
-import com.ning.http.client.AsyncCompletionHandler;
-import com.ning.http.client.AsyncHttpClient;
-import com.ning.http.client.AsyncHttpClientConfig;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.MapUtils;
import org.apache.commons.lang3.StringUtils;
-import org.apache.http.HeaderElement;
-import org.apache.http.HttpEntity;
-import org.apache.http.HttpHeaders;
-import org.apache.http.HttpResponse;
-import org.apache.http.NameValuePair;
-import org.apache.http.client.config.RequestConfig;
-import org.apache.http.client.entity.UrlEncodedFormEntity;
-import org.apache.http.client.methods.HttpEntityEnclosingRequestBase;
-import org.apache.http.client.methods.HttpPost;
-import org.apache.http.client.methods.HttpPut;
-import org.apache.http.entity.ByteArrayEntity;
-import org.apache.http.entity.ContentType;
-import org.apache.http.entity.StringEntity;
-import org.apache.http.impl.client.CloseableHttpClient;
-import org.apache.http.impl.client.HttpClientBuilder;
-import org.apache.http.impl.client.HttpClients;
-import org.apache.http.message.BasicNameValuePair;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.UnsupportedEncodingException;
-import java.net.HttpURLConnection;
-import java.net.URI;
-import java.net.URL;
-import java.net.URLEncoder;
-import java.util.ArrayList;
-import java.util.Collections;
import java.util.HashMap;
-import java.util.Iterator;
import java.util.List;
import java.util.Map;
-import java.util.concurrent.TimeUnit;
-import java.util.zip.GZIPInputStream;
/**
* Http Client.
@@ -72,34 +47,11 @@ public class HttpClient {
private static final int CON_TIME_OUT_MILLIS = 5000;
- private static AsyncHttpClient asyncHttpClient;
+ private static final NacosRestTemplate SYNC_NACOS_REST_TEMPLATE = HttpClientManager.getNacosRestTemplate();
- private static CloseableHttpClient postClient;
+ private static final NacosRestTemplate APACHE_SYNC_NACOS_REST_TEMPLATE = HttpClientManager.getApacheRestTemplate();
- static {
- AsyncHttpClientConfig.Builder builder = new AsyncHttpClientConfig.Builder();
- builder.setMaximumConnectionsTotal(-1);
- builder.setMaximumConnectionsPerHost(128);
- builder.setAllowPoolingConnection(true);
- builder.setFollowRedirects(false);
- builder.setIdleConnectionTimeoutInMs(TIME_OUT_MILLIS);
- builder.setConnectionTimeoutInMs(CON_TIME_OUT_MILLIS);
- builder.setCompressionEnabled(true);
- builder.setIOThreadMultiplier(1);
- builder.setMaxRequestRetry(0);
- builder.setUserAgent(UtilsAndCommons.SERVER_VERSION);
-
- asyncHttpClient = new AsyncHttpClient(builder.build());
-
- HttpClientBuilder builder2 = HttpClients.custom();
- builder2.setUserAgent(UtilsAndCommons.SERVER_VERSION);
- builder2.setConnectionTimeToLive(CON_TIME_OUT_MILLIS, TimeUnit.MILLISECONDS);
- builder2.setMaxConnPerRoute(-1);
- builder2.setMaxConnTotal(-1);
- builder2.disableAutomaticRetries();
-
- postClient = builder2.build();
- }
+ private static final NacosAsyncRestTemplate ASYNC_REST_TEMPLATE = HttpClientManager.getAsyncRestTemplate();
/**
* Request http delete method.
@@ -107,11 +59,11 @@ public class HttpClient {
* @param url url
* @param headers headers
* @param paramValues params
- * @return {@link HttpResult} as response
+ * @return {@link RestResult} as response
*/
- public static HttpResult httpDelete(String url, List headers, Map paramValues) {
+ public static RestResult httpDelete(String url, List headers, Map paramValues) {
return request(url, headers, paramValues, StringUtils.EMPTY, CON_TIME_OUT_MILLIS, TIME_OUT_MILLIS, "UTF-8",
- "DELETE");
+ HttpMethod.DELETE);
}
/**
@@ -120,11 +72,11 @@ public static HttpResult httpDelete(String url, List headers, Map headers, Map paramValues) {
+ public static RestResult httpGet(String url, List headers, Map paramValues) {
return request(url, headers, paramValues, StringUtils.EMPTY, CON_TIME_OUT_MILLIS, TIME_OUT_MILLIS, "UTF-8",
- "GET");
+ HttpMethod.GET);
}
/**
@@ -138,39 +90,31 @@ public static HttpResult httpGet(String url, List headers, Map headers, Map paramValues, String body,
- int connectTimeout, int readTimeout, String encoding, String method) {
- HttpURLConnection conn = null;
+ public static RestResult request(String url, List headers, Map paramValues,
+ String body, int connectTimeout, int readTimeout, String encoding, String method) {
+ Header header = Header.newInstance();
+ if (CollectionUtils.isNotEmpty(headers)) {
+ header.addAll(headers);
+ }
+ header.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
+ header.addParam(HttpHeaderConsts.CLIENT_VERSION_HEADER, VersionUtils.version);
+ header.addParam(HttpHeaderConsts.USER_AGENT_HEADER, UtilsAndCommons.SERVER_VERSION);
+ header.addParam(HttpHeaderConsts.REQUEST_SOURCE_HEADER, ApplicationUtils.getLocalAddress());
+ header.addParam(HttpHeaderConsts.ACCEPT_CHARSET, encoding);
+
+ HttpClientConfig httpClientConfig = HttpClientConfig.builder().setConTimeOutMillis(connectTimeout)
+ .setReadTimeOutMillis(readTimeout).build();
+ Query query = Query.newInstance().initParams(paramValues);
+ query.addParam("encoding", "UTF-8");
+ query.addParam("nofix", "1");
try {
- String encodedContent = encodingParams(paramValues, encoding);
- url += StringUtils.isBlank(encodedContent) ? StringUtils.EMPTY : ("?" + encodedContent);
-
- conn = (HttpURLConnection) new URL(url).openConnection();
- conn.setConnectTimeout(connectTimeout);
- conn.setReadTimeout(readTimeout);
- conn.setRequestMethod(method);
-
- setHeaders(conn, headers, encoding);
-
- if (StringUtils.isNotBlank(body)) {
- conn.setDoOutput(true);
- byte[] b = body.getBytes();
- conn.setRequestProperty("Content-Length", String.valueOf(b.length));
- conn.getOutputStream().write(b, 0, b.length);
- conn.getOutputStream().flush();
- conn.getOutputStream().close();
- }
-
- conn.connect();
-
- return getResult(conn);
+ return SYNC_NACOS_REST_TEMPLATE
+ .exchange(url, httpClientConfig, header, query, body, method, String.class);
} catch (Exception e) {
Loggers.SRV_LOG.warn("Exception while request: {}, caused: {}", url, e);
- return new HttpResult(500, e.toString(), Collections.emptyMap());
- } finally {
- IoUtils.closeQuietly(conn);
+ return RestResult.builder().withCode(500).withMsg(e.toString()).build();
}
}
@@ -180,11 +124,11 @@ public static HttpResult request(String url, List headers, Map headers, Map paramValues,
- AsyncCompletionHandler handler) throws Exception {
- asyncHttpRequest(url, headers, paramValues, handler, HttpMethod.GET);
+ Callback callback) throws Exception {
+ asyncHttpRequest(url, headers, paramValues, callback, HttpMethod.GET);
}
/**
@@ -193,11 +137,11 @@ public static void asyncHttpGet(String url, List headers, Map headers, Map paramValues,
- AsyncCompletionHandler handler) throws Exception {
- asyncHttpRequest(url, headers, paramValues, handler, HttpMethod.POST);
+ Callback callback) throws Exception {
+ asyncHttpRequest(url, headers, paramValues, callback, HttpMethod.POST);
}
/**
@@ -206,11 +150,11 @@ public static void asyncHttpPost(String url, List headers, Map headers, Map paramValues,
- AsyncCompletionHandler handler) throws Exception {
- asyncHttpRequest(url, headers, paramValues, handler, HttpMethod.DELETE);
+ Callback callback) throws Exception {
+ asyncHttpRequest(url, headers, paramValues, callback, HttpMethod.DELETE);
}
/**
@@ -223,124 +167,84 @@ public static void asyncHttpDelete(String url, List headers, Map headers, Map paramValues,
- AsyncCompletionHandler handler, String method) throws Exception {
- if (!MapUtils.isEmpty(paramValues)) {
- String encodedContent = encodingParams(paramValues, "UTF-8");
- url += (null == encodedContent) ? "" : ("?" + encodedContent);
- }
+ Callback callback, String method) throws Exception {
- AsyncHttpClient.BoundRequestBuilder builder;
+ Query query = Query.newInstance().initParams(paramValues);
+ query.addParam("encoding", "UTF-8");
+ query.addParam("nofix", "1");
+
+ Header header = Header.newInstance();
+ if (CollectionUtils.isNotEmpty(headers)) {
+ header.addAll(headers);
+ }
+ header.addParam(HttpHeaderConsts.ACCEPT_CHARSET, "UTF-8");
switch (method) {
case HttpMethod.GET:
- builder = asyncHttpClient.prepareGet(url);
+ ASYNC_REST_TEMPLATE.get(url, header, query, String.class, callback);
break;
case HttpMethod.POST:
- builder = asyncHttpClient.preparePost(url);
+ ASYNC_REST_TEMPLATE.postForm(url, header, paramValues, String.class, callback);
break;
case HttpMethod.PUT:
- builder = asyncHttpClient.preparePut(url);
+ ASYNC_REST_TEMPLATE.putForm(url, header, paramValues, String.class, callback);
break;
case HttpMethod.DELETE:
- builder = asyncHttpClient.prepareDelete(url);
+ ASYNC_REST_TEMPLATE.delete(url, header, query, String.class, callback);
break;
default:
throw new RuntimeException("not supported method:" + method);
}
-
- if (!CollectionUtils.isEmpty(headers)) {
- for (String header : headers) {
- builder.setHeader(header.split("=")[0], header.split("=")[1]);
- }
- }
-
- builder.setHeader("Accept-Charset", "UTF-8");
-
- if (handler != null) {
- builder.execute(handler);
- } else {
- builder.execute();
- }
}
/**
* Request http post method by async with large body.
*
- * @param url url
- * @param headers headers
- * @param content full request content
- * @param handler callback after request execute
+ * @param url url
+ * @param headers headers
+ * @param content full request content
+ * @param callback callback after request execute
*/
- public static void asyncHttpPostLarge(String url, List headers, String content,
- AsyncCompletionHandler handler) throws Exception {
- asyncHttpPostLarge(url, headers, content.getBytes(), handler);
+ public static void asyncHttpPostLarge(String url, List headers, String content, Callback callback)
+ throws Exception {
+ asyncHttpPostLarge(url, headers, content.getBytes(), callback);
}
/**
* Request http post method by async with large body.
*
- * @param url url
- * @param headers headers
- * @param content full request content
- * @param handler callback after request execute
+ * @param url url
+ * @param headers headers
+ * @param content full request content
+ * @param callback callback after request execute
*/
- public static void asyncHttpPostLarge(String url, List headers, byte[] content,
- AsyncCompletionHandler handler) throws Exception {
- AsyncHttpClient.BoundRequestBuilder builder = asyncHttpClient.preparePost(url);
-
- if (!CollectionUtils.isEmpty(headers)) {
- for (String header : headers) {
- builder.setHeader(header.split("=")[0], header.split("=")[1]);
- }
- }
-
- builder.setBody(content);
-
- builder.setHeader("Content-Type", "application/json; charset=UTF-8");
- builder.setHeader("Accept-Charset", "UTF-8");
- builder.setHeader("Accept-Encoding", "gzip");
- builder.setHeader("Content-Encoding", "gzip");
-
- if (handler != null) {
- builder.execute(handler);
- } else {
- builder.execute();
+ public static void asyncHttpPostLarge(String url, List headers, byte[] content, Callback callback)
+ throws Exception {
+ Header header = Header.newInstance();
+ if (CollectionUtils.isNotEmpty(headers)) {
+ header.addAll(headers);
}
+ ASYNC_REST_TEMPLATE.post(url, header, Query.EMPTY, content, String.class, callback);
}
/**
* Request http delete method by async with large body.
*
- * @param url url
- * @param headers headers
- * @param content full request content
- * @param handler callback after request execute
+ * @param url url
+ * @param headers headers
+ * @param content full request content
+ * @param callback callback after request execute
*/
- public static void asyncHttpDeleteLarge(String url, List headers, String content,
- AsyncCompletionHandler handler) throws Exception {
- AsyncHttpClient.BoundRequestBuilder builder = asyncHttpClient.prepareDelete(url);
-
- if (!CollectionUtils.isEmpty(headers)) {
- for (String header : headers) {
- builder.setHeader(header.split("=")[0], header.split("=")[1]);
- }
- }
-
- builder.setBody(content.getBytes());
-
- builder.setHeader("Content-Type", "application/json; charset=UTF-8");
- builder.setHeader("Accept-Charset", "UTF-8");
- builder.setHeader("Accept-Encoding", "gzip");
- builder.setHeader("Content-Encoding", "gzip");
-
- if (handler != null) {
- builder.execute(handler);
- } else {
- builder.execute();
+ public static void asyncHttpDeleteLarge(String url, List headers, String content, Callback callback)
+ throws Exception {
+ Header header = Header.newInstance();
+ if (CollectionUtils.isNotEmpty(headers)) {
+ header.addAll(headers);
}
+ ASYNC_REST_TEMPLATE.delete(url, header, content, String.class, callback);
}
- public static HttpResult httpPost(String url, List headers, Map paramValues) {
+ public static RestResult httpPost(String url, List headers, Map paramValues) {
return httpPost(url, headers, paramValues, "UTF-8");
}
@@ -351,109 +255,40 @@ public static HttpResult httpPost(String url, List headers, Map headers, Map paramValues,
+ public static RestResult httpPost(String url, List headers, Map paramValues,
String encoding) {
try {
-
- HttpPost httpost = new HttpPost(url);
-
- RequestConfig requestConfig = RequestConfig.custom().setConnectionRequestTimeout(5000)
- .setConnectTimeout(5000).setSocketTimeout(5000).setRedirectsEnabled(true).setMaxRedirects(5)
- .build();
- httpost.setConfig(requestConfig);
-
- List nvps = new ArrayList();
-
- for (Map.Entry entry : paramValues.entrySet()) {
- nvps.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));
+ Header header = Header.newInstance();
+ if (CollectionUtils.isNotEmpty(headers)) {
+ header.addAll(headers);
}
+ header.addParam(HttpHeaderConsts.ACCEPT_CHARSET, encoding);
- httpost.setEntity(new UrlEncodedFormEntity(nvps, encoding));
- HttpResponse response = postClient.execute(httpost);
- HttpEntity entity = response.getEntity();
-
- String charset = encoding;
- if (entity.getContentType() != null) {
-
- HeaderElement[] headerElements = entity.getContentType().getElements();
-
- if (headerElements != null && headerElements.length > 0 && headerElements[0] != null
- && headerElements[0].getParameterByName("charset") != null) {
- charset = headerElements[0].getParameterByName("charset").getValue();
- }
- }
-
- return new HttpResult(response.getStatusLine().getStatusCode(),
- IoUtils.toString(entity.getContent(), charset), Collections.emptyMap());
+ HttpClientConfig httpClientConfig = HttpClientConfig.builder().setConTimeOutMillis(5000).setReadTimeOutMillis(5000)
+ .setConnectionRequestTimeout(5000).setMaxRedirects(5).build();
+ return APACHE_SYNC_NACOS_REST_TEMPLATE.postForm(url, httpClientConfig, header, paramValues, String.class);
} catch (Throwable e) {
- return new HttpResult(500, e.toString(), Collections.emptyMap());
+ return RestResult.builder().withCode(500).withMsg(e.toString()).build();
}
}
/**
* Request http put method by async with large body.
*
- * @param url url
- * @param headers headers
- * @param content full request content
- * @param handler callback after request execute
+ * @param url url
+ * @param headers headers
+ * @param content full request content
+ * @param callback callback after request execute
*/
public static void asyncHttpPutLarge(String url, Map headers, byte[] content,
- AsyncCompletionHandler handler) throws Exception {
- AsyncHttpClient.BoundRequestBuilder builder = asyncHttpClient.preparePut(url);
-
- if (!headers.isEmpty()) {
- for (String headerKey : headers.keySet()) {
- builder.setHeader(headerKey, headers.get(headerKey));
- }
- }
-
- builder.setBody(content);
-
- builder.setHeader("Content-Type", "application/json; charset=UTF-8");
- builder.setHeader("Accept-Charset", "UTF-8");
- builder.setHeader("Accept-Encoding", "gzip");
- builder.setHeader("Content-Encoding", "gzip");
-
- if (handler != null) {
- builder.execute(handler);
- } else {
- builder.execute();
- }
- }
-
- /**
- * Request http get method by async with large body.
- *
- * @param url url
- * @param headers headers
- * @param content full request content
- * @param handler callback after request execute
- */
- public static void asyncHttpGetLarge(String url, Map headers, byte[] content,
- AsyncCompletionHandler handler) throws Exception {
- AsyncHttpClient.BoundRequestBuilder builder = asyncHttpClient.prepareGet(url);
-
- if (!headers.isEmpty()) {
- for (String headerKey : headers.keySet()) {
- builder.setHeader(headerKey, headers.get(headerKey));
- }
- }
-
- builder.setBody(content);
-
- builder.setHeader("Content-Type", "application/json; charset=UTF-8");
- builder.setHeader("Accept-Charset", "UTF-8");
- builder.setHeader("Accept-Encoding", "gzip");
- builder.setHeader("Content-Encoding", "gzip");
-
- if (handler != null) {
- builder.execute(handler);
- } else {
- builder.execute();
+ Callback callback) throws Exception {
+ Header header = Header.newInstance();
+ if (MapUtils.isNotEmpty(headers)) {
+ header.addAll(headers);
}
+ ASYNC_REST_TEMPLATE.put(url, header, Query.EMPTY, content, String.class, callback);
}
/**
@@ -462,29 +297,17 @@ public static void asyncHttpGetLarge(String url, Map headers, by
* @param url url
* @param headers headers
* @param content full request content
- * @return {@link HttpResult} as response
+ * @return {@link RestResult} as response
*/
- public static HttpResult httpPutLarge(String url, Map headers, byte[] content) {
- HttpClientBuilder builder = HttpClients.custom().setUserAgent(UtilsAndCommons.SERVER_VERSION)
- .setConnectionTimeToLive(500, TimeUnit.MILLISECONDS);
- try (CloseableHttpClient httpClient = builder.build();) {
-
- HttpPut httpPut = new HttpPut(url);
- for (Map.Entry entry : headers.entrySet()) {
- httpPut.setHeader(entry.getKey(), entry.getValue());
- }
- httpPut.setEntity(new ByteArrayEntity(content, ContentType.APPLICATION_JSON));
-
- HttpResponse response = httpClient.execute(httpPut);
- HttpEntity entity = response.getEntity();
-
- HeaderElement[] headerElements = entity.getContentType().getElements();
- String charset = headerElements[0].getParameterByName("charset").getValue();
-
- return new HttpResult(response.getStatusLine().getStatusCode(),
- IoUtils.toString(entity.getContent(), charset), Collections.emptyMap());
+ public static RestResult httpPutLarge(String url, Map headers, byte[] content) {
+ Header header = Header.newInstance();
+ if (MapUtils.isNotEmpty(headers)) {
+ header.addAll(headers);
+ }
+ try {
+ return APACHE_SYNC_NACOS_REST_TEMPLATE.put(url, header, Query.EMPTY, content, String.class);
} catch (Exception e) {
- return new HttpResult(500, e.toString(), Collections.emptyMap());
+ return RestResult.builder().withCode(500).withMsg(e.toString()).build();
}
}
@@ -494,33 +317,17 @@ public static HttpResult httpPutLarge(String url, Map headers, b
* @param url url
* @param headers headers
* @param content full request content
- * @return {@link HttpResult} as response
+ * @return {@link RestResult} as response
*/
- public static HttpResult httpGetLarge(String url, Map headers, String content) {
- HttpClientBuilder builder = HttpClients.custom();
- builder.setUserAgent(UtilsAndCommons.SERVER_VERSION);
- builder.setConnectionTimeToLive(500, TimeUnit.MILLISECONDS);
- try (CloseableHttpClient httpClient = builder.build();) {
-
- HttpGetWithEntity httpGetWithEntity = new HttpGetWithEntity();
- httpGetWithEntity.setURI(new URI(url));
-
- for (Map.Entry entry : headers.entrySet()) {
- httpGetWithEntity.setHeader(entry.getKey(), entry.getValue());
- }
-
- httpGetWithEntity.setEntity(new StringEntity(content, ContentType.create("application/json", "UTF-8")));
-
- HttpResponse response = httpClient.execute(httpGetWithEntity);
- HttpEntity entity = response.getEntity();
-
- HeaderElement[] headerElements = entity.getContentType().getElements();
- String charset = headerElements[0].getParameterByName("charset").getValue();
-
- return new HttpResult(response.getStatusLine().getStatusCode(),
- IoUtils.toString(entity.getContent(), charset), Collections.emptyMap());
+ public static RestResult httpGetLarge(String url, Map headers, String content) {
+ Header header = Header.newInstance();
+ if (MapUtils.isNotEmpty(headers)) {
+ header.addAll(headers);
+ }
+ try {
+ return APACHE_SYNC_NACOS_REST_TEMPLATE.getLarge(url, header, Query.EMPTY, content, String.class);
} catch (Exception e) {
- return new HttpResult(500, e.toString(), Collections.emptyMap());
+ return RestResult.builder().withCode(500).withMsg(e.toString()).build();
}
}
@@ -530,124 +337,18 @@ public static HttpResult httpGetLarge(String url, Map headers, S
* @param url url
* @param headers headers
* @param content full request content
- * @return {@link HttpResult} as response
+ * @return {@link RestResult} as response
*/
- public static HttpResult httpPostLarge(String url, Map headers, String content) {
- HttpClientBuilder builder = HttpClients.custom();
- builder.setUserAgent(UtilsAndCommons.SERVER_VERSION);
- builder.setConnectionTimeToLive(500, TimeUnit.MILLISECONDS);
- try (CloseableHttpClient httpClient = builder.build();) {
-
- HttpPost httpost = new HttpPost(url);
-
- for (Map.Entry entry : headers.entrySet()) {
- httpost.setHeader(entry.getKey(), entry.getValue());
- }
-
- httpost.setEntity(new StringEntity(content, ContentType.create("application/json", "UTF-8")));
- HttpResponse response = httpClient.execute(httpost);
- HttpEntity entity = response.getEntity();
-
- HeaderElement[] headerElements = entity.getContentType().getElements();
- String charset = headerElements[0].getParameterByName("charset").getValue();
-
- return new HttpResult(response.getStatusLine().getStatusCode(),
- IoUtils.toString(entity.getContent(), charset), Collections.emptyMap());
- } catch (Exception e) {
- return new HttpResult(500, e.toString(), Collections.emptyMap());
- }
- }
-
- private static HttpResult getResult(HttpURLConnection conn) throws IOException {
- int respCode = conn.getResponseCode();
-
- InputStream inputStream;
- if (HttpURLConnection.HTTP_OK == respCode) {
- inputStream = conn.getInputStream();
- } else {
- inputStream = conn.getErrorStream();
- }
-
- Map respHeaders = new HashMap(conn.getHeaderFields().size());
- for (Map.Entry> entry : conn.getHeaderFields().entrySet()) {
- respHeaders.put(entry.getKey(), entry.getValue().get(0));
- }
-
- String gzipEncoding = "gzip";
-
- if (gzipEncoding.equals(respHeaders.get(HttpHeaders.CONTENT_ENCODING))) {
- inputStream = new GZIPInputStream(inputStream);
+ public static RestResult httpPostLarge(String url, Map headers, String content) {
+ Header header = Header.newInstance();
+ if (MapUtils.isNotEmpty(headers)) {
+ header.addAll(headers);
}
-
- return new HttpResult(respCode, IoUtils.toString(inputStream, getCharset(conn)), respHeaders);
- }
-
- private static String getCharset(HttpURLConnection conn) {
- String contentType = conn.getContentType();
- if (StringUtils.isEmpty(contentType)) {
- return "UTF-8";
- }
-
- String[] values = contentType.split(";");
- if (values.length == 0) {
- return "UTF-8";
- }
-
- String charset = "UTF-8";
- for (String value : values) {
- value = value.trim();
-
- if (value.toLowerCase().startsWith("charset=")) {
- charset = value.substring("charset=".length());
- }
- }
-
- return charset;
- }
-
- private static void setHeaders(HttpURLConnection conn, List headers, String encoding) {
- if (null != headers) {
- for (Iterator iter = headers.iterator(); iter.hasNext(); ) {
- conn.addRequestProperty(iter.next(), iter.next());
- }
- }
-
- conn.addRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=" + encoding);
- conn.addRequestProperty("Accept-Charset", encoding);
- conn.addRequestProperty(HttpHeaderConsts.CLIENT_VERSION_HEADER, VersionUtils.version);
- conn.addRequestProperty(HttpHeaderConsts.USER_AGENT_HEADER, UtilsAndCommons.SERVER_VERSION);
- conn.addRequestProperty(HttpHeaderConsts.REQUEST_SOURCE_HEADER, ApplicationUtils.getLocalAddress());
- }
-
- /**
- * Encoding parameters.
- *
- * @param params parameters
- * @param encoding charset
- * @return parameters string
- * @throws UnsupportedEncodingException unsupported encodin exception
- */
- public static String encodingParams(Map params, String encoding)
- throws UnsupportedEncodingException {
- StringBuilder sb = new StringBuilder();
- if (null == params || params.isEmpty()) {
- return null;
- }
-
- params.put("encoding", encoding);
- params.put("nofix", "1");
-
- for (Map.Entry entry : params.entrySet()) {
- if (StringUtils.isEmpty(entry.getValue())) {
- continue;
- }
-
- sb.append(entry.getKey()).append("=");
- sb.append(URLEncoder.encode(entry.getValue(), encoding));
- sb.append("&");
+ try {
+ return APACHE_SYNC_NACOS_REST_TEMPLATE.postJson(url, header, content, String.class);
+ } catch (Exception e) {
+ return RestResult.builder().withCode(500).withMsg(e.toString()).build();
}
-
- return sb.toString();
}
/**
@@ -664,33 +365,4 @@ public static Map translateParameterMap(Map pa
}
return map;
}
-
- public static class HttpResult {
-
- public final int code;
-
- public final String content;
-
- private final Map respHeaders;
-
- public HttpResult(int code, String content, Map respHeaders) {
- this.code = code;
- this.content = content;
- this.respHeaders = respHeaders;
- }
-
- public String getHeader(String name) {
- return respHeaders.get(name);
- }
- }
-
- public static class HttpGetWithEntity extends HttpEntityEnclosingRequestBase {
-
- public static final String METHOD_NAME = "GET";
-
- @Override
- public String getMethod() {
- return METHOD_NAME;
- }
- }
}
diff --git a/naming/src/main/java/com/alibaba/nacos/naming/misc/HttpClientManager.java b/naming/src/main/java/com/alibaba/nacos/naming/misc/HttpClientManager.java
new file mode 100644
index 00000000000..bd1e3153c8b
--- /dev/null
+++ b/naming/src/main/java/com/alibaba/nacos/naming/misc/HttpClientManager.java
@@ -0,0 +1,149 @@
+/*
+ * Copyright 1999-2018 Alibaba Group Holding Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.alibaba.nacos.naming.misc;
+
+import com.alibaba.nacos.common.http.AbstractApacheHttpClientFactory;
+import com.alibaba.nacos.common.http.AbstractHttpClientFactory;
+import com.alibaba.nacos.common.http.HttpClientBeanHolder;
+import com.alibaba.nacos.common.http.HttpClientConfig;
+import com.alibaba.nacos.common.http.HttpClientFactory;
+import com.alibaba.nacos.common.http.client.NacosAsyncRestTemplate;
+import com.alibaba.nacos.common.http.client.NacosRestTemplate;
+import com.alibaba.nacos.common.utils.ExceptionUtil;
+import com.alibaba.nacos.common.utils.ThreadUtils;
+import org.slf4j.Logger;
+
+import java.util.concurrent.TimeUnit;
+
+import static com.alibaba.nacos.naming.misc.Loggers.SRV_LOG;
+
+/**
+ * http Manager.
+ *
+ * @author mai.jh
+ */
+public class HttpClientManager {
+
+ private static final int TIME_OUT_MILLIS = 10000;
+
+ private static final int CON_TIME_OUT_MILLIS = 5000;
+
+ private static final HttpClientFactory SYNC_HTTP_CLIENT_FACTORY = new SyncHttpClientFactory();
+
+ private static final HttpClientFactory ASYNC_HTTP_CLIENT_FACTORY = new AsyncHttpClientFactory();
+
+ private static final HttpClientFactory APACHE_SYNC_HTTP_CLIENT_FACTORY = new ApacheSyncHttpClientFactory();
+
+ private static final NacosRestTemplate NACOS_REST_TEMPLATE;
+
+ private static final NacosRestTemplate APACHE_NACOS_REST_TEMPLATE;
+
+ private static final NacosAsyncRestTemplate NACOS_ASYNC_REST_TEMPLATE;
+
+ static {
+ // build nacos rest template
+ NACOS_REST_TEMPLATE = HttpClientBeanHolder.getNacosRestTemplate(SYNC_HTTP_CLIENT_FACTORY);
+ APACHE_NACOS_REST_TEMPLATE = HttpClientBeanHolder.getNacosRestTemplate(APACHE_SYNC_HTTP_CLIENT_FACTORY);
+ NACOS_ASYNC_REST_TEMPLATE = HttpClientBeanHolder.getNacosAsyncRestTemplate(ASYNC_HTTP_CLIENT_FACTORY);
+
+ ThreadUtils.addShutdownHook(new Runnable() {
+ @Override
+ public void run() {
+ shutdown();
+ }
+ });
+ }
+
+ public static NacosRestTemplate getNacosRestTemplate() {
+ return NACOS_REST_TEMPLATE;
+ }
+
+ /**
+ * Use apache http client to achieve.
+ * @return NacosRestTemplate
+ */
+ public static NacosRestTemplate getApacheRestTemplate() {
+ return APACHE_NACOS_REST_TEMPLATE;
+ }
+
+ public static NacosAsyncRestTemplate getAsyncRestTemplate() {
+ return NACOS_ASYNC_REST_TEMPLATE;
+ }
+
+ private static void shutdown() {
+ SRV_LOG.warn("[NamingServerHttpClientManager] Start destroying HTTP-Client");
+ try {
+ HttpClientBeanHolder.shutdownNacostSyncRest(SYNC_HTTP_CLIENT_FACTORY.getClass().getName());
+ HttpClientBeanHolder.shutdownNacostSyncRest(APACHE_SYNC_HTTP_CLIENT_FACTORY.getClass().getName());
+ HttpClientBeanHolder.shutdownNacosAsyncRest(ASYNC_HTTP_CLIENT_FACTORY.getClass().getName());
+ } catch (Exception ex) {
+ SRV_LOG.error("[NamingServerHttpClientManager] An exception occurred when the HTTP client was closed : {}",
+ ExceptionUtil.getStackTrace(ex));
+ }
+ SRV_LOG.warn("[NamingServerHttpClientManager] Destruction of the end");
+ }
+
+ private static class AsyncHttpClientFactory extends AbstractHttpClientFactory {
+
+ @Override
+ protected HttpClientConfig buildHttpClientConfig() {
+ return HttpClientConfig.builder().setConTimeOutMillis(CON_TIME_OUT_MILLIS)
+ .setReadTimeOutMillis(TIME_OUT_MILLIS)
+ .setUserAgent(UtilsAndCommons.SERVER_VERSION)
+ .setMaxConnTotal(-1)
+ .setMaxConnPerRoute(128)
+ .setMaxRedirects(0).build();
+ }
+
+ @Override
+ protected Logger assignLogger() {
+ return SRV_LOG;
+ }
+ }
+
+ private static class SyncHttpClientFactory extends AbstractHttpClientFactory {
+
+ @Override
+ protected HttpClientConfig buildHttpClientConfig() {
+ return HttpClientConfig.builder().setConTimeOutMillis(CON_TIME_OUT_MILLIS)
+ .setReadTimeOutMillis(TIME_OUT_MILLIS)
+ .setMaxRedirects(0).build();
+ }
+
+ @Override
+ protected Logger assignLogger() {
+ return SRV_LOG;
+ }
+ }
+
+ private static class ApacheSyncHttpClientFactory extends AbstractApacheHttpClientFactory {
+
+ @Override
+ protected HttpClientConfig buildHttpClientConfig() {
+ return HttpClientConfig.builder()
+ .setConnectionTimeToLive(500, TimeUnit.MILLISECONDS)
+ .setMaxConnTotal(Runtime.getRuntime().availableProcessors() * 2)
+ .setMaxConnPerRoute(Runtime.getRuntime().availableProcessors())
+ .setMaxRedirects(0).build();
+ }
+
+ @Override
+ protected Logger assignLogger() {
+ return SRV_LOG;
+ }
+ }
+}
diff --git a/naming/src/main/java/com/alibaba/nacos/naming/misc/NamingProxy.java b/naming/src/main/java/com/alibaba/nacos/naming/misc/NamingProxy.java
index 1225af7f180..cb64140610d 100644
--- a/naming/src/main/java/com/alibaba/nacos/naming/misc/NamingProxy.java
+++ b/naming/src/main/java/com/alibaba/nacos/naming/misc/NamingProxy.java
@@ -17,11 +17,11 @@
package com.alibaba.nacos.naming.misc;
import com.alibaba.nacos.common.constant.HttpHeaderConsts;
+import com.alibaba.nacos.common.http.Callback;
+import com.alibaba.nacos.common.model.RestResult;
import com.alibaba.nacos.common.utils.JacksonUtils;
import com.alibaba.nacos.common.utils.VersionUtils;
import com.alibaba.nacos.core.utils.ApplicationUtils;
-import com.ning.http.client.AsyncCompletionHandler;
-import com.ning.http.client.Response;
import org.apache.commons.lang3.StringUtils;
import java.io.IOException;
@@ -69,28 +69,32 @@ public static void syncCheckSums(byte[] checksums, String server) {
headers.put(HttpHeaderConsts.CLIENT_VERSION_HEADER, VersionUtils.version);
headers.put(HttpHeaderConsts.USER_AGENT_HEADER, UtilsAndCommons.SERVER_VERSION);
- headers.put("Connection", "Keep-Alive");
+ headers.put(HttpHeaderConsts.CONNECTION, "Keep-Alive");
HttpClient.asyncHttpPutLarge(
"http://" + server + ApplicationUtils.getContextPath() + UtilsAndCommons.NACOS_NAMING_CONTEXT
+ TIMESTAMP_SYNC_URL + "?source=" + NetUtils.localServer(), headers, checksums,
- new AsyncCompletionHandler() {
+ new Callback() {
@Override
- public Object onCompleted(Response response) throws Exception {
- if (HttpURLConnection.HTTP_OK != response.getStatusCode()) {
+ public void onReceive(RestResult result) {
+ if (!result.ok()) {
Loggers.DISTRO.error("failed to req API: {}, code: {}, msg: {}",
"http://" + server + ApplicationUtils.getContextPath()
+ UtilsAndCommons.NACOS_NAMING_CONTEXT + TIMESTAMP_SYNC_URL,
- response.getStatusCode(), response.getResponseBody());
+ result.getCode(), result.getMessage());
}
- return null;
}
-
+
@Override
- public void onThrowable(Throwable t) {
+ public void onError(Throwable throwable) {
Loggers.DISTRO
.error("failed to req API:" + "http://" + server + ApplicationUtils.getContextPath()
- + UtilsAndCommons.NACOS_NAMING_CONTEXT + TIMESTAMP_SYNC_URL, t);
+ + UtilsAndCommons.NACOS_NAMING_CONTEXT + TIMESTAMP_SYNC_URL, throwable);
+ }
+
+ @Override
+ public void onCancel() {
+
}
});
} catch (Exception e) {
@@ -110,17 +114,17 @@ public static byte[] getData(List keys, String server) throws Exception
Map params = new HashMap<>(8);
params.put("keys", StringUtils.join(keys, ","));
- HttpClient.HttpResult result = HttpClient.httpGetLarge(
+ RestResult result = HttpClient.httpGetLarge(
"http://" + server + ApplicationUtils.getContextPath() + UtilsAndCommons.NACOS_NAMING_CONTEXT
+ DATA_GET_URL, new HashMap<>(8), JacksonUtils.toJson(params));
- if (HttpURLConnection.HTTP_OK == result.code) {
- return result.content.getBytes();
+ if (result.ok()) {
+ return result.getData().getBytes();
}
throw new IOException("failed to req API: " + "http://" + server + ApplicationUtils.getContextPath()
- + UtilsAndCommons.NACOS_NAMING_CONTEXT + DATA_GET_URL + ". code: " + result.code + " msg: "
- + result.content);
+ + UtilsAndCommons.NACOS_NAMING_CONTEXT + DATA_GET_URL + ". code: " + result.getCode() + " msg: "
+ + result.getMessage());
}
/**
@@ -133,17 +137,17 @@ public static byte[] getData(List keys, String server) throws Exception
public static byte[] getAllData(String server) throws Exception {
Map params = new HashMap<>(8);
- HttpClient.HttpResult result = HttpClient.httpGet(
+ RestResult result = HttpClient.httpGet(
"http://" + server + ApplicationUtils.getContextPath() + UtilsAndCommons.NACOS_NAMING_CONTEXT
+ ALL_DATA_GET_URL, new ArrayList<>(), params);
- if (HttpURLConnection.HTTP_OK == result.code) {
- return result.content.getBytes();
+ if (result.ok()) {
+ return result.getData().getBytes();
}
throw new IOException("failed to req API: " + "http://" + server + ApplicationUtils.getContextPath()
- + UtilsAndCommons.NACOS_NAMING_CONTEXT + DATA_GET_URL + ". code: " + result.code + " msg: "
- + result.content);
+ + UtilsAndCommons.NACOS_NAMING_CONTEXT + DATA_GET_URL + ". code: " + result.getCode() + " msg: "
+ + result.getMessage());
}
/**
@@ -158,23 +162,23 @@ public static boolean syncData(byte[] data, String curServer) {
headers.put(HttpHeaderConsts.CLIENT_VERSION_HEADER, VersionUtils.version);
headers.put(HttpHeaderConsts.USER_AGENT_HEADER, UtilsAndCommons.SERVER_VERSION);
- headers.put("Accept-Encoding", "gzip,deflate,sdch");
- headers.put("Connection", "Keep-Alive");
- headers.put("Content-Encoding", "gzip");
+ headers.put(HttpHeaderConsts.ACCEPT_ENCODING, "gzip,deflate,sdch");
+ headers.put(HttpHeaderConsts.CONNECTION, "Keep-Alive");
+ headers.put(HttpHeaderConsts.CONTENT_ENCODING, "gzip");
try {
- HttpClient.HttpResult result = HttpClient.httpPutLarge(
+ RestResult result = HttpClient.httpPutLarge(
"http://" + curServer + ApplicationUtils.getContextPath() + UtilsAndCommons.NACOS_NAMING_CONTEXT
+ DATA_ON_SYNC_URL, headers, data);
- if (HttpURLConnection.HTTP_OK == result.code) {
+ if (result.ok()) {
return true;
}
- if (HttpURLConnection.HTTP_NOT_MODIFIED == result.code) {
+ if (HttpURLConnection.HTTP_NOT_MODIFIED == result.getCode()) {
return true;
}
throw new IOException("failed to req API:" + "http://" + curServer + ApplicationUtils.getContextPath()
- + UtilsAndCommons.NACOS_NAMING_CONTEXT + DATA_ON_SYNC_URL + ". code:" + result.code + " msg: "
- + result.content);
+ + UtilsAndCommons.NACOS_NAMING_CONTEXT + DATA_ON_SYNC_URL + ". code:" + result.getCode() + " msg: "
+ + result.getData());
} catch (Exception e) {
Loggers.SRV_LOG.warn("NamingProxy", e);
}
@@ -196,7 +200,7 @@ public static String reqApi(String api, Map params, String curSe
HttpHeaderConsts.USER_AGENT_HEADER, UtilsAndCommons.SERVER_VERSION, "Accept-Encoding",
"gzip,deflate,sdch", "Connection", "Keep-Alive", "Content-Encoding", "gzip");
- HttpClient.HttpResult result;
+ RestResult result;
if (!curServer.contains(UtilsAndCommons.IP_PORT_SPLITER)) {
curServer = curServer + UtilsAndCommons.IP_PORT_SPLITER + ApplicationUtils.getPort();
@@ -204,17 +208,17 @@ public static String reqApi(String api, Map params, String curSe
result = HttpClient.httpGet("http://" + curServer + api, headers, params);
- if (HttpURLConnection.HTTP_OK == result.code) {
- return result.content;
+ if (result.ok()) {
+ return result.getData();
}
- if (HttpURLConnection.HTTP_NOT_MODIFIED == result.code) {
+ if (HttpURLConnection.HTTP_NOT_MODIFIED == result.getCode()) {
return StringUtils.EMPTY;
}
throw new IOException(
- "failed to req API:" + "http://" + curServer + api + ". code:" + result.code + " msg: "
- + result.content);
+ "failed to req API:" + "http://" + curServer + api + ". code:" + result.getCode() + " msg: "
+ + result.getMessage());
} catch (Exception e) {
Loggers.SRV_LOG.warn("NamingProxy", e);
}
@@ -238,7 +242,7 @@ public static String reqApi(String api, Map params, String curSe
HttpHeaderConsts.USER_AGENT_HEADER, UtilsAndCommons.SERVER_VERSION, "Accept-Encoding",
"gzip,deflate,sdch", "Connection", "Keep-Alive", "Content-Encoding", "gzip");
- HttpClient.HttpResult result;
+ RestResult result;
if (!curServer.contains(UtilsAndCommons.IP_PORT_SPLITER)) {
curServer = curServer + UtilsAndCommons.IP_PORT_SPLITER + ApplicationUtils.getPort();
@@ -254,17 +258,17 @@ public static String reqApi(String api, Map params, String curSe
+ "/api/" + api, headers, params);
}
- if (HttpURLConnection.HTTP_OK == result.code) {
- return result.content;
+ if (result.ok()) {
+ return result.getData();
}
- if (HttpURLConnection.HTTP_NOT_MODIFIED == result.code) {
+ if (HttpURLConnection.HTTP_NOT_MODIFIED == result.getCode()) {
return StringUtils.EMPTY;
}
throw new IOException("failed to req API:" + "http://" + curServer + ApplicationUtils.getContextPath()
- + UtilsAndCommons.NACOS_NAMING_CONTEXT + "/api/" + api + ". code:" + result.code + " msg: "
- + result.content);
+ + UtilsAndCommons.NACOS_NAMING_CONTEXT + "/api/" + api + ". code:" + result.getCode() + " msg: "
+ + result.getMessage());
} catch (Exception e) {
Loggers.SRV_LOG.warn("NamingProxy", e);
}
@@ -288,7 +292,7 @@ public static String reqCommon(String path, Map params, String c
UtilsAndCommons.SERVER_VERSION, "Accept-Encoding", "gzip,deflate,sdch", "Connection", "Keep-Alive",
"Content-Encoding", "gzip");
- HttpClient.HttpResult result;
+ RestResult result;
if (!curServer.contains(UtilsAndCommons.IP_PORT_SPLITER)) {
curServer = curServer + UtilsAndCommons.IP_PORT_SPLITER + ApplicationUtils.getPort();
@@ -304,17 +308,17 @@ public static String reqCommon(String path, Map params, String c
+ path, headers, params);
}
- if (HttpURLConnection.HTTP_OK == result.code) {
- return result.content;
+ if (result.ok()) {
+ return result.getData();
}
- if (HttpURLConnection.HTTP_NOT_MODIFIED == result.code) {
+ if (HttpURLConnection.HTTP_NOT_MODIFIED == result.getCode()) {
return StringUtils.EMPTY;
}
throw new IOException("failed to req API:" + "http://" + curServer + ApplicationUtils.getContextPath()
- + UtilsAndCommons.NACOS_NAMING_CONTEXT + path + ". code:" + result.code + " msg: "
- + result.content);
+ + UtilsAndCommons.NACOS_NAMING_CONTEXT + path + ". code:" + result.getCode() + " msg: "
+ + result.getMessage());
} catch (Exception e) {
Loggers.SRV_LOG.warn("NamingProxy", e);
}
diff --git a/naming/src/main/java/com/alibaba/nacos/naming/misc/ServerStatusSynchronizer.java b/naming/src/main/java/com/alibaba/nacos/naming/misc/ServerStatusSynchronizer.java
index bb1243891f4..cb8cf3f1045 100644
--- a/naming/src/main/java/com/alibaba/nacos/naming/misc/ServerStatusSynchronizer.java
+++ b/naming/src/main/java/com/alibaba/nacos/naming/misc/ServerStatusSynchronizer.java
@@ -16,12 +16,11 @@
package com.alibaba.nacos.naming.misc;
+import com.alibaba.nacos.common.http.Callback;
+import com.alibaba.nacos.common.model.RestResult;
import com.alibaba.nacos.core.utils.ApplicationUtils;
-import com.ning.http.client.AsyncCompletionHandler;
-import com.ning.http.client.Response;
import org.springframework.util.StringUtils;
-import java.net.HttpURLConnection;
import java.util.HashMap;
import java.util.Map;
@@ -52,15 +51,23 @@ public void send(final String serverIP, Message msg) {
}
try {
- HttpClient.asyncHttpGet(url, null, params, new AsyncCompletionHandler() {
+ HttpClient.asyncHttpGet(url, null, params, new Callback() {
@Override
- public Integer onCompleted(Response response) throws Exception {
- if (response.getStatusCode() != HttpURLConnection.HTTP_OK) {
+ public void onReceive(RestResult result) {
+ if (!result.ok()) {
Loggers.SRV_LOG.warn("[STATUS-SYNCHRONIZE] failed to request serverStatus, remote server: {}",
serverIP);
- return 1;
}
- return 0;
+ }
+
+ @Override
+ public void onError(Throwable throwable) {
+ Loggers.SRV_LOG.warn("[STATUS-SYNCHRONIZE] failed to request serverStatus, remote server: {}", serverIP, throwable);
+ }
+
+ @Override
+ public void onCancel() {
+
}
});
} catch (Exception e) {
diff --git a/naming/src/main/java/com/alibaba/nacos/naming/misc/ServiceStatusSynchronizer.java b/naming/src/main/java/com/alibaba/nacos/naming/misc/ServiceStatusSynchronizer.java
index c65fa93c271..94001825942 100644
--- a/naming/src/main/java/com/alibaba/nacos/naming/misc/ServiceStatusSynchronizer.java
+++ b/naming/src/main/java/com/alibaba/nacos/naming/misc/ServiceStatusSynchronizer.java
@@ -16,13 +16,12 @@
package com.alibaba.nacos.naming.misc;
+import com.alibaba.nacos.common.http.Callback;
+import com.alibaba.nacos.common.model.RestResult;
import com.alibaba.nacos.common.utils.JacksonUtils;
import com.alibaba.nacos.core.utils.ApplicationUtils;
-import com.ning.http.client.AsyncCompletionHandler;
-import com.ning.http.client.Response;
import org.apache.commons.lang3.StringUtils;
-import java.net.HttpURLConnection;
import java.util.HashMap;
import java.util.Map;
@@ -53,16 +52,24 @@ public void send(final String serverIP, Message msg) {
}
try {
- HttpClient.asyncHttpPostLarge(url, null, JacksonUtils.toJson(params), new AsyncCompletionHandler() {
+ HttpClient.asyncHttpPostLarge(url, null, JacksonUtils.toJson(params), new Callback() {
@Override
- public Integer onCompleted(Response response) throws Exception {
- if (response.getStatusCode() != HttpURLConnection.HTTP_OK) {
+ public void onReceive(RestResult result) {
+ if (!result.ok()) {
Loggers.SRV_LOG.warn("[STATUS-SYNCHRONIZE] failed to request serviceStatus, remote server: {}",
serverIP);
-
- return 1;
+
}
- return 0;
+ }
+
+ @Override
+ public void onError(Throwable throwable) {
+ Loggers.SRV_LOG.warn("[STATUS-SYNCHRONIZE] failed to request serviceStatus, remote server: " + serverIP, throwable);
+ }
+
+ @Override
+ public void onCancel() {
+
}
});
} catch (Exception e) {
diff --git a/naming/src/main/java/com/alibaba/nacos/naming/web/DistroFilter.java b/naming/src/main/java/com/alibaba/nacos/naming/web/DistroFilter.java
index 579731e458e..371182dd533 100644
--- a/naming/src/main/java/com/alibaba/nacos/naming/web/DistroFilter.java
+++ b/naming/src/main/java/com/alibaba/nacos/naming/web/DistroFilter.java
@@ -19,6 +19,7 @@
import com.alibaba.nacos.api.common.Constants;
import com.alibaba.nacos.api.naming.CommonParams;
import com.alibaba.nacos.common.constant.HttpHeaderConsts;
+import com.alibaba.nacos.common.model.RestResult;
import com.alibaba.nacos.common.utils.ExceptionUtil;
import com.alibaba.nacos.common.utils.IoUtils;
import com.alibaba.nacos.core.code.ControllerMethodsCache;
@@ -139,11 +140,12 @@ public void doFilter(ServletRequest servletRequest, ServletResponse servletRespo
final String body = IoUtils.toString(req.getInputStream(), Charsets.UTF_8.name());
final Map paramsValue = HttpClient.translateParameterMap(req.getParameterMap());
- HttpClient.HttpResult result = HttpClient
+ RestResult result = HttpClient
.request("http://" + targetServer + req.getRequestURI(), headerList, paramsValue, body,
PROXY_CONNECT_TIMEOUT, PROXY_READ_TIMEOUT, Charsets.UTF_8.name(), req.getMethod());
+ String data = result.ok() ? result.getData() : result.getMessage();
try {
- WebUtils.response(resp, result.content, result.code);
+ WebUtils.response(resp, data, result.getCode());
} catch (Exception ignore) {
Loggers.SRV_LOG.warn("[DISTRO-FILTER] request failed: " + distroMapper.mapSrv(groupedServiceName)
+ urlString);