Утилита и одновременно библиотека для ожидания доступности сетевого сервиса на порту (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 не имеет "соединения", то проверить наличие работающей программы становится нетривиальной задачей и многие популярные утилиты отказываются от данного функционала.
wait-for-it
(issue — https://github.com/vishnubob/wait-for-it/issues/29)netcat
(nc
) имеет следующее примечание в мануале:
CAVEATS UDP port scans will always succeed (i.e. report the port as open)
net-wait-go
предоставляет поддержку 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.