热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

golang的http请求池

看到平台银行对接方案写的demo确实还不错记个笔记互相学习学习packageapiimport(cryptotlsnetnethttpstringssynct






看到平台银行对接方案
写的 demo 确实还不错
记个笔记 互相学习学习

package api
import (
"crypto/tls"
"net"
"net/http"
"strings"
"sync"
"time"
)
// http连接池相关参数
const (
defaultPoolSize = 50
defaultRequestTimeout = 30 * time.Second
defaultTLSShakeTimeout = 5 * time.Second
defaultConnectTimeout = 5 * time.Second
defaultKeepAliveTimeout = 15 * time.Second
)
var oneManager sync.Once
var connectManager *connectionManager
type connectionManager struct {
clientPool map[string]*http.Client
mapLock sync.RWMutex
}
func NewConnectionManager() *connectionManager {
oneManager.Do(func() {
if connectManager == nil {
connectManager = &connectionManager{clientPool: make(map[string]*http.Client)}
}
})
return connectManager
}
func (c *connectionManager) GetHttpClient(url string) *http.Client {
c.mapLock.RLock()
if _, ok := c.clientPool[url]; ok {
client := c.clientPool[url]
c.mapLock.RUnlock()
return client
}
c.mapLock.RUnlock()
innerContext := net.Dialer{
// 建链超时时间
Timeout: defaultConnectTimeout,
// 链接生命周期
KeepAlive: defaultKeepAliveTimeout}
transport := &http.Transport{
MaxIdleConnsPerHost: defaultPoolSize,
MaxConnsPerHost: defaultPoolSize,
DialContext: innerContext.DialContext}
if isHttps(url) {
transport.TLSClientConfig = &tls.Config{InsecureSkipVerify: true}
transport.TLSHandshakeTimeout = defaultTLSShakeTimeout
}
tempClient := &http.Client{
// 总超时时间=建链+重定向+读取响应
Timeout: defaultRequestTimeout,
Transport: transport,
}
c.mapLock.Lock()
c.clientPool[url] = tempClient
c.mapLock.Unlock()
return tempClient
}
func isHttps(url string) bool {
urlArray := strings.Split(url, ":")
if urlArray[0] == "https" {
return true
}
return false
}



推荐阅读
  • POJ 3472 空心方格铺砖问题(高精度计算)
    题目描述:给定一个(n+1)×(n+1)的方格,其中包含一个(n-1)×(n-1)的空洞。使用1×2的砖块进行铺设,求解不同的铺设方案总数。 ... [详细]
  • 本文介绍了在一卡通项目中设计加密管理方案时,证书服务器的配置步骤及其在用户权限控制中的应用。首先概述了证书服务器的基本设置,包括操作系统的选择和证书服务的安装,随后详细描述了服务器证书及客户端证书的创建过程。 ... [详细]
  • 本文深入探讨了@RequestBody注解的使用场景及核心逻辑,包括其与@RequestParam的区别和结合使用的方法。文章前半部分介绍了基础知识,后半部分则详细分析了源码和重要结论。 ... [详细]
  • 本文详细介绍了C++中常见的容器(如列表、向量、双端队列等)及其迭代器的实现方式,通过具体代码示例展示了如何使用这些容器和迭代器。 ... [详细]
  • 本文探讨了在执行SQL查询时遇到的因字符集不同而导致查询结果差异的问题,特别是涉及中文字符时。文章分析了在不同字符集设置下,SQL查询结果的变化,并提供了详细的解决方案。 ... [详细]
  • 探讨在数据库中存储URL时,删除尾部斜杠的安全性和潜在影响,以及如何确保URL的一致性。 ... [详细]
  • 本文探讨了如何在JavaScript中调用PHP函数及实现两者之间的有效交互,包括通过AJAX请求、动态生成JavaScript代码等方法。 ... [详细]
  • 本文详细介绍了在Hive中创建表的基本语法,包括临时表、外部表的创建方法,以及如何设置表的各种属性和约束条件。 ... [详细]
  • 本文探讨了使用匈牙利算法解决二分图中的最大权匹配问题,并通过HDU1533题目实例进行详细解析。代码实现中包括了必要的数据结构定义、输入处理以及求解过程。 ... [详细]
  • 解决fetch上传图片至微信公众号H5页面的问题
    在近期的一个项目需求中,需要在微信公众号内嵌入H5页面,并实现用户通过该页面上传图片的功能,包括拍摄新照片或从已有相册中选择。前端开发中采用了fetch API进行接口调用,但遇到了上传图片时数据无法正确传递的问题。 ... [详细]
  • 本文介绍了三款实用的Chrome插件:Gooreplacer用于加速访问依赖特定外部接口的网站;HTTP Request Blocker帮助过滤无法加载的图片请求;Browse Manager则能有效阻止恼人的弹出广告。通过合理配置这些工具,可以显著提升上网体验。 ... [详细]
  • 本文探讨了使用Lighttpd与FastCGI实现分布式部署的方法。通过在中心服务器上配置Lighttpd负责请求转发,同时在多个远程服务器上运行FastCGI进程来处理实际业务逻辑,从而提高系统的负载能力和响应速度。 ... [详细]
  • 应用程序配置详解
    本文介绍了配置文件的关键特性及其在不同场景下的应用,重点探讨了Machine.Config和Web.Config两种主要配置文件的用途和配置方法。文章还详细解释了如何利用XML格式的配置文件来调整应用程序的行为,包括自定义配置、错误处理、身份验证和授权设置。 ... [详细]
  • 本文探讨了为何采用RESTful架构及其优势,特别是在现代Web应用开发中的重要性。通过前后端分离和统一接口设计,RESTful API能够提高开发效率,支持多种客户端,并简化维护。 ... [详细]
  • 本文介绍了一个使用Keras框架构建的卷积神经网络(CNN)实例,主要利用了Keras提供的MNIST数据集以及相关的层,如Dense、Dropout、Activation等,构建了一个具有两层卷积和两层全连接层的CNN模型。 ... [详细]
author-avatar
hhxsv5
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有