go - 在反向代理中响应正确的客户端

标签 go

我正在尝试使用 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。

我目前的解决方案

我已经为每个 HTTP 请求创建了一个由唯一 ID 标识的 channel 的 map。此唯一 ID 在 TCP 请求中传递给服务器,并与响应一起发回。客户端在响应中解析这个ID,发送到数组中对应的channel。过于简化的代码,其中 conns 是可用 channel 的 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 脚本的请求和响应即使是并发请求也是正确的?

最佳答案

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

关于go - 在反向代理中响应正确的客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25091480/

相关文章:

macos - Go - 使用 xgo 库与 CGO 交叉编译

go - 为什么 'go vet' 只在某些版本的 Go 中报错?

go - 如何在golang的sql.open函数中调用变量

Golang 将 image.Image 转换为 []byte

go - go中一个 channel 使用两个箭头写入另一个 channel 是什么意思

http - 如何接收流式传输的 HTTP 响应

go - 访问go中函数返回的多个结果参数之一

go - 长时间运行的 cgo 函数调用超时

go - 如何在Golang中使用exec.Command()。Output()命令填充结构值?

json - 在 Go 中,如何将 JSON 对象数组转换为具有默认值的结构数组?