Go语言接口超时管理及优化

silverwq
2023-12-30 / 0 评论 / 120 阅读 / 正在检测是否收录...

服务端在调用第三方接口有可能会超时,如果超时了,一般不会让客户端一直等,要设置最大响应时间,如果超过这个时间的话,就返回。

代码如下所示:

package main

import (
    "net/http"
    "time"
)

func readDb() string {
    // 200 ms
    time.Sleep(200 * time.Millisecond)
    return "OK"
}

func home(w http.ResponseWriter, req *http.Request) {
    var resp string

    // 容量设置1,类型直接设置空结构体即可
    done := make(chan struct{}, 1)
    go func() {
        resp = readDb()
        done <- struct{}{}
    }()

    // 阻塞在这里,哪个先返回,就那个解除阻塞
    select {
    case <-done:
    case <-time.After(300 * time.Millisecond):
        // 100ms 超时
        resp = "timeout"

    }

    _, _ = w.Write([]byte(resp))
}

func main() {
    http.HandleFunc("/", home)
    _ = http.ListenAndServe("127.0.0.1:5678", nil)
}
0

评论 (0)

取消