Nacos启动:[NACOS HTTP-POST] The maximum number of tolerable server reconnection errors has been reached

发布时间 2023-12-20 09:29:26作者: 梅丹隆

一、表象

image.png

二、分析

源码:

public HttpRestResult<String> httpPost(String path, Map<String, String> headers, Map<String, String> paramValues,
            String encode, long readTimeoutMs) throws Exception {
    final long endTime = System.currentTimeMillis() + readTimeoutMs;
    injectSecurityInfo(paramValues);
    String currentServerAddr = serverListMgr.getCurrentServerAddr();
    int maxRetry = this.maxRetry;
    HttpClientConfig httpConfig = HttpClientConfig.builder()
        .setReadTimeOutMillis(Long.valueOf(readTimeoutMs).intValue())
        .setConTimeOutMillis(ConfigHttpClientManager.getInstance().getConnectTimeoutOrDefault(3000)).build();
    do {

        try {
            Header newHeaders = getSpasHeaders(paramValues, encode);
            if (headers != null) {
                newHeaders.addAll(headers);
            }
            HttpRestResult<String> result = NACOS_RESTTEMPLATE
                .postForm(getUrl(currentServerAddr, path), httpConfig, newHeaders, paramValues, String.class);

            // 错误码 HTTP_INTERNAL_ERROR = 500 || HTTP_BAD_GATEWAY = 502 || HTTP_UNAVAILABLE = 503 为异常
            if (isFail(result)) {
                LOGGER.error("[NACOS ConnectException] currentServerAddr: {}, httpCode: {}", currentServerAddr,
                             result.getCode());
            } else {
                // Update the currently available server addr
                serverListMgr.updateCurrentServerAddr(currentServerAddr);
                // 应从这里返回,否则会进入重试
                return result;
            }
        } catch (ConnectException connectException) {
            LOGGER.error("[NACOS ConnectException httpPost] currentServerAddr: {}, err : {}", currentServerAddr,
                         connectException.getMessage());
        } catch (SocketTimeoutException socketTimeoutException) {
            LOGGER.error("[NACOS SocketTimeoutException httpPost] currentServerAddr: {}, err : {}",
                         currentServerAddr, socketTimeoutException.getMessage());
        } catch (Exception ex) {
            LOGGER.error("[NACOS Exception httpPost] currentServerAddr: " + currentServerAddr, ex);
            throw ex;
        }

        // 重试逻辑
        if (serverListMgr.getIterator().hasNext()) {
            currentServerAddr = serverListMgr.getIterator().next();
        } else {
            // maxRetry = 3
            maxRetry--;
            if (maxRetry < 0) {
                throw new ConnectException(
                    "[NACOS HTTP-POST] The maximum number of tolerable server reconnection errors has been reached");
            }
            serverListMgr.refreshCurrentServerAddr();
        }

    } while (System.currentTimeMillis() <= endTime);

    LOGGER.error("no available server, currentServerAddr : {}", currentServerAddr);
    throw new ConnectException("no available server, currentServerAddr : " + currentServerAddr);
}

image.png

三、解决

将配置文件application.yml更改为bootstrap.yml