У меня интересный вопрос об архитектуре микросервиса.Дело в том, что у меня есть несколько служб, которым требуется одна центральная информация о разрешении.В нашей архитектуре все микросервисы сами управляют разрешениями, но у пользователя в нашей системе может быть несколько компаний, которыми он может управлять.Почти каждый маршрут в системе нуждается в идентификаторе компании в запросе.Теоретически, пользователь X может удалить пользователя Y из определенной компании, если пользователь Y теперь пытается предпринять какие-либо действия в этой компании, ему больше нельзя это разрешать.Но любой сервис должен знать, что пользователю больше не разрешен доступ.Для обмена этими данными между всеми службами существует 3 возможных подхода:
1) Если пользователь X удаляет пользователя Y из компании, служба помещает сообщение в Q, а работник сообщает об этом всем другим службам.менять.2) Я использую Zuul в качестве теоретического API-шлюза, который API-шлюз может проверять при каждом запросе (который имеет company_id) в запросе, если пользователю даже разрешен доступ к этой компании.Но это означает, что сам API-шлюз должен будет выполнять вызов базы данных, что не очень удобно, поскольку шлюз должен быть шлюзом и ничем иным.3) Я мог бы использовать глобальное хранилище данных, которое реплицируется на каждом микросервисе, для этого я мог бы использовать, например, etcd.Каждый микросервис может проверить, разрешен ли пользователю Y доступ к компании.
Важно во всех случаях, что если пользователю Y разрешен доступ к компании, сам микросервис все еще должен проверить, разрешено ли пользователю Yопределенное действие на эту компанию.Таким образом, это сопоставление пользователя с компанией предназначено только для того, чтобы удостовериться, что пользователь вообще имеет доступ к компании.
Я не очень доволен каким-либо из этих посягательств, потому что помещение сообщения в очередь (1) означает, чтокаждая услуга должна быть проинформирована об изменении.Использование Zuul для проверки (2) также не очень практично, потому что это должен быть только шлюз.