在 DistroFilter.java 中,有如下代码:
RestResult<String> result = HttpClient
.request(HTTP_PREFIX + targetServer + req.getRequestURI(), headerList, paramsValue, body,
PROXY_CONNECT_TIMEOUT, PROXY_READ_TIMEOUT, StandardCharsets.UTF_8.name(), req.getMethod());
String data = result.ok() ? result.getData() : result.getMessage();
try {
WebUtils.response(resp, data, result.getCode());
} catch (Exception ignore) {
Loggers.SRV_LOG.warn("[DISTRO-FILTER] request failed: " + distroMapper.mapSrv(distroTag) + urlString);
}
建议在 WebUtils.response 前添加一行:
resp.setHeader("Connection", "close");
如果没有这行,即使心跳发给了非责任节点,依旧会 keepalive,加了后,不再 keepalive,2.x 是通过 ip:port 来确定责任节点,这意味着 client 的责任节点是固定的,而不像 1.x 是不固定的。若发给非责任节点,则不 keepalive,默认 keepalive,那么,client 在几次心跳后,就会和其责任节点 keepalive,从而大幅减少 nacos 内部的心跳转发。(这里假设前置了 slb,在不 keepalive 的情况下,心跳是平均的发给 nacos 各个节点)