TL; DR: Если вы анализируете какую-либо конкретную архитектуру микросервисов и объединяете сервисы A и B вместе, чтобы избежать A не работает, потому что B сломался (потому что он сильно зависит от B , и согласно спецификации проекта A не может выполнить запрос, если B неисправен), учитывая достаточное количество итераций, разве вы не собираетесь в итоге получить монолитную архитектуру?
Этот вопрос был недавно задан в нашей компании, и я боюсь, что онпринятие близорукого решения.
Краткое описание архитектуры:
- это наша первая система, использующая микросервисную архитектуру
- у нас есть N
количество микросервисов (в частности, каждый микросервис представляет собой JARработает в модуле kubernetes в кластере)
- Каждый JAR предоставляет один сервис (например, auth
, users
, images
...) через HTTP API
- 99% наших сервисов требуютавторизация пользователя, но без аутентификации (это делаетсяНа другом уровне наш сервис предполагает, что если запрос достиг его, заголовок запроса содержит действительный пользовательский токен
- чтобы перевести пользовательский токен в нечто материальное (например, информацию о пользователе)), мы делаем запрос к службе users
- В настоящее время каждая служба делает это, чтобы проверить, соответствует ли пользователь некоторым критериям, относящимся к услуге.
Теперь на совещании несколько старших разработчиков выразили обеспокоенность тем, что если users
по какой-то причине не удастся (не обязательно что-то связанное с программным обеспечением, давайте просто предположим, что машины, выделенные для этих служб, неисправны), всеперестанет работать, делая это (по их мнению) квазимонолитной архитектурой с дополнительными шагами.Чтобы избежать этого, они предлагают преобразовать службу users
в статическую библиотеку и добавить в качестве зависимости все службы, которым она требуется, чтобы каждая служба содержала эту функцию сама по себе, а не в зависимости от удаленного API.
Но разве это не проблема спецификации , а не проблема архитектуры?Это не то, что images
API (технически говоря) не может функционировать без users
, просто в текущей спецификации проекта не определено, что он должен делать в этом случае, поэтому он простопроисходит сбой, как будто сама служба неисправна .
Причина, по которой я лично считаю, что это недальновидное решение, заключается в том, что можно утверждать, что любой вид связи между микросервисами можно считать таковымриск.Этот случай - просто очень очевидная потенциальная точка отказа и первая итерация анализа «что может сломать».С достаточным вниманием к нему любая конечная точка, используемая многими службами, может обрабатываться одинаково, если не указан «план B» (например, если изображение не может быть получено из службы image
, используйте предопределенное изображение заполнителя)