30 июня 2020 г. Tcp Udp Docker
Утилита и пакет Go для ожидания открытия портов (TCP, UDP).
Утилита и пакет Go для ожидания открытия портов (TCP, UDP).
В докеризированных приложениях обычно развертывается несколько контейнеров вместе с основным контейнером программы. Нам нужно знать, запущены ли контейнеры, чтобы мы могли продолжить выполнение нашей программы или завершить её с ошибкой после некоторого дедлайна.
В интернете есть множество примеров, которые советуют использовать несколько bash-команд, таких как nc, timeout, curl. Но что если у нас есть Go программа с минимальным Docker образом FROM scratch, который не имеет bash? Мы могли бы использовать этот пакет как библиотеку в нашей программе — просто добавить пару строк кода для проверки доступности портов.
Этот пакет также можно скачать как утилиту и использовать из командной строки.
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
дедлайн в миллисекундах (по умолчанию 10000)
-debug
переключатель отладочных сообщений
-delay uint
пауза между запросами в миллисекундах (по умолчанию 50)
-packet string
UDP пакет для отправки
-proto string
tcp (по умолчанию "tcp")
-wait uint
задержка одного запроса в миллисекундах (по умолчанию 100)
net-wait-go -addrs ya.ru:443 -debug true
2020/06/30 18:07:38 ya.ru:443 is OK
Код возврата 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
Код возврата 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 FAILED
...
Код возврата 1
Поскольку UDP как протокол не обеспечивает соединение между сервером и клиентами, он не поддерживается в большинстве популярных утилит:
CAVEATS
UDP port scans will always succeed (i.e. report the port as open)
net-wait-go предоставляет поддержку UDP, работая следующим образом:
Игровой сервер Counter Strike доступен через UDP. Давайте проверим случайный сервер Counter Strike, отправив пакет 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
Код возврата 0
Значение -packet здесь — это пакет A2S_INFO, закодированный в base64, который документирован здесь.
Доступен здесь — github.com/antelman107/net-wait-go.
Ранее мы обсуждали локальную отладку с помощью IDE GoLand. Теперь мы обсудим, как удалённо отлаживать программу, работающую внутри Docker-контейнера, используя Visual Studio Code и GoLand IDE.
Read More → Docker Debugger Delve Vscode GolandРанее мы рассматривали деплой бинарного файла программы через SSH на сервер
Сейчас мы рассмотрим как реализовать деплой Docker контейнера из Gitlab CI.
Read More → Docker Deploy Gitlab Ci/CdДавайте обсудим, как создать минимальный Docker образ для Go программы.
Read More → Docker Compilation Upx LdflagsПример простого TCP чата на Go с объяснением логики.
Read More → Tcp Server Chat