Найти в Дзене
Машинное обучение

Golang работаем с Cloud-Native с Consul и Docker

Оглавление

Справочная информация

В статье будут рассмотрены следующие технические моменты:

  • Интеграция Consul с приложением Golang для регистрации сервисов
  • Интеграция Consul с приложением Golang для обнаружения сервисов
  • Настройка и запуск микросервисов с помощью Docker (docker-compose).

Как вы видите, в этом посте будет рассмотрено несколько важнейших концепций и интересных инструментов. Я быстро и кратко расскажу о них.

  • Cloud-Native: это еще одно громкое слово в индустрии программного обеспечения. Одним из ключевых фишек Cloud-Native приложения является контейнеризация. Чтобы считаться "облачным", приложение должно быть независимым от инфраструктуры и использовать контейнеры. Контейнеры дают приложениям возможность работать как автономная среда, способная работать в облаке и не иметь зависимости от какого-либо определенного облачного провайдера.
  • Регистрация сервисов : в приложении микросервисов каждый сервис должен вызывать другие сервисы. Для того чтобы сделать запрос, службе необходимо знать сетевой адрес экземпляра службы. В облачном приложении микросервисов сетевой адрес является динамическим. Поэтому вашему приложению необходим механизм обнаружения сервисов. С другой стороны, реестр сервисов работает как база данных, хранящая доступные экземпляры сервисов.
  • Consul: Consul - это инструмент, который мы использовали в этом демонстрационном приложении для регистрации и обнаружения сервисов. Consul является членом CNCF (Cloud Native Computing Foundation). В будущем я постараюсь написать статью с анализом его исходного кода.
  • Docker-compose: это инструмент для запуска мультиконтейнерных приложений на Docker. Он позволяет различным контейнерам взаимодействовать друг с другом. В этом посте я покажу вам, как им пользоваться.

Весь код и файлы конфигурации можно найти в этом репозитории github, пожалуйста, проверьте ветку service-discovery для демонстрации в этом посте.

Демонстрация

Чтобы объяснить, как регистрировать и работать с сервисами, я запущу простой сервер helloworld , который будет посылать запросы серверу каждые 10 секунд. Демонстрационный сервер helloworld зарегистрирует себя в Consul. Прежде чем клиент пошлет запрос серверу, он сначала пошлет запрос в Consul и найдет адрес сервера.. Хорошо, давайте напишем код.

Приведенный выше файл server.go содержит много строк кода, но большинство из них просты и предназначены только для настройки сервера и обработки запроса.

Интересная часть находится внутри функции serviceRegistryWithConsul. Consul предоставляет API для регистрации сервиса путем конфигурирования необходимой информации.ID, является уникальным для каждой службы, и мы также используем ее для поиска целевой службы в процессе обнаружения. В реальном приложении микросервисов каждый сервис может иметь несколько экземпляров для обработки запросов при высоком параллелизме, это называется масштабируемостью. Но некоторые сервисы могут выйти из строя или выбросить исключения.

Аналогично, в файле client.go единственной интересной частью является функция serviceDiscoveryWithConsul. Основываясь на API Consul, мы можем найти все сервисы. С помощью идентификатора целевого сервиса (в данном примере это helloworld-server).

Приведенные выше фрагменты кода показывают, как выполнить регистрацию и обнаружение сервисов в готовом демонстрационном примере. В нем мы работаем с API Consul, я не стал давать слишком много объяснений по этому поводу, так как вы можете найти более подробную информацию в документации.

В следующем разделе я покажу вам, как запустить это демо-приложение в Cloud-Native на основе Docker и Docker-compose.

Контейнеризация

Сначала создадим Dockerfile для сервера следующим образом:

Эта часть проста, если вам непонятны некоторые из используемых здесь команд, пожалуйста, обратитесь к руководству Docker.

Я не буду больше показывать Dockerfile для клиента, так как он почти такой же, как и приведенный выше. Но вы можете найти его в этом репозитории https://github.com/baoqger/service-discovery-demo/

Теперь у нас есть и сервер, и клиент, запущенные в контейнерах. Нам нужно добавить Consul в это приложение, а также соединить эти три контейнера вместе. Мы сделаем это с помощью Docker-compose.

Docker-compose управляется yml-файлом. В нашем случае он выглядит следующим образом:

Есть несколько моментов, которые необходимо упомянуть об использовании docker-compose:

  • networks: мы определяем сеть под названием my-net и используем ее во всех трех сервисах, чтобы они могли общаться друг с другом.
  • environment: в этой части мы можем настроить переменную окружения.
  • docker-compose up: это команда, необходимая для запуска приложения. Еще одна полезная команда - docker-compose build, которая используется для сборки образа, определенного в yml-файле. Команда docker-compose down может остановить контейнеры, когда вы хотите выйти из приложения.

Все настроено, вы можете проверить результат как в терминале, так и в пользовательском интерфейсе Consul следующим образом:

-2
-3
Golang