В настоящее время я работаю над кодом балансировки поставщика.Мне нужно удалить вызов tcp и эмулировать успешное соединение без вызова.В приведенном ниже коде есть строка:
ds, err := net.Dial("tcp", backend.String());if err != nil {
log.Printf("failed to dial %s: %s", backend, err)
us.Close()
return
}
Для этого нужно сделать набор номера на tcp-сервере и затем вернуть ответ о соединении в ds
, который определен здесь: https://golang.org/pkg/net/#Dial
Что мне нужно, это получить ds
без выполнения tcp dialer
.Я пытаюсь проверить балансировщик нагрузки без каких-либо реальных вызовов TCP.Поэтому, по сути, когда мы вводим handleConnection
, мы создаем сетевое соединение до набора tcp и используем этот net conn, который должен эмулировать 100% сетевое соединение до начала набора tcp.
func copy(wc io.WriteCloser, r io.Reader) { defer wc.Close()
io.Copy(wc, r)
}
func handleConnection(us net.Conn, backend BA.Backend) {
if backend == nil {
log.Printf("no backend available for connection from %s",
us.RemoteAddr())
us.Close()
return
}
host, _, _ := net.SplitHostPort(us.RemoteAddr().String())
_, ok := dbAuthTokenData[host]; if !ok {
w := bufio.NewWriter(us)
w.WriteString("InvalidCredentials")
w.Flush()
us.Close()
return
}
ds, err := net.Dial("tcp", backend.String());if err != nil {
log.Printf("failed to dial %s: %s", backend, err)
us.Close()
return
}
// Ignore errors
go copy(ds, us)
go copy(us, ds)
}
func tcpBalance(bind string, backends BA.Backends) error {
log.Println("using tcp balancing")
ln, err := net.Listen("tcp", bind)
if err != nil {
return fmt.Errorf("failed to bind: %s", err)
}
log.Printf("listening on %s, balancing %d backends", bind, backends.Len())
for {
conn, err := ln.Accept()
if err != nil {
log.Printf("failed to accept: %s", err)
continue
}
go handleConnection(conn, backends.Choose())
}
return err
}
Я пыталсякомментируя go handleConnection(conn, backends.Choose())
, но это не удалось.