Эмулировать сетевое соединение без ввода сетевого набора - PullRequest
0 голосов
/ 17 октября 2018

В настоящее время я работаю над кодом балансировки поставщика.Мне нужно удалить вызов 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()), но это не удалось.

1 Ответ

0 голосов
/ 18 октября 2018

Шаблон, который вы можете изменить в коде, - создать интерфейс Dialer.В вашем примере кода вы используете возвращенный ds просто как io.ReadWriteCloser.Таким образом, вам не нужно реализовывать весь интерфейс net.Conn.Поскольку net.Conn имеет метод чтения и записи, внутри все работает

type Dialer interface{
    Dial(network, address string) (io.ReadWriteCloser, error)
}

Теперь давайте изменим вашу функцию:

func handleConnection(us net.Conn, backend BA.Backend, d Dialer) {
    // ...

    // Code here stays
    ds, err := d.Dial("tcp", backend.String());if err != nil {
        log.Printf("failed to dial %s: %s", backend, err)
        us.Close()
        return
    }
    // ...
}

Чтобы ваш рабочий код работал, вам нужно определить тип netDialer, который обёртывает функцию net.Dial().В своем тесте вы можете использовать testDialer, который использует bytes.Buffer.

Это ответ на ваш вопрос:

Эмуляция сетевого соединения без ввода сетевого набора

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...