【问题标题】:Respond to the right client in a Reverse proxy在反向代理中响应正确的客户端
【发布时间】:2014-12-23 04:03:31
【问题描述】:

我正在尝试使用 Go 在两台服务器之间建立持久的 TCP 连接;位于本地的client 和远程计算机中的server。客户端还在本地为PHP 脚本提供HTTP 请求。每个请求都通过 TCP 连接中继到远程服务器。然后将响应发送回 PHP 脚本。

HTTP request from .php script
  \
   \    -----> HTTP req is relayed
    \                 
client <--------------TCP connection------------> server
    / 
   /              <------ Response is relayed
  /
HTTP request from .php script

对于并发连接,发送到远程服务器和从远程服务器返回的请求不同步,即请求 #1 的响应可以发送到请求 #2。

我目前的解决方案

我创建了一个map 频道,这些频道由每个 HTTP 请求的唯一 ID 标识。此唯一 ID 在 TCP 请求中传递给服务器,并与响应一起发回。客户端在响应中解析这个ID,并将其发送到数组中对应的通道。过于简化的代码,其中conns 是可用频道的map,唯一ID 是整个响应,或者str

    connbuf := bufio.NewReader(remoteConn)  
    str, err := connbuf.ReadString('\n')
    str = strings.TrimSpace(str)
    if len(str) > 0 {
        id, _ := strconv.Atoi(str)
        conns[id] <- str
    }

问题

是否有更优雅的内置方式来实现这一点 - 即使并发请求也能确保对本地 PHP 脚本的请求和响应正确?

【问题讨论】:

  • 考虑到将一堆请求多路复用到一个连接上的任务,那么,是的,您最终会遇到与您正在做的事情大致一样复杂的事情。
  • 关于如何可靠地做到这一点的任何指针?实现这一点的任何最佳实践(在任何其他语言中也将有助于理解)?
  • 使用您提到的multiplexing 关键字,我发现了这个:github.com/inconshreveable/muxado 和同一作者的hakkalabs.co/articles/stream-multiplexing-go 你认为这解决了这个@twotwotwo
  • 啊,太好了,我什至没想到评论会有很大帮助!是的,我只看过那个包,但它看起来确实是用于您在此处描述的那种任务;似乎值得尝试整合。
  • @twotwotwo 你能不能提供一个答案:)

标签: go


【解决方案1】:

这与 kouton 的自我回答一样多,但使用单个“后端”连接(在本地服务器和远程服务器之间)来服务多个“前端”连接(在本地 PHP 和本地服务器)是多路复用的一种形式,muxado 包 (video of a talk) 旨在帮助您实现它。

【讨论】:

    猜你喜欢
    • 2017-05-29
    • 2021-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-26
    相关资源
    最近更新 更多