分布式Session共享解决方案

一、分布式Session一致性

分布式Session一致性说白了就是服务器集群Session共享的问题。

Session

  1. Session是客户端与服务器通讯会话跟踪技术,服务器与客户端保持整个通讯的会话基本信息。
  2. 过程:客户端在第一次访问服务端的时候,服务端会响应一个sessionId并且将它存入到本地cookie中,客户端再次访问时就会将cookie中的sessionId放入到请求头中去访问服务器。如果通过这个sessionid没有找到对应的数据,那么服务器会创建一个新的sessionid并且响应给客户端。

二、分布式Session存在的问题以及解决方案

1. 存在的问题

Session是服务器用来保存用户操作的一系列会话信息,由Web容器进行管理。单机情况下,不存在Session共享的情况,分布式情况下,如果不进行Session共享会出现请求落到不同机器要重复登录的情况。

假设第一次访问服务A生成一个sessionid并且存入cookie中,第二次却访问服务B客户端会在cookie中读取sessionid加入到请求头中。如果在服务B通过sessionid没有找到对应的数据,那么它创建一个新的并且将sessionid返回给客户端,这样并不能共享我们的Session无法达到我们想要的目的。

2. 解决方案

  1. 使用cookie来记录session(很明显这种不安全的操作并不可靠)
    缺点:受cookie大小的限制,能记录的信息有限;每次请求响应都需要传递cookie,影响性能,如果用户关闭cookie,访问就不正常。

  2. 使用Nginx中的ip绑定策略,同一个ip只能在指定的同一个机器访问(不支持负载均衡)

  3. 使用tomcat内置的session同步实现session共享
    优点:配置简单
    缺点:如果机器多了,就会出现大量的网络传输,甚至容易引起网络风暴,导致系统崩溃,只能适合少数的机器。


    分布式Session共享解决方案_第1张图片
    image
  4. 基于JWT(JSON WEB TOKEN)代替的方案:使用token代替session


    分布式Session共享解决方案_第2张图片
    image
  5. 我们使用spring-session以及集成好的解决方案,存放在数据库中。
    实现原理:
    就是当Web服务器接收到http请求后,当请求进入对应的Filter进行过滤,将原本需要由web服务器创建会话的过程转交给Spring-Session进行创建,本来创建的会话保存在Web服务器内存中,通过Spring-Session创建的会话信息可以保存第三方的服务中,如:redis,mysql等。Web服务器之间通过连接第三方服务来共享数据,实现Session共享!


    分布式Session共享解决方案_第3张图片
    image

你可能感兴趣的:(分布式Session共享解决方案)