В архитектуре микросервиса я с трудом понимаю, как можно управлять конфигурацией, специфичной для среды (например, IP-адрес и учетные данные для базы данных или брокера сообщений).
Скажем, у вас есть три микросервиса ( "A", "B" и "C" ), каждая из которых принадлежит и поддерживается другой командой. Каждая команда нуждается в командной среде интеграции... где они работают с последним снимком своих микросервисов, а также стабильными версиями всех зависимых микросервисов. Конечно, вам также понадобятся QA/промежуточная/производственная среда. Упрощенный вид большой картины будет выглядеть следующим образом:
Командная среда Microservice A
- Microservice A (SNAPSHOT)
- Microservice B (STABLE)
- Microservice C (STABLE)
Командная среда Microservice B
- Microservice A (STABLE)
- Microservice B (SNAPSHOT)
- Microservice C (STABLE)
Командная среда Microservice C
- Microservice A (STABLE)
- Microservice B (STABLE)
- Microservice C (SNAPSHOT)
QA/Staging/Production
- Microservice A (STABLE, RELEASE и т.д.)
- Microservice B (STABLE, RELEASE и т.д.)
- Microservice C (STABLE, RELEASE и т.д.)
Это много развертываний, но эта проблема может быть решена сервером непрерывной интеграции и, возможно, чем-то вроде Chef/Puppet/etc. Тяжелая часть действительно заключается в том, что каждому микросервису потребуются некоторые данные среды, относящиеся к каждому месту развертывания.
Например, в командной среде "A" для "A" требуется один адрес и набор учетных данных для взаимодействия с "B". Однако в командной среде "B" для развертывания "A" требуется другой адрес и учетные данные для взаимодействия с этим развертыванием "B".
Кроме того, по мере того, как вы приближаетесь к производству, такая информация об экологических конфигурациях, возможно, нуждается в ограничениях безопасности (т.е. только некоторые люди могут изменять или даже просматривать ее).
Итак, с архитектурой микросервиса, как вам поддерживать конфигурационную информацию, зависящую от конкретной среды, и сделать ее доступной для приложений? На ум приходит несколько подходов, хотя все они кажутся проблематичными:
- Попросите сервер сборки испечь их в приложении во время сборки. Я полагаю, вы могли бы создать репо для файлов свойств или сценариев для каждого объекта и создать процесс сборки для каждого микросервиса и вытащите соответствующий script (у вас также может быть отдельный репозиторий с ограниченным доступом для производственного материала). Однако вам понадобится тонна скриптов. В основном отдельный для каждого микросервиса в каждом месте, где может быть развернута микросервис.
- Выпекать их в базовых изображениях Docker для каждой среды. Если сервер сборки помещает ваши приложения для микросервиса в контейнеры Docker в качестве последнего шага процесса сборки, вы можете создавать собственные базовые изображения для каждого Окружающая среда. Базовое изображение будет содержать оболочку script, которая устанавливает все необходимые переменные среды. Ваш Dockerfile будет настроен на вызов этого script до запуска вашего приложения. У этого есть схожие проблемы с предыдущим пунктом, поскольку теперь вы управляете тонной копией Docker.
- Извлеките информацию об окружающей среде во время выполнения из какого-то реестра. Наконец, вы можете сохранить конфигурацию для каждой среды внутри чего-то вроде Apache ZooKeeper (или даже простой базы данных), и если ваш код приложения вытащит его во время выполнения, когда он запустится. Каждому приложению микросервиса нужен способ сообщить, в какой среде он находится (например, параметр запуска), чтобы он знал, какой набор переменных должен захватывать из реестра. Преимущество такого подхода заключается в том, что теперь вы можете использовать тот же артефакт сборки (например, приложение или контейнер Docker) на всем пути от командной среды до производства. С другой стороны, теперь у вас будет другая зависимость от выполнения, и вам все равно придется все эти данные записывать в реестр.
Как люди обычно решают эту проблему в архитектуре микросервиса? Кажется, это было бы обычным делом, о котором можно было бы услышать.