1、cookie和session

  • cookie和session都是用来跟踪用户身份信息的会话方式。
  • cookie存储的数据保存在本地客户端,用户获取容易,但安全性不高,存储数据小。
  • session存储的数据保存在服务器,用户不易获取,安全性较高,存储数据较大。

通常情况下,服务器将用户信息通过session的方式保存在服务器,然后将sessionId返回给客户端cookie,客户端进行下次请求时,就可在cookie中带上sessionId,服务器通过sessionId,就可以在服务器内存中找到对应的session对象,获取当前用户的信息。

流程可如下所示:

2、背景介绍

传统项目中,单服务器场景,服务器的session对象保存在本地内存,浏览器的每次请求都会打到该服务器上,所以,只要session没过期,一定能够获取到session对象。

但在多服务器场景,或微服务项目中,一个工程有多个实例。浏览器的多次请求,经过nginx反向代理后,有可能就会请求到不同的服务器上。场景如下所示:

3、解决方案

3.1、session复制

session同步,让集群下的服务器进行session同步,一种传统的服务器集群session管理机制,常用于服务器不多的集群环境。

集群下,进行session同步的服务器的session数据是相同的,任何一台服务器挂掉,都不会丢失用户的session数据。

但是,session同步是通过广播的方式来异步同步session,会通过网络进行数据传输。当服务器越来越多时,session同步会占用大量带宽,并且每台服务器需要存储的session数据也越来越大,占用大量服务器内存。

所以,session同步策略一般适用于集群服务器不多的场景。

3.2、客户端存储(不推荐)

直接将session数据存储到浏览器的cookie中,浏览器在发起请求时,通过cookie将session数据发送给客户端。因为cookie不安全,易获取,所以通常用来存储一些不敏感的信息。

但是,由于cookie不安全,且每次http请求,都会携带存储在cookie中的完整用户信息,会增大网络传输开销,并且cookie有存储大小限制。所以基本上不会使用这种方式。

3.3、Hash一致性

修改nginx的负载均衡配置,设置为ip-hash策略,将客户端与服务器进行绑定,让来自同一ip的请求,全都转发到同一台服务器。

此方案配置简单,但有一台服务器挂掉之后,该服务器上的session信息将全部丢失,与该服务器绑定的客户端,必须得重新登录。并且在进行水平扩展时,会重新对客户端ip进行hash操作,部分ip会被重新映射服务器。

