登录
首页 >  Golang >  Go问答

client.等待标头时超时

来源:stackoverflow

时间:2024-03-31 09:27:35 115浏览 收藏

知识点掌握了,还需要不断练习才能熟练运用。下面golang学习网给大家带来一个Golang开发实战,手把手教大家学习《client.等待标头时超时》,在实现功能的过程中也带大家重新温习相关知识点,温故而知新,回头看看说不定又有不一样的感悟!

问题内容

我有一个用 go 编写的 lambda,它与 aws 中应用程序负载均衡器后面的轻量级 http 应用程序进行通信:

package main

import (
    "io/ioutil"
    "log"
    "net/http"
    "os"
    "time"
)

func main() {

    for {
        req, err := http.NewRequest("GET", "http://my-app-12345.us-east-1.elb.amazonaws.com:8080", nil)
        if err != nil {
            log.Fatal("Error reading request. ", err)
        }

        req.Header.Set("Load-Rate", os.Getenv("LOAD"))

        client := &http.Client{Timeout: time.Second * 10}

        resp, err := client.Do(req)
        if err != nil {
            log.Fatal("Error reading response. ", err)
        }
        if resp.StatusCode == http.StatusOK {
            bodyBytes, err := ioutil.ReadAll(resp.Body)
            if err != nil {
                log.Fatal(err)
            }
            bodyString := string(bodyBytes)
            log.Println(bodyString)
        }

        time.Sleep(time.Duration(10) * time.Millisecond)
    }
}

我已经在 lambda 和 alb 使用的安全组中的所有端口上打开了全球访问权限,并且我可以从我的家用计算机上很好地卷曲端点。但是,当我尝试在 lambda 中运行此命令时,我在 cloudwatch 日志中收到以下内容:

2020-06-04t07:06:31.028-05:00 进程在完成之前退出 要求 2020-06-04t07:06:41.100-05:00 2020/06/04 12:06:41 错误 阅读回应。得到 http://my-app-12345.us-east-1.elb.amazonaws.com:8080: net/http:等待连接时请求被取消 (等待标头时超出了 client.timeout) 2020-06-04t07:06:41.101-05:00 2020/06/04 12:06:41 退出状态 1

我很难确定这是 go 问题还是我在 aws 中的某些配置错误。我对 go 在这里抛出的错误不太熟悉。


解决方案


自从您写了有关其安全组以来,您的 lambda 似乎位于 VPC 中。如果是这种情况,那么超时的最可能原因是VPC 中的 lambda 没有互联网访问权限,也没有公共 IP,即使它位于公共子网中。

来自docs

将函数连接到公共子网不会为其提供 Internet 访问权限或公共 IP 地址。

由于您的 ALB 是公共的(您从家里卷曲它),您的 lambda 无法访问它,即使它们位于同一子网中也是如此。

要纠正此问题,您必须使用正确的路由设置 NAT 网关或实例,以便能够从 VPC 中的 lambda 与您的公共 ALB 进行通信,并将您的 lambda 置于私有子网中

好了,本文到此结束,带大家了解了《client.等待标头时超时》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>