Тестирование микросервисов
Пояснение к узлам на схеме:
- gencoords - генератор координат от текущих даты/времени.
- gentemps - генератор температуры/влажности в отсеках корабля от текущих даты/времени.
- producercoords - продюсер данных в Kafka от генератора координат.
- producertemps - продюсер данных в Kafka от генератора температуры/влажности.
- consumersensors - консьюмер данных из Kafka. Сохраняет данные из двух топиков по двум соответствующим таблицам в БД ClickHouse.
Используемые продукты и технологии:
- Clickhouse (clickhouse/clickhouse-server:25.10.2)
- Kafka (confluentinc/cp-kafka:7.9.5)
- Zookeeper (confluentinc/cp-zookeeper:7.9.5)
- gRPC (обмен данными между генераторами данных и продюсерами), HTTP Query (для изменения скорости запросов от продюсеров к генераторам данных)
- otlptrace, otel/exporters/prometheus, Sarama (Go-клиент для Apache Kafka)
Порядок развёртывания (без Kubernetes):
- В облаке (например, Yandex Cloud) создаём несколько виртуальных машин (ВМ), достаточно будет 2 ядра Zen 4, 1-6 GB RAM, 10-20 GB SSD, и резервируем один белый IP адрес.
- Создаем ВМ: proxy, gencoords, gentemps, producercoords, producertemps, consumersensors, kafka01, clickhouse01, otel01.
- Настраеваем подключение к остальным ВМ по SSH через proxy. Для этого на proxy в /etc/ssh/sshd_config активируем "AllowTCPForwarding yes". Копируем приватный ключ (scp .ssh/id_ed25519 beta@:~/.ssh/id_ed25519), устанавливаем права (chmod 600 ~/.ssh/id_ed25519).
- Настраиваем NAT Virtual Private Cloud для возможности ВМ скачивать необходимые файлы.
- Добавляем секреты для GitHub Actions: SSH для подключения к ВМ, PAT (classic) для публикации docker images в ghcr.io, Fine-grained PAT с правами чтения репозитория для компиляции бинарных файлов и адресного скачивания файлов Docker compose, PROXY_IP с адресом proxy.
- Запускаем predeploy.yml. Он обновит все зависимости и установит Docker на каждую из ВМ (за исключением proxy).
- Запускаем predeploy-otel.yml. Он установит приложения для сбора телеметрии на каждую из ВМ (за исключением proxy).
- Запускаем deploy-static.yml. Он установит приложения kafka, clickhouse и OpenTelemetry Collector на ВМ kafka01, clickhouse01 и otel01 соответственно.
- Запускаем golangci-lint.yml (срабатывает по триггеру push в main-ветку). Он проверит код всех приложений на предмет ошибок.
- В случае успешного завершения golangci-lint.yml автоматически запустится unit-tests.yml. Он выполнит unit-тесты функции сохранения в Clickhouse для consumersensors.
- В случае успешного завершения unit-tests.yml автоматически запустится build.yml. Он сформирует новые контейнеры с приложениями и опубликует их в ghcr.io.
- В случае успешного завершения build.yml автоматически запустится deploy-apps.yml. Он направит новые образы на ВМ для первичного развёртывания/замены текущих контейнеров.
- При изменении кода в репозитории пункты 9-12 повторяются автоматически (при ручной отмене выполнения одного из пунктов - автоматически отменяются и последующие).
- При ручном запуске integration-tests.yml можно выполнить интеграционное тестирование сохранения в Clickhouse для consumersensors (разворачивается контейнер clickhouse01-test и проверяется реальное взаимодействие с БД как если это было бы в production-среде).
- В корне репозитория расположены файлы тестирования producercoords (под нагрузкой исходящей от proxy). По графикам видно, что спустя некоторое время на узле-источнике нагрузки (proxy) срабатывает защита, и процесс vegeta уничтожается.