一、分布式Session一致性
分布式Session一致性说白了就是服务器集群Session共享的问题。
Session
- Session是客户端与服务器通讯会话跟踪技术,服务器与客户端保持整个通讯的会话基本信息。
- 过程:客户端在第一次访问服务端的时候,服务端会响应一个sessionId并且将它存入到本地cookie中,客户端再次访问时就会将cookie中的sessionId放入到请求头中去访问服务器。如果通过这个sessionid没有找到对应的数据,那么服务器会创建一个新的sessionid并且响应给客户端。
二、分布式Session存在的问题以及解决方案
1. 存在的问题
Session是服务器用来保存用户操作的一系列会话信息,由Web容器进行管理。单机情况下,不存在Session共享的情况,分布式情况下,如果不进行Session共享会出现请求落到不同机器要重复登录的情况。
假设第一次访问服务A生成一个sessionid并且存入cookie中,第二次却访问服务B客户端会在cookie中读取sessionid加入到请求头中。如果在服务B通过sessionid没有找到对应的数据,那么它创建一个新的并且将sessionid返回给客户端,这样并不能共享我们的Session无法达到我们想要的目的。
2. 解决方案
使用cookie来记录session(很明显这种不安全的操作并不可靠)
缺点:受cookie大小的限制,能记录的信息有限;每次请求响应都需要传递cookie,影响性能,如果用户关闭cookie,访问就不正常。使用Nginx中的ip绑定策略,同一个ip只能在指定的同一个机器访问(不支持负载均衡)
-
使用tomcat内置的session同步实现session共享
优点:配置简单
缺点:如果机器多了,就会出现大量的网络传输,甚至容易引起网络风暴,导致系统崩溃,只能适合少数的机器。
-
基于JWT(JSON WEB TOKEN)代替的方案:使用token代替session
-
我们使用spring-session以及集成好的解决方案,存放在数据库中。
实现原理:
就是当Web服务器接收到http请求后,当请求进入对应的Filter进行过滤,将原本需要由web服务器创建会话的过程转交给Spring-Session进行创建,本来创建的会话保存在Web服务器内存中,通过Spring-Session创建的会话信息可以保存第三方的服务中,如:redis,mysql等。Web服务器之间通过连接第三方服务来共享数据,实现Session共享!