写点什么

微服务下的分布式 session 管理

  • 2021 年 11 月 12 日
  • 本文字数:1831 字

    阅读完需:约 6 分钟

今天老顾带着大家了解一下 session 会话在微服务架构中采用的技术方案,以及 企业应用中需要注意的问题。

session 作用

我们知道在 web 应用中,web 服务器和浏览器之间是用 http 协议进行通信的,而 http 协议是无状态的,也就是每个请求都是独立的。如:用户看一条 A 新闻,不管是谁看到的都是一模


【一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
复制代码


一样的新闻。也就是跟用户是谁没有任何关系


但业务自身的发展,需要把不同的内容展示给不同的用户,即信息和用户状态关联起来。如:历史阅读列表---列出用户之前看的新闻。这个需求就是跟用户相关,每个用户看到的历史阅读列表都是不一样的。


Session 的产生就是为了解决这个问题,把服务器和客户端之间进行状态保持的解决方案。

session 原理


浏览器在第一次访问 web 服务器,服务器端会响应一个 sessionId,并且把这个 sessionId 传输给浏览器,并以 cookie 保存 sessionId 到浏览器本地


以后的访问会把这个 cookie 的 sessionId 以请求头的方式传给服务器,这样服务器就可以拿着这个 sessionId 进行查找,服务器中有没有此 sessionId 对应的用户,这样就能标识出哪个用户,如果有用户相关的业务,就是利用这个 sessionId 返回用户相关的业务


本质就是浏览器客户端本地保存了 sessionId服务器端保存了 sessionId 和用户信息映射,这样就实现了 web 应用有状态化。

单体架构


在早期的单体架构中,也就是只有一台 web 服务器,虽然在 web 应用中也进行的分层设计,但其实本质是在代码逻辑级别,本身还是一个应用而已(或者说就是一个 war/jar 包)。


这个时期的 session 都是保存在本地的 web 服务器内存中,非常简单就能保持用户状态。

集群/分布式架构

随着业务的复杂度升高,和对应用性能、高可用的需求,系统演变成了集群和分布式架构



集群架构可以看服务器 A 和服务器 B,部署同一个应用 A,就是为了提升性能和高可用目的;服务器 C 是部署了另一个应用 B,代表系统不是单一业务,而是多个应用集合的,即分布式架构。


这个架构中,我们之前的 session 方案就会有问题,因为服务器端的 session 是存放在本地内存中的。请看下面的流程


1、用户 A 第一次访问系统,由负载均衡器映射到服务器 A 中 2、会在服务器 A 的本地内存中,存放着 session3、用户 A 第二次访问系统,又被随机分配到了服务器 B 中 4、但服务器 B 中是没有存放用户 A 的 session 的,所以此 sessionId 在服务器 B 中找不到对应的 session,就会以为用户没有登录,就会引导用户去登录 5、这样就导致 session 不一致的问题

session 复制

session 复制方案是一个服务器端的方案,对客户端是透明的,客户端不需要改变什么。看架构图



这个方案本质是利用了应用服务器自身的特性,如:tomcat。修改一下 tomcat 的配置文件,就是让应用服务器之间进行 session 复制,这样就可以达到每个服务器都有一样的 session。


这个方案 2-3 个服务器还行,但服务器一旦多起来,就会有问题。1、session 之间的复制就会占用很大的网络带宽 2、session 复制是有时间延迟的 3、服务器的内存是有限的,代表着 session 存放是有限的

session 粘性

这个方案就利用负载均衡器的特性,把同一个浏览器的同一个用户都定向发送到同一个服务器上。看架构图



上图的核心思路,用户甲访问系统被负载均衡器一直分配到服务器 A 上,这样也就保证了用户一直在同一个服务器中进行查找 session,保证了用户 session 一致性


不过此方案也存在一些问题:


1、服务器的内存是有限的,代表着 session 存放是有限的 2、这个方案适用集群架构,但不适用分布式架构 3、一旦服务器拓展数量,session 就会出现混乱

cookie 方案

之前的方案都是在服务器端进行改造的,cookie 方案是客户端的方案,就是把 session 信息保存到 cookie 中,即用户信息保存到 cookie 中,这样就不需要服务器保存 session(用户信息)了。每次请求时,把此 cookie 传给服务器端,这样服务器端就知道是哪个用户了


此方案比较实现比较简单,而且还不占用服务器端的内存资源。但是此方案的问题很大哦。


1、cookie 在客户端是有限的,存储容量也是很小的 2、安全是很有问题的,因为保存在本地,很容易被人拿到

session 外部存储

之前的服务器端改造的方案,**session 都是存储到本地内存中的,导致一些问题。**此外部存储就是把思路进行改变,让 session 的存储与应用服务器隔离出来,看架构图



这个方案的核心就是把 session 的存储的地方改造到一个独立的媒介中,这样就不需要和应用服务器耦合了,客户端传入 sessionId 时,用户信息的映射关系直接到这个独立媒介中去查找。

数据库存储

评论

发布
暂无评论
微服务下的分布式session管理