【REST系列】关于session不遵守REST架构风格‘无状态约束‘的解决方案

这是我参与8月更文挑战的第17天,活动详情查看:8月更文挑战

【序】

  • 众所周知,REST约束了 ==服务器需要是无状态的== (REST知识补充->详解REST和RESTful)
  • REST是于2000年提出的架构风格,session的提出应该早于REST(通过维基百科查询cookie的历史,写到cookie的技术专利申请于1995年)。
  • session是有状态的,为了解决HTTP的无状态特性带来的不便:在当时看来,HTTP的无状态确实可能有不便之处,因为即使在现在的小型系统中,session也经常被使用。

现在还是有大量系统在使用着session:这对于简单系统(单体架构)来说并无大碍,甚至可能开发起来更为方便;

但是在分布式系统做水平拓展时,由于状态只存在于一台服务器,就会造成找不到对应状态的问题

一、将有状态转为无状态

通过将状态传递到一个单独可共享的地方,独立于server存在。

比如传递到redis等,以使server保持”无状态”

推荐这篇文章 集群/分布式环境下5种共享session处理策略
其中的 session共享机制-非粘性session处理方式session持久化到数据库 属于这种方案

二、保持有状态

解决方案是:分布式共享session

即session还是存在于服务器中
可通过绑定让过来的请求始终发到存有其状态的服务器
或通过复制,让所有的服务器都保存状态

依旧推荐这篇文章 集群/分布式环境下5种共享session处理策略
其中的 粘性session服务器session复制session共享机制-粘性session处理方式terracotta实现session复制 都属于这种方案

【附】推荐 无状态鉴权的最优做法:jwt

鉴权是几乎每个系统都会做的事

在没有jwt之前,我们通常会采取以上提到的解决方案,服务器有状态 或 将状态独立于服务器

有了jwt之后,鉴权变得更加简单起来
jwt提供的轻量级的授权和身份认证规范,可实现无状态、分布式的Web应用授权

贴一个不错的文章链接,这里就不做赘述:JWT实现无状态登录

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享