【发布时间】:2021-02-13 14:24:15
【问题描述】:
我有一个客户端和服务器。服务器处理请求超过 2 秒。但是客户没有那么多时间。它需要在 1 秒内得到响应。这就是为什么它会响应
获取“http://localhost:8888”:超出上下文截止日期(等待标头时超出 Client.Timeout) 恐慌:运行时错误:无效的内存地址或 nil 指针取消引用
问题? 如何更改 server.go 以正确恢复所有错误 并且端点始终可用? 注意,客户端正在调用的端点应尽快处理请求,并在完成后立即返回 200 OK。
client.go
package main
import (
"fmt"
"log"
"net/http"
"time"
)
func main() {
c := &http.Client{Timeout: 2 * time.Second}
res, err := c.Get("http://localhost:8888")
if err != nil {
log.Println(err)
}
var r []byte
_, err = res.Body.Read(r)
fmt.Println(string(r))
}
server.go
package main
import (
"fmt"
"io"
"net/http"
"time"
)
func slowHandler(w http.ResponseWriter, req *http.Request) {
time.Sleep(2 * time.Second)
io.WriteString(w, "I am slow!\n")
}
func main() {
srv := http.Server{
Addr: ":8888",
Handler: http.HandlerFunc(slowHandler),
}
if err := srv.ListenAndServe(); err != nil {
fmt.Printf("Server failed: %s\n", err)
}
}
【问题讨论】:
标签: go tcp server-timing