Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >聊聊nacos的RaftProxy

聊聊nacos的RaftProxy

原创
作者头像
code4it
修改于 2019-10-08 02:47:22
修改于 2019-10-08 02:47:22
52500
代码可运行
举报
文章被收录于专栏:码匠的流水账码匠的流水账
运行总次数:0
代码可运行

本文主要研究一下nacos的RaftProxy

RaftProxy

nacos-1.1.3/naming/src/main/java/com/alibaba/nacos/naming/consistency/persistent/raft/RaftProxy.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Component
public class RaftProxy {public void proxyGET(String server, String api, Map<String, String> params) throws Exception {
        // do proxy
        if (!server.contains(UtilsAndCommons.IP_PORT_SPLITER)) {
            server = server + UtilsAndCommons.IP_PORT_SPLITER + RunningConfig.getServerPort();
        }
        String url = "http://" + server + RunningConfig.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);
        }
    }public void proxy(String server, String api, Map<String, String> params, HttpMethod method) throws Exception {
        // do proxy
        if (!server.contains(UtilsAndCommons.IP_PORT_SPLITER)) {
            server = server + UtilsAndCommons.IP_PORT_SPLITER + RunningConfig.getServerPort();
        }
        String url = "http://" + server + RunningConfig.getContextPath() + api;
        HttpClient.HttpResult result;
        switch (method) {
            case GET:
                result =  HttpClient.httpGet(url, null, params);
                break;
            case POST:
                result = HttpClient.httpPost(url, null, params);
                break;
            case DELETE:
                result =  HttpClient.httpDelete(url, null, params);
                break;
            default:
                throw new RuntimeException("unsupported method:" + method);
        }if (result.code != HttpURLConnection.HTTP_OK) {
            throw new IllegalStateException("leader failed, caused by: " + result.content);
        }
    }public void proxyPostLarge(String server, String api, String content, Map<String, String> headers) throws Exception {
        // do proxy
        if (!server.contains(UtilsAndCommons.IP_PORT_SPLITER)) {
            server = server + UtilsAndCommons.IP_PORT_SPLITER + RunningConfig.getServerPort();
        }
        String url = "http://" + server + RunningConfig.getContextPath() + api;
​
        HttpClient.HttpResult result =  HttpClient.httpPostLarge(url, headers, content);
        if (result.code != HttpURLConnection.HTTP_OK) {
            throw new IllegalStateException("leader failed, caused by: " + result.content);
        }
    }
}
  • RaftProxy提供了proxyGET、proxy、proxyPostLarge三个方法,其中proxy接收了HttpMethod,可以处理GET、POST、DELETE

HttpClient

nacos-1.1.3/naming/src/main/java/com/alibaba/nacos/naming/misc/HttpClient.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class HttpClient {
    private static final int TIME_OUT_MILLIS = 10000;
    private static final int CON_TIME_OUT_MILLIS = 5000;private static AsyncHttpClient asyncHttpClient;private static CloseableHttpClient postClient;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();
    }//......public static HttpResult httpPost(String url, List<String> headers, Map<String, String> paramValues) {
        return httpPost(url, headers, paramValues, "UTF-8");
    }public static HttpResult httpPost(String url, List<String> headers, Map<String, String> 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<NameValuePair> nvps = new ArrayList<NameValuePair>();for (Map.Entry<String, String> entry : paramValues.entrySet()) {
                nvps.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));
            }
​
            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.<String, String>emptyMap());
        } catch (Throwable e) {
            return new HttpResult(500, e.toString(), Collections.<String, String>emptyMap());
        }
    }public static HttpResult httpPostLarge(String url, Map<String, String> headers, String content) {
        try {
            HttpClientBuilder builder = HttpClients.custom();
            builder.setUserAgent(UtilsAndCommons.SERVER_VERSION);
            builder.setConnectionTimeToLive(500, TimeUnit.MILLISECONDS);
​
            CloseableHttpClient httpClient = builder.build();
            HttpPost httpost = new HttpPost(url);for (Map.Entry<String, String> 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.<String, String>emptyMap());
        } catch (Exception e) {
            return new HttpResult(500, e.toString(), Collections.<String, String>emptyMap());
        }
    }//......
}
  • httpPost的connectionRequestTimeout为5秒,connectTimeout为5秒,socketTimeout为5秒;httpPostLarge设置了500毫秒的connectionTimeToLive

小结

RaftProxy提供了proxyGET、proxy、proxyPostLarge三个方法,其中proxy接收了HttpMethod,可以处理GET、POST、DELETE

