【问题标题】:REST completely stateless, possible?REST 完全无状态,可能吗?
【发布时间】:2016-04-28 16:59:59
【问题描述】:

谁能给我一个真正无状态的 RESTful 端点的例子?一个简单的问题,如果服务器是完全无状态的,我们如何使之前的令牌失效?我认为将状态保存到数据库是不好的做法。假设每秒有数百个请求,这意味着每秒有数百个对 DB 的查询(如果将状态保存到 DB),这是个坏消息。如果将状态保存到服务器,则在使用多个服务器和负载均衡器时会遇到会话传输问题。

【问题讨论】:

  • 我看不出数据库访问有什么问题,如果遇到性能问题,您只需水平扩展即可。
  • 你在这个问题中似乎有矛盾的部分 - 我回答了第一个问题。这当然是可能的,但不是你提出的额外要求。

标签: java web-services rest session stateless


【解决方案1】:

当然,一个示例是不需要身份验证的端点,并且取决于您的结构,还有其他端点。例如,如果您使用 AngularJS 之类的东西,则不需要像使用开发者 API 之类的东西一样获得授权 - 您可以使用可以签名和无状态的会话变量。

如果您担心对此类简单状态事物执行数据库查询的性能,那么值得研究一些解决方案,例如 Redis,您可以轻松地发送数百个查询。

【讨论】:

  • 签名会话变量?但是服务器需要检查,对吗?为了检查这一点,它必须检查“某事”。再次有状态。我错过了什么吗?
  • 会话变量可以使用系统之间共享的密钥作为配置选项进行签名。假设你有一个秘密是:“nhvOcg4hLgc1ieN”你会这样做,这样你的每个服务器都知道那是什么,然后它使用该密钥对每个会话进行加密签名。他们只需要验证签名而不是检查数据库。
【解决方案2】:

根据定义,无状态的静止端点不会使用令牌(具有生命周期)或状态。如果您需要这些,那么您就没有真正无状态的宁静端点。

作为对您问题的回答,没有身份验证或类似机制的 Web 服务器可以被视为真正的无状态休息端点。它只会根据 GET 请求将文件从磁盘传送给任何请求它的人。

此外,如果身份验证是硬编码的基本身份验证或类似机制在每个请求上发送登录详细信息,它仍然是无状态的。当你开始添加过期的令牌时,你肯定已经有了状态。

有关以无状态 REST 方式进行身份验证的详细信息,您可以阅读 this discussion

【讨论】:

  • 我不能同意。例如,请参阅this article。或者你见过User Access Tokens,例如 Facebook 使用的吗? REST 是关于在客户端 服务器之间传输状态,从而保持服务器 无状态
  • 那篇文章谈到了将状态完全存储在客户端,使其余服务无状态。我说过,根据定义,无状态的静止端点不会使用令牌或状态,这也是文章也证实的 - 静止端点在那里没有使用令牌/状态,它只在客户端使用。
  • 没有冒犯,但奇怪的话:Stateless restful endpoints (..) wouldn't use tokens - 当客户端将令牌传递给服务器时,服务器显然使用该令牌(不存储它)进行身份验证.
  • @G.Demecki 我理解这篇文章,因此客户端永远不会将令牌传递给服务器,而是仅在客户端使用它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-05
  • 1970-01-01
  • 2019-07-15
  • 2011-10-14
  • 2021-02-23
  • 1970-01-01
  • 2019-01-07
相关资源
最近更新 更多