Утилита / библиотека net-wait-go

30.06.2020 tcp udp docker


Утилита / библиотека net-wait-go

Что это?

Утилита и одновременно библиотека для ожидания доступности сетевого сервиса на порту (TCP, UDP).

Зачем это?

В приложениях, развернутых через docker как правило мы выкатываем несколько контейнеров вместе с контейнером нашей программы.
В контейнере с нашим приложением нам необходимо знать, стартовали ли уже другие сервисы, от которых зависит наша программа. Узнав об этом, наша программа либо продолжает работать, либо завершается.

В сети есть множество примеров этой задачи с использованием bash и программ nc, timeout, curl. Но что, если наша программа реализована как минимально возможный docker образ FROM scratch, в котором нет bash? Мы можем использовать данную библиотеку в нашей программе — добавить пару строк для проверки доступности сервисов.

Но также данная библиотека может быть скачана как бинарный файл с помощью go get и использована в командной строке.

Использование как библиотеки

Простое

import "github.com/antelman107/net-wait-go/wait"

if !wait.New().Do([]string{"postgres:5432"}) {
    logger.Error("db is not available")
    return
}

С установкой всех возможных опций

import "github.com/antelman107/net-wait-go/wait"

if !wait.New(
      wait.WithProto("tcp"),
      wait.WithWait(200*time.Millisecond),
      wait.WithBreak(50*time.Millisecond),
      wait.WithDeadline(15*time.Second),
      wait.WithDebug(true),
).Do([]string{"postgres:5432"}) {
    logger.Error("db is not available")
    return
}

Использование как утилиты

net-wait-go

  -addrs string
        address:port(,address:port,address:port,...)
  -deadline uint
        deadline in milliseconds (default 10000)
  -debug
        debug messages toggler
  -delay uint
        break between requests in milliseconds (default 50)
  -packet string
        UDP packet to be sent
  -proto string
        tcp (default "tcp")
  -wait uint
		delay of single request in milliseconds (default 100)

Проверка одного сервиса

net-wait-go -addrs ya.ru:443 -debug true
2020/06/30 18:07:38 ya.ru:443 is OK

return code is 0

Проверка двух сервисов

net-wait-go -addrs ya.ru:443,yandex.ru:443 -debug true
2020/06/30 18:09:24 yandex.ru:443 is OK
2020/06/30 18:09:24 ya.ru:443 is OK

return code is 0

Проверка двух сервисов (неудачная)

net-wait-go -addrs ya.ru:445,yandex.ru:445 -debug true
2020/06/30 18:09:24 yandex.ru:445 is FAILED
2020/06/30 18:09:24 ya.ru:445 is is FAILED
...
return code is 1

Поддержка протокола UDP

Так как UDP не имеет "соединения", то проверить наличие работающей программы становится нетривиальной задачей и многие популярные утилиты отказываются от данного функционала.

net-wait-go предоставляет поддержку UDP следующим способом:
  • отправляет конфигурируемый пакет на сервер;
  • ожидает пакет в ответ — хотя бы 1 байт;

Пример пакета UDP

Игровой сервер Counter Strike доступен по протоколу UDP. Мы можем проверить доступность случайных серверов, отправляя пакет A2S_INFO (https://developer.valvesoftware.com/wiki/Server_queries#A2S_INFO)

net-wait-go -proto udp -addrs 46.174.53.245:27015,185.158.113.136:27015 -packet '/////1RTb3VyY2UgRW5naW5lIFF1ZXJ5AA==' -debug true
 
2020/07/12 15:13:25 udp 185.158.113.136:27015 is OK
2020/07/12 15:13:25 udp 46.174.53.245:27015 is OK

# return code is 0

Значение параметра -packet здесь — закодированный в base64 данные пакета A2S_INFO, которые описаны здесь — https://github.com/wriley/steamserverinfo/blob/master/steamserverinfo.go#L133.

Исходники

Доступны на Github — github.com/antelman107/net-wait-go.

Другие статьи