前往小程序,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 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
非常适合个人搭建博客—WordPress开源免费主题汇总
WordPress最重要的就是找一个适合自己的主题了。好一点的WordPress主题基本上都是要收费的,而且价格还不便宜,这导致了不少的新手朋友们很为难。而有时我们仅仅根据个人的爱好来搭建一个博客,所以也没有必要去支付高额的费用来购买Wordpress主题。
聚优云惠
2022/05/22
25.7K1
Docker搭建WordPress博客
  WordPress是使用PHP语言开发的博客平台,用户可以在支持PHP和MySQL数据库的服务器上架设属于自己的网站。也可以把WordPress当作一个内容管理系统(CMS)来使用。一般的安装方法是,准备一个服务器,在服务器上分别安装配置PHP、MySQL、Apache/NGINX,然后下载WordPress安装包,再进行编译安装。而采用Docker方式部署可以简化配置环境。
LuckySec
2022/11/02
6310
个人博客平台选择 Typecho 还是 WordPress ?
明月一直都是 WordPress 的粉丝,可以说七八年的博客生涯都是 WordPress 博客上度过,所以说对 WordPress 的好、坏理解和认识应该说更加深刻些, Typecho 应该是2017年才开始关注和使用,之前仅仅是听说过而已,在使用 Typecho 接近一年的情况下,对个人博客平台应该选择 Typecho 还是 WordPress 也算是有了自己一点见解吧,今天就抽个时间聊聊这个话题(文章篇幅偏长,不喜误入)。
明月登楼的博客
2019/05/15
3.1K1
个人博客平台选择 Typecho 还是 WordPress ?
使用wordPress搭建个人博客
**服务器**:服务商经常会有一些活动,我是在18年年底租的,当时买的1核2G,3年价格是299元,(建议一次性多买几年,不然后期续费的话还是比较贵的)。现在已经搁置了1年多时间了。
Java旅途
2020/06/25
1.3K0
Wordpress入门建站教程
Wordpress入门建站教程小白都可以看懂的教程 1、程序介绍: WordPress是基于PHP的blog程序。说它是blog,有点委屈它了。因为WordPress完全可以作为一个功能强大的cms。而且具有很高 的安全性和免维护性。其他开发者和爱好者不断为WordPress加入各种主题(theme)和插件(plugin),让您的网站更炫,更易用。 2、安装教程: 1.按照前面一篇文章《怎样建网站?建网站教程?个人建网站必看教程》讲到的,网站发布要经过域名空间购买、申请备案、网站源程序
Youngxj
2018/06/07
5K1
WordPress 告别 MySQL:Docker SQLite WordPress
本篇文章聊聊,如何将这个持续诞生和维护了 21 年的开源软件“脱离数据库”运行,让它能够更加轻量、适合低成本离线运行。
soulteary
2024/04/18
5660
WordPress 告别 MySQL:Docker SQLite WordPress
Docker 安装 Wordpress 博客
今天讲解一下新方式搭建 Wordpress,超级简单。使用 docker-compose 快速安装博客。
不安分的猿人
2020/03/02
8.2K1
如何在CentOS 7上使用OpenLiteSpeed安装WordPress
WordPress是目前世界上最受欢迎的内容管理系统(CMS)。它允许您在数据库后端轻松设置博客和网站,使用PHP执行脚本和处理动态内容。WordPress有一个庞大的在线社区支持,能够快速启动和运行网站。
丰一川
2018/10/10
2K0
Docker快速搭建WordPress博客网站
WordPress是一个非常著名的PHP编写的博客平台,发展到目前为止已经形成了一个庞大的网站平台系统。在WP上有规模庞大的插件和主题,可以帮助我们快速建立一个博客甚至网站。
sunsky
2020/08/20
10.7K0
怎么快速搭建一个英文博客!
博客是网站的一的一种类型,搭建一个英文博客和搭建网站的原理是一样的,只不过是在WordPress主题选择上有所不同。今天这个教程教大家怎么快速的去搭建一个英文博客。适合小白操作。
Hoan外贸建站
2020/12/04
3.6K0
如何在国外主机商上部署WordPress博客?
如果你想要拥有一个在国外主机商上的WordPress博客,你需要了解如何进行部署。在本文中,我们将讨论如何在国外主机商上部署WordPress博客,以及如何优化你的博客以提高SEO排名。我们还将介绍如何处理常见的WordPress问题。
一枕寒凉
2023/04/25
1.9K0
Pagekit轻博客CMS程序安装及功能体验过程
如今我们无论是学习架设个人博客、网站,还是架设中大型的内容系统,基本上很少有完整的重新架构独有的程序。我们大部分用户要么直接使用免费开源CMS程序,然后顶多寻找点免费主题模板简单的修改就直接使用。稍微有点讲究的网友可能还会根据实际的需要进行定制主题或者稍微进行二次开发。
老蒋
2021/12/27
1.3K0
Pagekit轻博客CMS程序安装及功能体验过程
WordPress 各种缓存插件介绍和应用
很多人都会说 WordPress 不够快,这是主要因为没有安装适合的缓存插件,而 WordPress 缓存插件有很多种,很多人有点迷糊,不知道怎么应该安装哪一种。
Denis
2023/04/13
7690
WordPress 各种缓存插件介绍和应用
Docker实战:Docker安装WordPress,快速搭建自己的博客
WordPress是一种基于php编程语言开发的CMS管理系统,WordPress有丰富的插件和模板,用户可以快速搭建一套功能十分强大的内容管理系统,使用WordPress可以做多种类型的网站,比如新闻发布网站、企业门户、个人技术博客等。
小明互联网技术分享社区
2023/10/31
3.2K0
Docker实战:Docker安装WordPress,快速搭建自己的博客
WordPress数据库备份插件WP-DB-Backup使用教程详解
wordpress的优势是开源,支持各种插件主题,最大的缺点就是吃主机性能,所以一些博主选择了zblog建站。人各有志,我还是喜欢Wordpress,毕竟wordpress是世界上最受欢迎的博客程序。
JunyouYH
2019/12/17
1.5K0
WordPress 性能优化:为什么我的博客比你的快
经常看我爱水煮鱼博客的同学,有没有发现我的博客非常快,而你的博客比较慢呢?那是因为我的博客经过了优化。
超级小可爱
2023/02/20
9500
如何搭建 WordPress 博客
WordPress是使用PHP语言开发的博客平台,用户可以在支持PHP和MySQL数据库的服务器上架设属于自己的网站。也可以把 WordPress当作一个内容管理系统(CMS)来使用。它是使用PHP语言和MySQL数据库开发的。用户可以在支持 PHP 和 MySQL数据库的服务器上使用自己的博客。WordPress有许多第三方开发的免费模板,安装方式简单易用。所以,对于初学者来说,我强烈建议使用WordPress来搭建网站。因为这是最简单易用的平台,且使用于任何开发者,用户以及自媒体作家。
Mr.Crypto
2018/10/17
7.7K2
如何搭建 WordPress 博客
WordPress你要会用
WordPress你要会用 虽然是PHP开发的,但不能忽律它的简单化 WordPress介绍 WordPress是一种使用PHP语言开发的博客平台,用户可以在支持PHP和MySQL数据库的服务器上架设属于自己的网站。也可以把 WordPress当作一个内容管理系统(CMS)来使用。 WordPress是一款个人博客系统,并逐步演化成一款内容管理系统软件,它是使用PHP语言和MySQL数据库开发的。用户可以在支持 PHP 和 MySQL数据库的服务器上使用自己的博客。 WordPre
Java帮帮
2018/03/19
1.9K0
WordPress面试题
将域名解析到另一台主机涉及修改域名服务器记录(DNS)和邮件服务器记录(MX)。以下是一般步骤:
777nx
2023/11/16
6690
明月的 WordPress 优化思路总结
说起 WordPress 优化来算是一个老生常谈的话题了,最近明月从折腾 CDN 转移到折腾 WordPress 优化加速,只能说是国内 CDN 服务水平真是岑差不齐,适合像明月这样的草根苦逼博客使用的寥寥无几,好不容易碰到了“全速云 CDN ”还因为价格过高暂时只能放弃(等明月成“土豪”的时候我再考虑吧!能成“土豪”吗?不能吗?能吗?)。
明月登楼的博客
2019/05/15
1.6K0
明月的 WordPress 优化思路总结
推荐阅读
相关推荐
非常适合个人搭建博客—WordPress开源免费主题汇总
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档