如何处理服务到服务通信中的安全 API
How to handle secured API in service to service communication
我有一个工作的单体应用程序(部署在容器中),我想为其添加通知功能作为单独的微服务。
我计划让单体将事件发送到消息总线 (RabbitMQ),新服务将在该消息总线上接收事件,然后将通知发送给用户。为了编写通知,它需要来自 monolit 的其他用户信息,因此它将调用 monolith 的 REST API 以获取它。
问题是,访问单体 API 需要令牌形式的身份验证。我在想:
- 使用单体中的秘密来发布一个永不过期的令牌——从安全的角度来看,我认为这不是一个好主意,而且我知道有时密钥会轮换,在这种情况下令牌会变成无论如何最终无效
- 使用消息总线检索信息 - 这似乎也不是一个好主意,因为异步会使它变得非常复杂
- 在事件中提供通知服务所需的所有信息——这将使它们更加耦合,此外,我还计划根据非事件触发的单体状态发送通知
- 从整体中删除身份验证并以不同的方式实现它(还不确定如何实现)
我的问题是,有哪些解决此类问题的好方法,而且,刚开始学习微服务,我首先要做的是正确的吗?
在处理内部安全问题时,您应该始终考虑部署以及 API 向外界公开的方式,API 网关可能用于简单地使其无法访问内部API秒。在这种情况下,固定令牌可能足以确保客户端获得授权。
不过,总的来说,我建议研究 OAuth2 或基于 JWT 的解决方案,因为它有助于验证调用系统的身份及其访问权限。
对于您的架构疑虑,您在构建解决方案时需要考虑以下场景:
- 远程调用可能会因未知原因随时失败,因此在您确定通知已成功处理之前,您不应确认通知事件。
- 正如您提到的 RabbitMQ,您的目标应该是使通知队列尽可能小,为此,包含用户详细信息的缓存可能有助于加快速度(并帮助您减少失败的可能性)由于外部系统不可用)。
- 如果您的应用程序向潜在的数百万不同用户发送大量通知,您可以考虑拥有一个通知服务可访问的用户的只读数据库副本,并直接从数据库集群中批量读取.这减少了单体的负载并将其转移到数据库层
我有一个工作的单体应用程序(部署在容器中),我想为其添加通知功能作为单独的微服务。
我计划让单体将事件发送到消息总线 (RabbitMQ),新服务将在该消息总线上接收事件,然后将通知发送给用户。为了编写通知,它需要来自 monolit 的其他用户信息,因此它将调用 monolith 的 REST API 以获取它。
问题是,访问单体 API 需要令牌形式的身份验证。我在想:
- 使用单体中的秘密来发布一个永不过期的令牌——从安全的角度来看,我认为这不是一个好主意,而且我知道有时密钥会轮换,在这种情况下令牌会变成无论如何最终无效
- 使用消息总线检索信息 - 这似乎也不是一个好主意,因为异步会使它变得非常复杂
- 在事件中提供通知服务所需的所有信息——这将使它们更加耦合,此外,我还计划根据非事件触发的单体状态发送通知
- 从整体中删除身份验证并以不同的方式实现它(还不确定如何实现)
我的问题是,有哪些解决此类问题的好方法,而且,刚开始学习微服务,我首先要做的是正确的吗?
在处理内部安全问题时,您应该始终考虑部署以及 API 向外界公开的方式,API 网关可能用于简单地使其无法访问内部API秒。在这种情况下,固定令牌可能足以确保客户端获得授权。
不过,总的来说,我建议研究 OAuth2 或基于 JWT 的解决方案,因为它有助于验证调用系统的身份及其访问权限。
对于您的架构疑虑,您在构建解决方案时需要考虑以下场景:
- 远程调用可能会因未知原因随时失败,因此在您确定通知已成功处理之前,您不应确认通知事件。
- 正如您提到的 RabbitMQ,您的目标应该是使通知队列尽可能小,为此,包含用户详细信息的缓存可能有助于加快速度(并帮助您减少失败的可能性)由于外部系统不可用)。
- 如果您的应用程序向潜在的数百万不同用户发送大量通知,您可以考虑拥有一个通知服务可访问的用户的只读数据库副本,并直接从数据库集群中批量读取.这减少了单体的负载并将其转移到数据库层