gpt4 book ai didi

go - 要为多个端点设置http客户端吗?

转载 作者:行者123 更新时间:2023-12-01 22:45:47 25 4
gpt4 key购买 nike

我重用了HTTP客户端连接以对单个端点进行外部调用。该程序的摘录如下所示:

var AppCon MyApp

func New(user, pass string, platformURL *url.URL, restContext string) (*MyApp, error) {
if AppCon == (MyApp{}) {
AppCon = MyApp{
user: user,
password: pass,
URL: platformURL,
Client: &http.Client{Timeout: 30 * time.Second},
RESTContext: restContext,
}

cj, err := cookiejar.New(nil)
if err != nil {
return &AppCon, err
}

AppCon.cookie = cj
}

return &AppCon, nil
}

// This is an example only. There are many more functions which accept *MyApp as a pointer.
func(ma *MyApp) GetUser(name string) (string, error){
// Return user
}

func main(){
for {
// Get messages from a queue
// The message returned from the queue provide info on which methods to call
// 'm' is a struct with message metadata

c, err := New(m.un, m.pass, m.url)

go func(){
// Do something i.e c.GetUser("123456")
}()
}
}

现在,我需要使用通过队列消息接收到的不同端点/凭证来设置客户端连接。

我预见的问题是,由于返回了 AppCon的指针,导致重置了 MyApp,因此我不能仅使用新的端点详细信息来简单地修改 c。这可能会影响goroutine对意外端点进行HTTP调用。为了使事情变得不那么琐碎,该程序并不是要了解端点(我正在考虑使用 switch语句),而是通过队列消息接收其所需的内容。

鉴于我所说的问题是正确的,是否有解决建议?

编辑1

根据提供的反馈,我倾向于认为这可以解决我的问题:
  • 删除对MyApp的单例使用
  • 将http客户端与MyApp脱钩,这将使其能够重复使用
  • var httpClient *http.Client

    func New(user, pass string, platformURL *url.URL, restContext string) (*MyApp, error) {

    AppCon = MyApp{
    user: user,
    password: pass,
    URL: platformURL,
    Client: func() *http.Client {
    if httpClient == nil {
    httpClient = &http.Client{Timeout: 30 * time.Second}
    }
    return httpClient
    }()
    RESTContext: restContext,
    }

    return &AppCon, nil
    }

    // This is an example only. There are many more functions which accept *MyApp as a pointer.
    func(ma *MyApp) GetUser(name string) (string, error){
    // Return user
    }

    func main(){
    for {
    // Get messages from a queue
    // The message returned from the queue provide info on which methods to call
    // 'm' is a struct with message metadata

    c, err := New(m.un, m.pass, m.url)

    // Must pass a reference
    go func(c *MyApp){
    // Do something i.e c.GetUser("123456")
    }(c)
    }
    }

    最佳答案

    免责声明:这不是您问题的直接答案,而是试图将您引导到解决问题的正确方法。

  • 尝试为您避免使用单例模式MyApp。另外,New具有误导性,它实际上并不是每次都创建一个新对象。相反,您可能每次都创建一个新实例,同时保留http客户端连接。
  • 不要使用这样的结构:AppCon == (MyApp{}),有一天,您会在腿上射击。改用指针,然后将其与nil进行比较。
  • 避免比赛条件。在您的代码中,您将启动goroutine,然后立即继续进行for循环的新迭代。考虑到您重复使用整个MyApp实例,实际上就引入了竞争条件。
  • 使用cookie,可以使连接有点状态,但是您的任务似乎需要无状态连接。这种方法可能出问题了。
  • 关于go - 要为多个端点设置http客户端吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60484748/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com