想把流量发个多个后端,每个后端都可以收到内容,但我写的,每次都只有一个后端收到内容,随机的
package main
import (
"flag"
"fmt"
"io"
"net"
"strings"
)
var tcp_conn []net.Conn
func main() {
var address *string
var dst *string
address = flag.String("listen_address", "127.0.0.1:8080", "listen address")
dst = flag.String("target_address", "172.16.5.9:18061,172.16.5.9:18060", "目标地址,多个地址逗号分割")
flag.Parse()
listener, err := net.Listen("tcp", *address)
if err != nil {
fmt.Println(err)
}
ips := strings.Split(*dst, ",")
if len(ips) == 0 {
fmt.Println("目标地址不能为空")
return
}
for _, ip := range ips {
conn, err := net.Dial("tcp", ip)
if err != nil {
fmt.Println(err)
continue
}
tcp_conn = append(tcp_conn, conn)
}
for {
conn, err := listener.Accept()
if err != nil {
continue
}
go handler(conn)
}
}
func handler(conn net.Conn) {
// defer conn.Close()
for _, dst_conn := range tcp_conn {
go io.Copy(dst_conn, conn)
go io.Copy(conn, dst_conn)
}
}
该如何改呢,哪位大佬帮忙看看
有疑问加站长微信联系(非本文作者)

某个协程io.Copy之后相当于读完了流,另外的协程当然读不到数据了,你需要修改代码,每次读取[]byte,然后再每个连接Write([]byte)
代码如何写啊,不用io.copy了吗
将流量拷贝分发给多个后端可以理解,可以简单的这样写:
但是,后端的返回数据都往一个conn里面写入,这个conn收到消息该怎么解析。
我只取第一个回复的数据,这样试了下不行,会报错,
make slice 时写错了
楼主这个场景有点像流量镜像,就是把流量拷贝N多份,一份照常给业务服务器。其他的发送给流量审计服务器或者测试环境服务器。
需要有一些注意:
如果只读取第一个连接的数据回复,其他的不管,
有可能
会造其他连接的消息积压。 虽然你并不关心其他连接回复的消息,但是应该把回复的消息读出来,比如读出来丢弃掉:io.Copy(io.Discard, otherConn)
最好不要用
io.MultiWriter()
,因为有一个写入出错就会导致io.MultiWriter()
报错, 因为后端某个连接可以能会异常或断开,这样一个异常,会影响所有的 Writer 写入是这样的场景,我们公司有模拟别家公司服务端的一个功能,客户端用的是人家的,接收到数据后,做解析,为了解析效果一致, 需要把客户端上报的数据,同时发给我司的服务端与别家公司的服务端,做比较找出差异。
我这样写,目前有个问题,第一次客户端发送数据,服务端都能收到,但是第二次发送 ,客户端就一致sending ,不知道是哪里阻塞了
凭感觉写的,未经优化未经测试,仅供参考
真心感谢大佬,一把跑通,请求多次都是正常的
请问如果实现轮询发送的话应该怎么做呢?就是第一次发给服务器A,接收它的返回;第二次发给服务器B,接收它的返回,以此类推,基于您的基础上改了改发现有问题