doc

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
聊聊nacos的DistroFilter
nacos-1.1.3/naming/src/main/java/com/alibaba/nacos/naming/web/CanDistro.java
code4it
2019/09/11
6490
聊聊nacos的DistroFilter
聊聊nacos client的MetricsMonitor
nacos-1.1.3/client/src/main/java/com/alibaba/nacos/client/monitor/MetricsMonitor.java
code4it
2019/09/03
6690
聊聊nacos client的MetricsMonitor
聊聊nacos的ServiceReporter
nacos-1.1.3/naming/src/main/java/com/alibaba/nacos/naming/core/ServiceManager.java
code4it
2019/09/16
6350
聊聊nacos的ServiceReporter
Nacos源码分析系列之Naming模块-集群篇-初级版
那么 GlobalExecutor.registerServerListUpdater和GlobalExecutor.registerServerStatusReporter又做了哪些事情,GlobalExecutor是一个全局的线程池,管理所有的线程任务。其中executorService和SERVER_STATUS_EXECUTOR都是ScheduledThreadPoolExecutor,只是为了做隔离。
35岁程序员那些事
2020/05/27
1.7K0
聊聊nacos的ServerListManager
nacos-1.1.3/naming/src/main/java/com/alibaba/nacos/naming/cluster/ServerListManager.java
code4it
2019/09/30
9880
聊聊nacos的ServerListManager
聊聊nacos的HealthCheckCommon
nacos-1.1.3/naming/src/main/java/com/alibaba/nacos/naming/healthcheck/HealthCheckCommon.java
code4it
2019/09/22
5750
聊聊nacos的HealthCheckCommon
聊聊nacos client的ServerHttpAgent
nacos-1.1.3/client/src/main/java/com/alibaba/nacos/client/config/http/HttpAgent.java
code4it
2019/10/16
1.6K0
聊聊nacos client的ServerHttpAgent
Java发送Http请求(HttpClient)
HttpClient 是Apache HttpComponents 下的子项目,用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。HTTP 协议可能是现在 Internet 上使用得最多、最重要的协议了,越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源。虽然在 JDK 的 java net包中已经提供了访问 HTTP 协议的基本功能,但是对于大部分应用程序来说,JDK 库本身提供的功能还不够丰富和灵活。HttpClient 是Apache HttpComponents 下的子项目,用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。
ha_lydms
2023/08/09
1.1K0
日常开发必备神器 HttpUtil 分享(超详细)
最近在工作中需要在后台调用各种上传、下载、以及第三方服务接口,经过研究决定使用 HttpClient,自己封装了一个 HttpClient 工具类,简单轻松的实现get、post、put、delete 以及上传、下载请求,在此分享给大家。
Java极客技术
2022/12/04
3.2K1
Java微信支付快速入门&工具类
快速入门 1、微信支付官方在线API入口: https://pay.weixin.qq.com/wiki/doc/api/index.html 2、微信支付能力介绍: http://action.we
斯武丶风晴
2018/03/01
2.6K0
JavaUtil_06_HttpUtil_使用httpclient实现
一、简介 使用 appache 的 httpclient 来实现的 二、源码 package com.ray.weixin.gz.util; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import org.apache.http.Consts; import org.apache.http.Header; import org.
shirayner
2018/08/10
9370
HttpClient使用不当,服务挂了,是时候系统学习一下了
事件一:联调微信支付接口,用到HttpClient,花时间整理了一番。如果有一篇文章,读一读就可以掌握HttpClient 80%的内容,再有可以直接用的Demo,下次再遇到是不是就可以非常容易集成了?这篇便是这篇文章的目标之一。
程序新视界
2021/12/20
1.8K0
Http接口Post方式传送File文件示例
对接的接口是MutipartFile的上传接口,后台用Http方式去调用,所以可以使用HttpClient或者用Spring框架封装的RestTemplate去后台http请求
SmileNicky
2022/05/07
3.1K0
Http接口Post方式传送File文件示例
如果你想在Java中写一个Http客户端,你会选择哪一种方式?Okhttp vs Apache vs Jdk
目前JAVA实现HTTP请求的方法用的最多的有两种:一种是通过HTTPClient这种第三方的开源框架去实现。HTTPClient对HTTP的封装性比较不错,通过它基本上能够满足我们大部分的需求。
程序员黄小斜
2021/12/14
2K0
项目管理Maven系列(四)- 结合Selenium、Appium、OkHttp、HttpClient
5、执行脚本(pom.xml鼠标右键Run As--->Maven test即可)。
wangmcn
2022/07/25
2.6K0
项目管理Maven系列(四)- 结合Selenium、Appium、OkHttp、HttpClient
聊聊nacos ServiceManager的registerInstance
本文主要研究一下nacos ServiceManager的registerInstance
code4it
2019/09/12
9130
聊聊nacos ServiceManager的registerInstance
HttpClient-Json格式、设置超时
Json格式、设置超时 目录 1、Json格式 2、设置超时 1、Json格式 1、创建Json类。 发送数据将数据类型转为Json格式。 接收数据将数据类型转为Json格式。 脚本代码: package com.test.demo; import java.io.IOException; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.methods.CloseableHtt
wangmcn
2022/07/25
6540
HttpClient-Json格式、设置超时
尚医通-微信登录
用户将自己的"云存储"服务的用户名和密码,告诉"云冲印",后者就可以读取用户的照片了。这样的做法有以下几个严重的缺点。
用户9615083
2022/12/30
1.8K0
尚医通-微信登录
微信扫码登录实现
第三方微信登录功能 一、准备工作 二、微信登录后端开发 2.1 添加配置 2.2 创建常量类,创建ConstantPropertiesUtil.java常量类 2.3 创建controller 2.4 测试 三、获取微信扫描人的信息 3.1 测试回调是否可用 3.2 添加依赖 3.3 添加httpclient工具类 3.4 创建回调controller方法 3.5 前端显示扫描人信息 3.6 登录之后的前端显示效果 一、准备工作 https://open.weixin.qq.com 1、注册 2、
别团等shy哥发育
2023/02/25
3.3K0
微信扫码登录实现
从零玩转第三方登录之QQ登录
在真正开始对接之前,我们先来聊一聊后台的方案设计。既然是对接第三方登录,那就免不了如何将用户信息保存。首先需要明确一点的是,用户在第三方登录成功之后,
杨不易呀
2022/01/18
2.1K0
从零玩转第三方登录之QQ登录
相关推荐
聊聊nacos的DistroFilter
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验