В слабо связанной архитектуре микросервисов, как вы отслеживаете свои зависимости?

9

Популярный выбор архитектуры высокого уровня в современной программе - это система микросервисов на основе REST. Это имеет несколько преимуществ, таких как слабая связь, простота повторного использования, ограниченное ограничение на технологии, которые можно использовать, высокая масштабируемость и т. Д.

Но одна из проблем, которые я предвижу в такой архитектуре, заключается в плохой видимости зависимостей приложения. Например, допустим, у меня есть приложение, которое ежедневно использует один набор вызовов REST. Это приложение также использует второй набор вызовов REST, но только раз в квартал. Если бы я просканировал журналы за последнюю неделю, я бы увидел все ежедневные дневники, но, скорее всего, не увидел бы ежеквартальных звонков. Когда приходит время для рефакторинга, ежеквартальные звонки подвергаются высокому риску прерывания.

Какие шаблоны или инструменты можно использовать для снижения этого риска и обеспечения большей наглядности в отношении слабозависимой архитектуры?

Дэвид говорит восстановить Монику
источник
1
Именно поэтому слабая связь может быть плохой. Когда нет никаких зависимостей времени компиляции, единственный способ обнаружить ошибки, и вы никогда не обнаружите их все, - это использовать автоматическое тестирование. Решением является некоторый тип автоматического тестирования, которое, вероятно, включает модульное тестирование, а также интеграционное тестирование.
Фрэнк Хилман
@FrankHileman Тестирование, очевидно, помогает, но мне трудно поверить, что это единственное решение. Кроме того, есть много языков, которые не имеют проверок во время компиляции (например, JS или Python), поэтому даже при тесной связи у вас все равно будут проблемы.
Дэвид говорит восстановить Монику
1
Системы статического типа могут отлавливать большое количество ошибок на этапе компиляции. Насколько мне известно, единственной компенсацией за отсутствие такой системы является автоматизированное тестирование. Обнаружение статических ошибок с помощью автоматических проверок или простой компиляции всегда будет более надежным, чем тесты.
Фрэнк Хилман
Одним из возможных способов может быть реализация клиента API каждого сервиса отдельно и включение этих клиентов в зависимости проекта. С помощью API-клиентов также будет проще отслеживать, какую версию сервиса мы используем.
LAIV
@Laiv Мне особенно любопытно узнать о сервисах RESTful, так что на самом деле это не вариант, так как каждый может отправлять HTTP-запросы более или менее.
Дэвид говорит восстановить Монику

Ответы:

4

Какие шаблоны или инструменты могут быть использованы для снижения этого риска

Поддержание совместимости ваших API и возможностей вашего бизнеса.

обеспечить лучшую видимость того, что представляют собой слабосвязанные архитектуры

Проверка здоровья.

Мой сервис является клиентом для ваших ежемесячных возможностей API. Но мой сервис является клиентом вашего API каждый раз, когда он работает. Таким образом, моя служба активируется каждые 10 минут или что-то еще, подключается к вашему ежемесячному API и запускает протокол, чтобы убедиться, что возможности, необходимые для моей службы, все еще доступны.

Таким образом, ваши журналы покажут вам, как часто какая-то другая служба проверяет, чтобы убедиться, что каждая конкретная услуга, которую вы предлагаете, все еще доступна, так же, как она показывает вам, как часто каждая конкретная услуга, которую вы предлагаете, фактически используется.

VoiceOfUnreason
источник
1

Есть как минимум два места, где вы можете найти зависимости:

  • Конфигурация. Для доступа к внешним API-интерфейсам требуется знать кучу информации о каждом из этих API-интерфейсов. Идентификаторы доступа, секретные ключи, конечные точки. Все это не может быть в коде, так как такая информация будет меняться. Например, недавно я начал мигрировать все свои микросервисы в SSL. Это означает, что каждый сервис, который зависит от того, который переносится, должен быть перенастроен, чтобы указывать на https://версию вместо http://. Я рад, что конечные точки были в конфигурации, а не жестко закодированы.

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

Когда приходит время для рефакторинга, ежеквартальные звонки подвергаются высокому риску прерывания.

Для этого и есть регрессионное тестирование.

Вы не можете просто посмотреть на код, изменить его и поверить себе, что ничего не сломано. Это не будет работать в архитектуре микросервисов. Это не будет работать и в монолитном приложении. Компилятор может отлавливать некоторые ошибки, которые вы будете вносить при изменении кода. В некоторых языках, таких как Haskell, компилятор может быть очень способным и отлавливать большинство ошибок; однако компиляторы для основных языков мало что сделают для вас. Если у вас нет тестов, вы облажались. Наличие микросервисов не имеет значения.

Арсений Мурзенко
источник
-2

API-интерфейсы REST указываются слабо, поэтому в определенный момент может быть полезно перейти к gRPC, google protobufs или Thrift, чтобы определить интерфейс RPC, а затем обновить его.

Патрик
источник
2
Это может быть лучше в качестве комментария ... но, честно говоря, это мало что объясняет.
Дэвид говорит восстановить Монику
Справедливо. API отдыха не имеет конкретной зависимости времени компиляции от другого сервиса, потому что связь между ними - просто HTTP-вызов rest, что-то вроде хоста и пути. При использовании gRPC, или Protobuf, или Thrift, определяется интерфейс, который используется для генерации кода. Сгенерированный код скомпилирован и версионирован, а затем ваши службы создаются на основе этих интерфейсов. В результате каждая служба явно зависит от одного или нескольких интерфейсов других ваших служб. Надеюсь, что проясняет мой ответ!
Патрик