# 配置负载均衡服务器组名称和地址
upstream web_server {ip_hash;server 192.168.12.36;server 192.168.12.37;server 192.168.12.38;
}# nginx路由配置
server {listen       8080;server_name  localhost;location / {proxy_pass http://web_server;}
}

3.4、基于Redis的分布式session(推荐)

将集群下所有服务器的session都存储到redis集群中。

直接使用Spring封装的Spring Session,引入相关依赖,使用简单,session数据保存在redis中,无缝接入,无安全隐患;且Redis也可做主从集群架构,方便管理。唯一的缺点是,服务器需要与Redis做一次网络交互,多了点网络开销。

3.4.1、引入相关依赖

<dependency><groupId>org.springframework.session</groupId><artifactId>spring-session</artifactId>
</dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

3.4.2、Java 配置

@Configuration
@EnableRedisHttpSession
public class Config {@Beanpublic LettuceConnectionFactory connectionFactory() {return new LettuceConnectionFactory(); }
}

3.4.3、Redis配置

spring.redis.host=localhost
spring.redis.port=6379
spring.redis.password=123456
spring.redis.database=0

以上内容为个人学习理解,如有问题,欢迎在评论区指出。

分布式session的4种解决方案相关推荐

  1. 分布式session的6种解决方案

    先来复习三个基础问题 : Q1 . session什么时候创建 ? 一个常见的错误是在客户端请求到达的时候就被创建 , 然而实际上是直到某服务端程序(如servlet)调用HttpServletReq ...

  2. 分布式Session的几种实现方式

    一.分布式Session的几种实现方式 1.基于数据库的Session共享 2.基于NFS共享文件系统 3.基于memcached 的session,如何保证 memcached 本身的高可用性? 4 ...

  3. 分布式事务的五种解决方案

    分布式事务的五种解决方案 分布式事务 微服务分布式服务问题 什么是分布是事务 分布式事务应用在哪些场景 分布式事务解决方案 1.基于XA协议的两阶段提交(2PC) 2.代码补偿事务(TCC) 3.本地 ...

  4. 管理分布式session的四种方式。

    应用服务器的高可用架构设计最为理想的是服务无状态,但实际上业务总会有状态的,以session记录用户信息的例子来讲,未登入时,服务器没有记入用户信息的session访问网站都是以游客方式访问的,账号密 ...

  5. 分布式事务详解【分布式事务的几种解决方案】彻底搞懂分布式事务

    文章目录 一.基本概念 什么是事务 本地事务 分布式事务 分布式事务产生的场景 二.分布式事务基础理论 CAP理论 CP - Consistency/Partition Tolerance AP - ...

  6. 管理分布式session的四种方式

    应用服务器的高可用架构设计最为理想的是服务无状态,但实际上业务总会有状态的,以session记录用户信息的例子来讲,未登入时,服务器没有记入用户信息的session访问网站都是以游客方式访问的,账号密 ...

  7. 基于Spring Session实现JIM分布式Session

    基于Spring Session实现JIM分布式Session 前引 在实际项目中,应用程序经常会以集群方式部署线上,一般来说无状态的应用程序是理想的部署方式,一旦应用程序拥有状态(比如Session ...

  8. php分布式session问题,分布式session一致性问题

    1,什么是session session 是客户端与服务器通讯会话技术,比如用户登陆,会将登陆之后,将用户信息存入在session中 2,session 的原理 3,简单的session 例子 @Re ...

  9. 4种分布式session解决方案

    cookie和session的区别和联系 cookie是本地客户端用来存储少量数据信息的,保存在客户端,用户能够很容易的获取,安全性不高,存储的数据量小 session是服务器用来存储部分数据信息,保 ...

最新文章

  1. 荣耀30pro系统_荣耀30 pro:正式再见!
  2. 测试php数字范围_你不知道的接口测试之拾遗
  3. win7计算机风格恢复,Win10怎么恢复Win7开始菜单风格?
  4. 在MAC Xcode下安装OpenCV
  5. JavaScript Document对象DOM
  6. 华为P50系列终于要来了!但最大问题却是...
  7. 超强干货素材!制作平面设计专辑模板
  8. Bailian4077 出栈序列统计【卡特兰数】(vijos P1122)
  9. ASP.NET MVC:mvc pattern
  10. php redis菜鸟教程,PHP 使用 Redis
  11. 灰色系统理论的介绍与解释
  12. oracle 取前行,【企业信息化研究所】TF-SWUFE Oracle Club抵着寒风前行—甲骨文俱乐部第九周分享会...
  13. CF 1056D Decorate Apple Tree
  14. 训练好的神经网络 如何预测_普通人如何拥有好声音 精简版入门训练方法总结...
  15. 选购发烧游戏台式计算机的内存储器,游戏发烧友福音 惠普暗影精灵5 Super游戏台式电脑评测...
  16. 多协议充电桩平台系统小程序方案
  17. “似水无形” 的小程序化
  18. 用js做一个数字华容道
  19. 【Baidu Apollo】5 预测
  20. MapReduce程序中的万能输入FileInputFormat.addInputPaths

热门文章

  1. Python 精美俄罗斯方块开源项目
  2. JavaScript获取时间
  3. 使用 Python 的 itchat 模块爬取微信好友信息
  4. 2019安恒杯一月新春贺岁赛writeup
  5. 儿童泡泡机上亚马逊CPC认证
  6. 适配器模式(图画版)
  7. 这个 'ip' 竟然把我搞蒙圈了……
  8. 什么是死锁?死锁产生的原因有哪些?
  9. 《和AI交朋友》教学设计——初识人工智能
  10. (五)嵌入式:设置UART波特率并实现转变字符串大小,实现人机交互