温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

nacos client中ServerHttpAgent的原理和使用方法

发布时间:2021-06-28 16:52:27 来源:亿速云 阅读:864 作者:chen 栏目:大数据

这篇文章主要介绍“nacos client中ServerHttpAgent的原理和使用方法”,在日常操作中,相信很多人在nacos client中ServerHttpAgent的原理和使用方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”nacos client中ServerHttpAgent的原理和使用方法”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

本文主要研究一下nacos client的ServerHttpAgent

HttpAgent

nacos-1.1.3/client/src/main/java/com/alibaba/nacos/client/config/http/HttpAgent.java

public interface HttpAgent {     /**      * start to get nacos ip list      * @return Nothing.      * @throws NacosException on get ip list error.      */     void start() throws NacosException;     /**      * invoke http get method      * @param path http path      * @param headers http headers      * @param paramValues http paramValues http      * @param encoding http encode      * @param readTimeoutMs http timeout      * @return HttpResult http response      * @throws IOException If an input or output exception occurred      */     HttpResult httpGet(String path, List<String> headers, List<String> paramValues, String encoding, long readTimeoutMs) throws IOException;     /**      * invoke http post method      * @param path http path      * @param headers http headers      * @param paramValues http paramValues http      * @param encoding http encode      * @param readTimeoutMs http timeout      * @return HttpResult http response      * @throws IOException If an input or output exception occurred      */     HttpResult httpPost(String path, List<String> headers, List<String> paramValues, String encoding, long readTimeoutMs) throws IOException;     /**      * invoke http delete method      * @param path http path      * @param headers http headers      * @param paramValues http paramValues http      * @param encoding http encode      * @param readTimeoutMs http timeout      * @return HttpResult http response      * @throws IOException If an input or output exception occurred      */     HttpResult httpDelete(String path, List<String> headers, List<String> paramValues, String encoding, long readTimeoutMs) throws IOException;     /**      * get name      * @return String      */     String getName();     /**      * get namespace      * @return String      */     String getNamespace();     /**      * get tenant      * @return String      */     String getTenant();     /**      * get encode      * @return String      */     String getEncode(); }
  • HttpAgent定义了start、httpGet、httpPost、httpDelete、getName、getNamespace、getTenant、getEncode方法

ServerHttpAgent

nacos-1.1.3/client/src/main/java/com/alibaba/nacos/client/config/http/ServerHttpAgent.java

