@@ -15,15 +15,15 @@ | |||
*/ | |||
package com.alibaba.csp.sentinel.transport.config; | |||
import java.util.ArrayList; | |||
import java.util.List; | |||
import com.alibaba.csp.sentinel.config.SentinelConfig; | |||
import com.alibaba.csp.sentinel.log.RecordLog; | |||
import com.alibaba.csp.sentinel.util.HostNameUtil; | |||
import com.alibaba.csp.sentinel.util.StringUtil; | |||
import com.alibaba.csp.sentinel.util.function.Tuple2; | |||
import java.util.ArrayList; | |||
import java.util.List; | |||
/** | |||
* @author leyou | |||
*/ | |||
@@ -15,20 +15,17 @@ | |||
*/ | |||
package com.alibaba.csp.sentinel.transport.heartbeat; | |||
import java.util.List; | |||
import com.alibaba.csp.sentinel.Constants; | |||
import com.alibaba.csp.sentinel.config.SentinelConfig; | |||
import com.alibaba.csp.sentinel.log.RecordLog; | |||
import com.alibaba.csp.sentinel.spi.SpiOrder; | |||
import com.alibaba.csp.sentinel.transport.HeartbeatSender; | |||
import com.alibaba.csp.sentinel.transport.config.TransportConfig; | |||
import com.alibaba.csp.sentinel.log.RecordLog; | |||
import com.alibaba.csp.sentinel.util.AppNameUtil; | |||
import com.alibaba.csp.sentinel.util.HostNameUtil; | |||
import com.alibaba.csp.sentinel.transport.HeartbeatSender; | |||
import com.alibaba.csp.sentinel.util.PidUtil; | |||
import com.alibaba.csp.sentinel.util.StringUtil; | |||
import com.alibaba.csp.sentinel.util.function.Tuple2; | |||
import org.apache.http.client.config.RequestConfig; | |||
import org.apache.http.client.methods.CloseableHttpResponse; | |||
import org.apache.http.client.methods.HttpGet; | |||
@@ -36,6 +33,8 @@ import org.apache.http.client.utils.URIBuilder; | |||
import org.apache.http.impl.client.CloseableHttpClient; | |||
import org.apache.http.impl.client.HttpClients; | |||
import java.util.List; | |||
/** | |||
* @author Eric Zhao | |||
* @author leyou | |||
@@ -45,6 +44,9 @@ public class HttpHeartbeatSender implements HeartbeatSender { | |||
private final CloseableHttpClient client; | |||
private static final int OK_STATUS = 200; | |||
private final int timeoutMs = 3000; | |||
private final RequestConfig requestConfig = RequestConfig.custom() | |||
.setConnectionRequestTimeout(timeoutMs) | |||
@@ -89,11 +91,43 @@ public class HttpHeartbeatSender implements HeartbeatSender { | |||
// Send heartbeat request. | |||
CloseableHttpResponse response = client.execute(request); | |||
response.close(); | |||
return true; | |||
int statusCode = response.getStatusLine().getStatusCode(); | |||
if (statusCode == OK_STATUS) { | |||
return true; | |||
} else if (clientErrorCode(statusCode) || serverErrorCode(statusCode)) { | |||
RecordLog.warn("[HttpHeartbeatSender] Failed to send heartbeat to " | |||
+ consoleHost + ":" + consolePort + ", http status code: {0}", statusCode); | |||
} | |||
return false; | |||
} | |||
@Override | |||
public long intervalMs() { | |||
return 5000; | |||
} | |||
/** | |||
* 4XX Client Error | |||
* | |||
* @param code | |||
* @return | |||
*/ | |||
private boolean clientErrorCode(int code) { | |||
return code > 399 && code < 500; | |||
} | |||
/** | |||
* 5XX Server Error | |||
* | |||
* @param code | |||
* @return | |||
*/ | |||
private boolean serverErrorCode(int code) { | |||
return code > 499 && code < 600; | |||
} | |||
} |
@@ -15,19 +15,17 @@ | |||
*/ | |||
package com.alibaba.csp.sentinel.transport.heartbeat; | |||
import java.net.InetSocketAddress; | |||
import java.util.ArrayList; | |||
import java.util.List; | |||
import com.alibaba.csp.sentinel.log.RecordLog; | |||
import com.alibaba.csp.sentinel.transport.HeartbeatSender; | |||
import com.alibaba.csp.sentinel.transport.config.TransportConfig; | |||
import com.alibaba.csp.sentinel.transport.heartbeat.client.SimpleHttpClient; | |||
import com.alibaba.csp.sentinel.transport.heartbeat.client.SimpleHttpRequest; | |||
import com.alibaba.csp.sentinel.transport.heartbeat.client.SimpleHttpResponse; | |||
import com.alibaba.csp.sentinel.util.StringUtil; | |||
import com.alibaba.csp.sentinel.util.function.Tuple2; | |||
import java.net.InetSocketAddress; | |||
import java.util.List; | |||
/** | |||
* The heartbeat sender provides basic API for sending heartbeat request to provided target. | |||
* This implementation is based on a trivial HTTP client. | |||
@@ -73,6 +71,8 @@ public class SimpleHttpHeartbeatSender implements HeartbeatSender { | |||
SimpleHttpResponse response = httpClient.post(request); | |||
if (response.getStatusCode() == OK_STATUS) { | |||
return true; | |||
} else if (clientErrorCode(response.getStatusCode()) || serverErrorCode(response.getStatusCode())) { | |||
RecordLog.warn("[SimpleHttpHeartbeatSender] Failed to send heartbeat to " + addr + ", http status code: {0}", response.getStatusCode()); | |||
} | |||
} catch (Exception e) { | |||
RecordLog.warn("[SimpleHttpHeartbeatSender] Failed to send heartbeat to " + addr, e); | |||
@@ -96,4 +96,24 @@ public class SimpleHttpHeartbeatSender implements HeartbeatSender { | |||
return addressList.get(index); | |||
} | |||
/** | |||
* 4XX Client Error | |||
* | |||
* @param code | |||
* @return | |||
*/ | |||
private boolean clientErrorCode(int code) { | |||
return code > 399 && code < 500; | |||
} | |||
/** | |||
* 5XX Server Error | |||
* | |||
* @param code | |||
* @return | |||
*/ | |||
private boolean serverErrorCode(int code) { | |||
return code > 499 && code < 600; | |||
} | |||
} |
@@ -15,11 +15,11 @@ | |||
*/ | |||
package com.alibaba.csp.sentinel.transport.heartbeat.client; | |||
import com.alibaba.csp.sentinel.config.SentinelConfig; | |||
import java.nio.charset.Charset; | |||
import java.util.Map; | |||
import com.alibaba.csp.sentinel.config.SentinelConfig; | |||
/** | |||
* Simple HTTP response representation. | |||
* | |||
@@ -112,10 +112,12 @@ public class SimpleHttpResponse { | |||
public String toString() { | |||
StringBuilder buf = new StringBuilder(); | |||
buf.append(statusLine) | |||
.append("\r\n"); | |||
for (Map.Entry<String, String> entry : headers.entrySet()) { | |||
buf.append(entry.getKey()).append(": ").append(entry.getValue()) | |||
.append("\r\n"); | |||
if (headers != null) { | |||
for (Map.Entry<String, String> entry : headers.entrySet()) { | |||
buf.append(entry.getKey()).append(": ").append(entry.getValue()) | |||
.append("\r\n"); | |||
} | |||
} | |||
buf.append("\r\n"); | |||
buf.append(getBodyAsString()); | |||