HTTP无状态协议和服务器端状态管理

关于 HTTP 和状态管理

HTTP是一个无状态协议

HTTP(Hypertext Transfer Protocol)是一个无状态协议,这意味着每个请求都是相互独立的,服务器不会保留之前请求的状态。
这里的“状态”指的是客户端和服务器之间的信息交换状态,例如登录状态、购物车中的商品等。由于服务器不保存之前请求的状态,所以每个请求都需要包含所有必要的信息,以便服务器能够正确地理解和响应该请求。
HTTP是一个无状态协议,这是由设计初衷所决定的。下面是一些原因:

  1. 简化服务器处理:无状态协议使服务器不需要维护每个客户端请求的状态信息。以简化服务器的设计和实现,降低服务器的复杂性。
  2. 可伸缩性:无状态协议使服务器能够轻松地处理大量的并发请求。每个请求都是独立的,服务器不需要为每个客户端保留状态信息,提高了系统的可伸缩性和性能。
  3. 灵活的负载均衡:每个请求都是独立的,无状态协议使负载均衡更加灵活。负载均衡器可以根据实际情况将请求分发到不同的服务器上,不需要考虑之前的请求状态。

服务器端状态管理技术

尽管 HTTP 是无状态的,但为了实现某些功能,例如用户认证和会话管理,用户的登录状态或购物车内容。常常需要在客户端和服务器之间维护一定的状态。为此,常用的方法包括使用 Cookie、在 URL 中添加参数或者使用其他服务器端的状态管理技术。

  1. Cookie 曾经是最常用的状态管理技术之一, 是一种存储在客户端浏览器它包含了一些与用户相关的信息,例如登录凭证、语言偏好等。当客户端发送请求时,Cookie 会被附加到 HTTP 请求头中发送给服务器,从而使得服务器能够识别用户的身份和状态。服务器可以通过设置 Cookie 的过期时间和作用域来控制其生命周期和使用范围。
  2. Session(会话):也是非常常见的状态管理技术。它可以在服务器端存储用户的状态信息,并通过一个唯一的标识符与用户进行关联。Session 可以在多个请求之间共享和保持用户的状态信息,因此在需要跨请求保持状态时非常有用。

Cookie和Session之间的关系是:
服务器在创建Session时,会为该Session生成一个唯一的Session ID,并将该Session ID存储在Cookie中。
浏览器在接收到响应时,会将该Cookie保存在本地,并在随后的请求中自动携带该Cookie。
服务器通过解析Cookie中的Session ID。来识别和管理用户的会话状态。
这也是之前服务器客户端组合使用的状态管理技术。

  1. Token(令牌):令牌是一种轻量级的状态管理方式,常用于身份验证和授权。服务器生成一个加密的令牌,并将其发送给客户端。客户端在后续的请求中携带这个令牌,服务器通过解码和验证令牌来识别和验证用户的身份和权限。
  2. 数据库存储:服务器可以将用户的状态信息存储在数据库中。每个用户都有一个唯一的标识符,该标识符与其状态信息在数据库中关联。服务器通过标识符来检索和更新用户的状态。 虽然与其他技术相比较复杂,但它可以在高并发和分布式环境下更可靠地管理状态。
  3. 缓存:服务器可以使用缓存来存储一些临时的状态信息。缓存通常存储在服务器内存中,以提高读取和写入状态的性能,但也可能导致数据不一致性和过期问题。

以上三种是在微服务中更常用的状态管理技术,
他们的核心是:如何可以被各个微服务验证和解析,实现统一的身份验证和授权
它们也能进行更多的拓展,但这里就不在展开了。

  1. URL 重写,也称为 URL 重定向。在这种技术中,服务器将状态信息添加到 URL 中,例如在购物车页面中添加商品时,服务器会将商品 ID 添加到 URL 中,从而使得下一次请求能够正确地识别购物车中的内容。由于其安全性和易受攻击的性质,它已经不再是常用的状态管理技术。

这些技术可以根据具体的应用场景和需求进行选择和组合。它们都可以在无状态的HTTP协议中实现一定程度的状态管理,以支持用户认证、会话管理和其他功能的实现。

有一个有意思的现象,随着时间和技术的发展,服务器承载的应用架构选用在国内有几个阶段,从最开始的单体,到微服务,再到集群化,最后回到单体。这种应用架构变化的发生,随着改变而更改的上述技术的又是怎样变化的呢?有兴趣去探寻一下吧。

你可能感兴趣的:(http,http,网络协议)