public class ServerHttpAgent implements HttpAgent {     private static final Logger LOGGER = LogUtils.logger(ServerHttpAgent.class);     /**      * @param path          相对于web应用根,以/开头      * @param headers      * @param paramValues      * @param encoding      * @param readTimeoutMs      * @return      * @throws IOException      */     @Override     public HttpResult httpGet(String path, List<String> headers, List<String> paramValues, String encoding,                               long readTimeoutMs) throws IOException {         final long endTime = System.currentTimeMillis() + readTimeoutMs;         final boolean isSSL = false;         String currentServerAddr = serverListMgr.getCurrentServerAddr();         int maxRetry = this.maxRetry;         do {             try {                 List<String> newHeaders = getSpasHeaders(paramValues);                 if (headers != null) {                     newHeaders.addAll(headers);                 }                 HttpResult result = HttpSimpleClient.httpGet(                     getUrl(currentServerAddr, path), newHeaders, paramValues, encoding,                     readTimeoutMs, isSSL);                 if (result.code == HttpURLConnection.HTTP_INTERNAL_ERROR                     || result.code == HttpURLConnection.HTTP_BAD_GATEWAY                     || result.code == HttpURLConnection.HTTP_UNAVAILABLE) {                     LOGGER.error("[NACOS ConnectException] currentServerAddr: {}, httpCode: {}",                         serverListMgr.getCurrentServerAddr(), result.code);                 } else {                     // Update the currently available server addr                     serverListMgr.updateCurrentServerAddr(currentServerAddr);                     return result;                 }             } catch (ConnectException ce) {                 LOGGER.error("[NACOS ConnectException httpGet] currentServerAddr:{}, err : {}", serverListMgr.getCurrentServerAddr(), ce.getMessage());             } catch (SocketTimeoutException stoe) {                 LOGGER.error("[NACOS SocketTimeoutException httpGet] currentServerAddr:{}, err : {}", serverListMgr.getCurrentServerAddr(), stoe.getMessage());             } catch (IOException ioe) {                 LOGGER.error("[NACOS IOException httpGet] currentServerAddr: " + serverListMgr.getCurrentServerAddr(), ioe);                 throw ioe;             }             if (serverListMgr.getIterator().hasNext()) {                 currentServerAddr = serverListMgr.getIterator().next();             } else {                 maxRetry --;                 if (maxRetry < 0) {                     throw new ConnectException("[NACOS HTTP-GET] The maximum number of tolerable server reconnection errors has been reached");                 }                 serverListMgr.refreshCurrentServerAddr();             }         } while (System.currentTimeMillis() <= endTime);         LOGGER.error("no available server");         throw new ConnectException("no available server");     }     @Override     public HttpResult httpPost(String path, List<String> headers, List<String> paramValues, String encoding,                                long readTimeoutMs) throws IOException {         final long endTime = System.currentTimeMillis() + readTimeoutMs;         boolean isSSL = false;         String currentServerAddr = serverListMgr.getCurrentServerAddr();         int maxRetry = this.maxRetry;         do {             try {                 List<String> newHeaders = getSpasHeaders(paramValues);                 if (headers != null) {                     newHeaders.addAll(headers);                 }                 HttpResult result = HttpSimpleClient.httpPost(                     getUrl(currentServerAddr, path), newHeaders, paramValues, encoding,                     readTimeoutMs, isSSL);                 if (result.code == HttpURLConnection.HTTP_INTERNAL_ERROR                     || result.code == HttpURLConnection.HTTP_BAD_GATEWAY                     || result.code == HttpURLConnection.HTTP_UNAVAILABLE) {                     LOGGER.error("[NACOS ConnectException] currentServerAddr: {}, httpCode: {}",                         currentServerAddr, result.code);                 } else {                     // Update the currently available server addr                     serverListMgr.updateCurrentServerAddr(currentServerAddr);                     return result;                 }             } catch (ConnectException ce) {                 LOGGER.error("[NACOS ConnectException httpPost] currentServerAddr: {}, err : {}", currentServerAddr, ce.getMessage());             } catch (SocketTimeoutException stoe) {                 LOGGER.error("[NACOS SocketTimeoutException httpPost] currentServerAddr: {}, err : {}", currentServerAddr, stoe.getMessage());             } catch (IOException ioe) {                 LOGGER.error("[NACOS IOException httpPost] currentServerAddr: " + currentServerAddr, ioe);                 throw ioe;             }             if (serverListMgr.getIterator().hasNext()) {                 currentServerAddr = serverListMgr.getIterator().next();             } else {                 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);     }     //...... }
  • ServerHttpAgent实现了HttpAgent接口,其httpGet、httpPost、httpDelete方法的结构大体相同,都是以do while做循环,循环条件为距离开始执行时间不超过readTimeoutMs

  • 循环开始之前会通过serverListMgr.getCurrentServerAddr()方法获取currentServerAddr,循环体内则通过HttpSimpleClient的相应方法执行请求,如果返回的HTTP Code为HTTP_INTERNAL_ERROR、HTTP_BAD_GATEWAY、HTTP_UNAVAILABLE则打印error日志,否则执行serverListMgr.updateCurrentServerAddr(currentServerAddr),然后返回

  • 如果出现异常或者没有提前返回,则判断serverListMgr.getIterator().hasNext(),如果为true则使用serverListMgr.getIterator().next()更新currentServerAddr,为false则递减maxRetry,然后执行serverListMgr.refreshCurrentServerAddr()

小结

ServerHttpAgent实现了HttpAgent接口,其httpGet、httpPost、httpDelete方法的结构大体相同,都是以do while做循环,循环条件为距离开始执行时间不超过readTimeoutMs

到此,关于“nacos client中ServerHttpAgent的原理和使用方法”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI