1、go设置超时时间

(1)SetDeadline

首先,你需要了解Go实现超时的网络原语(primitive): Deadline (最后期限)。

net.Conn为Deadline提供了多个方法Set[Read|Write]Deadline(time.Time)。
Deadline是一个绝对时间值,当到达这个时间的时候,所有的 I/O 操作都会失败,返回超时(timeout)错误。

Deadline不是超时(timeout)。一旦设置它们永久生效(或者直到下一次调用SetDeadline), 不管此时连接是否被使用和怎么用。
用SetDeadline建立超时机制后,在每一个Read/Write操作之前一定会调用SetDeadline()方法。

(2)服务器端超时设置

TLS Handshake:Transport Layer Security Handshake
传输层安全协议(TLS)用于在两个通信应用程序之间提供保密性和数据完整性。
该协议由两层组成: TLS 记录协议(TLS Record)和 TLS 握手协议(TLS Handshake)
传输层安全性协议(Transport Layer Security,TLS),及其前身安全套接层(Secure Sockets Layer,SSL)是一种安全协议,目的是为互联网通信提供安全及数据完整性保障。
TLS协议的优势是与高层的应用层协议(如HTTP、FTP、Telnet等)无耦合。应用层协议能透明地运行在TLS协议之上,由TLS协议进行创建加密通道需要的协商和认证。应用层协议传送的数据在通过TLS协议时都会被加密,从而保证通信的私密性。

http.Server有两个设置超时的方法: ReadTimeout 和 andWriteTimeout`。你可以显示地设置它们:

srv := &http.Server{  
    ReadTimeout: 5 * time.Second,
    WriteTimeout: 10 * time.Second,
}
log.Println(srv.ListenAndServe())

ReadTimeout: covers the time from when the connection is accepted to when the request body is fully read (if you do read the body, otherwise to the end of the headers). 它的内部实现是在Accept立即调用SetReadDeadline方法。

WriteTimeout的时间计算正常是从request header的读取结束开始,到 response write结束为止 (也就是 ServeHTTP 方法的声明周期),
WriteTimeout: covers the time from the end of the request header read to the end of the response write (a.k.a. the lifetime of the ServeHTTP). 它是通过在readRequest方法结束的时候调用SetWriteDeadline实现的。

参考:
搜“http readtimeOut”
https://colobu.com/2016/07/01/the-complete-guide-to-golang-net-http-timeouts/ 【深度好文,翻译还可,主要是原文好】
英文原始出处: The complete guide to Go net/http timeouts 【原文作者有公司在招人】

3、http响应状态码

当1中的“timeout”
客户端错误响应,408 Request Timeout

参考:
搜索“http timeout error status”
https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Status#客户端错误响应

posted on 2023-02-24 13:55  西伯尔  阅读(101)  评论(0编辑  收藏  举报