【问题标题】:How to refresh request token with microservice multiple instances如何使用微服务多个实例刷新请求令牌
【发布时间】:2018-07-23 10:56:21
【问题描述】:

场景:

当请求令牌过期并且来自不同服务实例的多个请求都通过远程HTTP调用请求新的请求令牌时,同时后一个请求令牌将使前一个请求令牌无效。因为每次获取新令牌的请求都会使前一个无效。生成请求令牌的服务是第三方的,我们无法更改。

问题:

  1. 我们的应用架构是基于微服务的,每个服务会有多个实例,如何在每个服务之间重用请求令牌?(也许将其存储在外部 Redis 中是一种选择)

  2. 在服务启动过程中,如何确保只有一个刷新令牌请求发送给第三方服务?

  3. 之后,当请求令牌过期时,我们如何更新它?

技术栈:

  • Java 8
  • SpringCloud
  • Redis
  • 牧场主
  • MySQL

【问题讨论】:

  • 您的每个服务是否都通过第三方令牌提供商验证令牌?它是否也与用于身份验证的身份相同?
  • A1:它是一个服务(比如 BookingService),但我们同时运行多个 BookingService 实例。 A2:是的。
  • 身份验证服务器不太可能为您的 api 流中的每个服务验证令牌。您有一种验证令牌的方法(公钥)。话虽如此,如果您想在您的场景中拨打电话,您确实需要一项可以为您管理身份验证请求的服务。您可以在单台机器上运行它。如果确实出现了多个预订服务实例,他们将多次调用令牌服务,这只会向您的第三方服务提供一项服务,然后缓存令牌,除非它过期。或者如果您不想编写服务,请查看分布式锁。

标签: java microservices access-token spring-cloud


【解决方案1】:

以下是您可以考虑的选项

  1. 为令牌管理创建一个新的微服务。所有的微服务都会通过这个服务访问第三方认证组件

  2. 在令牌管理服务中,您创建一个 Spring Singleton bean,该 bean 将在此服务启动时自动初始化 (@Autowired)

  3. 在这个bean里面,你可以有调用第三方API的逻辑

  4. 根据您的要求,您可以决定是否需要像 Redis/memcache 这样的缓存服务,或者是否需要 RDBMS 表

  5. 在此令牌管理服务中,当您从第三方 API 获得令牌过期响应时,您可以有更新令牌的逻辑

【讨论】:

  • 该选项仍然无法解决多个实例同时启动的问题。每个实例都可以是一个单例,但我会有多个实例。
  • 这可以通过在 RDBMS 表中持久化令牌来实现。当服务启动时,它会参考这个表来检查令牌是否存在。这样您就可以在所有实例中实现单一令牌
猜你喜欢
  • 2019-10-13
  • 2020-07-11
  • 2020-06-02
  • 1970-01-01
  • 2017-12-15
  • 2020-06-30
  • 2016-07-04
  • 2016-01-05
  • 2019-01-25
相关资源
最近更新 更多