http超时设置 golang

golang提供的http get、post请求是没有设置超时的,但实现生产环境一般都需要设置超时时间。

网上搜索,可以查询到通过设置http.Client中Transport的Dail函数,在自定义的Dail函数里面设置建立连接超时时长和发送接收数据超时:

c := http.Client{

Transport: &http.Transport{

Dial: func(netw, addr string) (net.Conn, error) {

c, err := net.DialTimeout(netw, addr, time.Second*3) //设置建立连接超时

if err != nil {

return nil, err

}

c.SetDeadline(time.Now().Add(5 * time.Second)) //设置发送接收数据超时

return c, nil

},

},

}

因为上面的代码中调用SetDeadline设置了绝对过期时间,这会导致在该连接上发生的第二次及后来的请求的超时与预期的不一致。第一次请求的发送接收数据超时是5s,但第二次请求的发送接收数据超时是5s减去第一次请求发送接收数据耗时(忽略其他轻微耗时),后面的请求以此类推。所以,这种方法只适用于所有的请求都有各自的http.Client,也就是说每次请求都需要创建各自的http.Client,建立各自的连接。

但golang官方文档里面有说“Clients should be reused instead of created as needed. Clients are safe for concurrent use by multiple goroutines.”(详见http包中Client的定义说明)。重复利用http.Client,可以考虑如下方法:

var c *http.Client = &http.Client{ Transport: &http.Transport{ Dial: func(netw, addr string) (net.Conn, error) { c, err := net.DialTimeout(netw, addr, time.Second*3) if err != nil { fmt.Println("dail timeout", err) return nil, err } return c, nil }, MaxIdleConnsPerHost: 10, ResponseHeaderTimeout: time.Second * 2, }, }

这里添加了ResponseHeaderTimeout配置,默认是0,无限等待。该设置不包括发送数据超时和接收返回包正文体超时,只能大致的实现发送接收数据超时设置。

原文发布于微信公众号 - Golang语言社区(Golangweb)

原文发表时间:2016-03-11

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏云计算认知升级

【腾讯云的1001种玩法】Laravel 整合 COS 对象存储服务,享受无限容量存储服务

使用Laravel 也可以轻松接入腾讯云对象存储,只需要执行简单的几行命令,就可以轻松在你的Laravel项目中,享受COS提供的海量数据存储能力。

1.6K00
来自专栏IMWeb前端团队

让chrome插件在手机上跑起来

本文作者:IMWeb moonye 原文出处:IMWeb社区 未经同意,禁止转载 创建一个chrome的插件,并让这个插件能够作为一个app,运行在终...

22250
来自专栏云计算教程系列

如何在CentOS 7上使用InfluxDB分析系统指标

InfluxDB是一个时间序列,指标和分析数据库。时间序列数据库旨在解决存储在一段时间内进行的连续测量所产生的数据的问题。此数据可能包含系统指标(如CPU和内存...

19210
来自专栏云计算教程系列

如何使用Prometheus监视您的Ubuntu 14.04服务器

Prometheus是由SoundCloud开发的开源监控系统。与其他监控系统(如InfluxDB和Graphite)一样,Prometheus将其所有数据存储...

22200
来自专栏小程序之家

如何在小程序中实现文件上传下载

在如何实现小程序登录鉴权这篇文章中,我们实现了小程序的wx.request请求操作,除了request之外,小程序还有文件下载wx.downloadFile和文...

14.1K70
来自专栏技术博文

SSDB 配置文件

SSDB 的配置非常简单, 附带的 ssdb.conf 你不用修改便可以使用. 如果你要高度定制, 还是需要修改一些配置的. 下面做介绍. SSDB 的配置文件...

27750
来自专栏飞雪无情的博客

第一个Android应用,HelloWorld

这节主要内容是使用ADT创建一个Helloword实例,并进行概要分析,中间会有AVD的创建。

9230
来自专栏抠抠空间

Django项目实战之用户头像上传与访问

1 将文件保存到服务器本地 upload.html <!DOCTYPE html> <html lang="en"> <head> <meta char...

53970
来自专栏逸鹏说道

Javascript缓存投毒学习与实战

0x00 起因 不久前@三好学生师傅买了一个wooyun wifi,然后聊到了缓存投毒: ? 然后看到wooyun wifi的这个说明: 默认情况下该功能附带缓...

46850
来自专栏青玉伏案

Swift3.0服务端开发(三) Mustache页面模板与日志记录

本篇博客主要介绍如果在Perfect工程中引入和使用Mustache页面模板与日志记录系统。Mustache页面模板类似于PHP中的smarty模板引擎或者Ja...

26560

扫码关注云+社区

领取腾讯云代金券