2016-12-07 7 views
5

Я работаю над приложением с микросервисной архитектурой. Каждый микросервис может жить сам по себе, не имеет прямых зависимостей от других микросервисов в системе. В каждом микросервисе мы используем CQRS и источники событий для информирования об изменении состояния службы. Другие службы информируются об этих событиях, если они заинтересованы и могут обновить свои данные.Является ли служба безопасности единственной точкой отказа в архитектуре микросервиса?

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

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

Моя проблема с этим подходом заключается в том, что если сервер безопасности выключен, вся система не работает.

Я имею в виду следующее решение:

Каждый microservice должны сохраняться пользовательские данные в своей базе данных. Если пользователь обращается к микросервису, пользователь аутентифицируется внутри службы без удаленного вызова службы безопасности. У меня все равно должна быть служба безопасности для управления пользователями. Изменения в пользователях снова повысят события, а другие микросервисы могут обновлять свои пользовательские данные. Конечно, все с https. И, возможно, чтобы уменьшить избыточный код для обеспечения безопасности, я мог бы использовать пакет nuget.

Как вы думаете, это разумный подход?

Спасибо за ваши советы

ответ

1

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

Обратите внимание, что при использовании решения SSO, подобного OAuth2/OpenID Connect, нет необходимости в каждом микросервисе (Service Povider, SP в SSO) для подключения к службе безопасности (поставщик удостоверений, IP) для каждого запроса , Как только клиент (клиент, являющийся потребителем микросервисов) получил маркер из IP, токен может быть проверен на SP независимо от IP (например, с помощью криптографии с открытым ключом). Это означает, что если IP не работает, не будут выдаваться новые токены доступа, но уже выпущенные будут продолжать работать, а микросервисы не обязательно будут разговаривать напрямую друг с другом, только через своего потребителя.

+0

Я вижу вашу точку зрения. Это полезно знать по соображениям производительности. Но моя первоначальная проблема в том, что вся система зависит от одной службы, до сих пор не решена. Значит, вы говорите мне, что использование этой архитектуры должно быть связано с этим риском? Даже netflix? – kaz

+0

Видимо @IlliakaillI победил меня, но он прав (upvoted! :)), вы все равно можете распределить провайдера идентификаторов на столько узлов, сколько хотите, и создать надлежащую высокую доступность, как в любом другом случае. Поэтому, говоря о «одной конкретной» службе безопасности, это ее логический уровень, он может (и должен) по-прежнему быть несколькими физическими компьютерами в HA. –

+0

Согласен, но не должны ли эти службы обмениваться базой данных (поскольку они являются экземплярами одной и той же службы безопасности)? Разве это еще не одна точка неудачи? – kaz

1

Ваше решение предполагает дублирование логики и состояния IdentityServer через несколько микросервисов. Вы можете добиться практически той же цели, но более элегантным способом, создав несколько экземпляров IdentityServer в нескольких географически распределенных местах, чтобы минимизировать риски сбоя (кластер HA). Вы будете вводить больше рисков, дублируя эту логику (даже повторно используя пакет NuGet) в нескольких сервисах. Вы все равно должны подключить эту штуку к каждой микросервису, не так ли? Это один из возможных источников ошибок.

Также как упоминалось в его ответе Gabor, это увеличит риск компрометации базы данных пользователей.

Если вы беспокоитесь о том, что ошибки могут возникнуть после развертывания новой версии IdentityServer, вы можете решить эту проблему путем более тщательного тестирования ее на промежуточной среде перед развертыванием в производство.