SpringBoot 分布式session实现


1. 什么是分布式session

在集群环境中,不得不考虑的一个问题是用户访问产生的session如何处理。如过不做任何处理,用户将出现频繁俸禄的现象,比如集群中存在A、B两台服务其,用户第一次访问网站时,Nginx通过负载均衡机制将用户请求转发到A节点,这时A节点就会给用户创建一个session。当用户第二次发送请求时,Nginx将其转发到B节点,这时B并不存在Session,所以就将用户踢回登陆页面。

2. 分布式session的常用方式

  • session Replication (session复制)

    原理:任何一个服务器节点上的session发生改变,该节点会把session的所有内容序列化,然后广播给所有其他节点,以此来保证Session同步。这种方式需要web容器支持分布式。
  • 粘性session

    原理: 在用户第一次请求时,Nginx将用户请求转发到A节点,那么用户以后的每次请求都会转发到A节点,相当于把用户和A节点绑定在一起。

    优点: 不需要对session做任何处理

    缺点: 缺乏容错性,当A节点发生故障,用户请求被转移到B节点,session将失效。需要Nginx添加配置支持粘性session
upstream mycluster{
#这里添加的是上面启动好的两台Tomcat服务器
ip_hash;#粘性Session
server 192.168.22.229:8080 weight=1;
server 192.168.22.230:8080 weight=1;
}
  • session集中式共享

    原理: web容器不对session做任何存储,session读写都直接从Redis等分布式缓存中拿Session信息。

    有点: 可容错,session实时响应。

    缺点: 实现复杂、稳定性依赖于缓存的稳定性、Session信息放入缓存时要有合理的策略写入。

3. SpringBoot 分布式session实现(以redis为例)

  • 项目中使用:

    pom.xml
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>

bootstrap.yml

spring:
session:
store-type: redis
redis:
namespace: org.dragonfei:${spring.application.name}
  • Spring-session 高层抽象结构:

  • spring-session无缝替换request的原理:

自定义Filter,实现doFilter方法;

继承HttpServletRequestWrapper、HttpServletResponseWrapper类,重写getSession等相关方法;

将自定义的request和response对象,传递到过滤器链;

把该filter配置到过滤器链的第一个位置上。

  • spring-session类结构图:

  • 核心实现:



    最关键的数据结构,为hmap的结构,sessionId:{key1:"bb",key2:"cc"}

SpringBoot 分布式session的更多相关文章

  1. springboot集成redis(mybatis、分布式session)

    安装Redis请参考:<CentOS快速安装Redis> 一.springboot集成redis并实现DB与缓存同步 1.添加redis及数据库相关依赖(pom.xml) <depe ...

  2. Redis-基本概念、java操作redis、springboot整合redis,分布式缓存,分布式session管理等

    NoSQL的引言 Redis数据库相关指令 Redis持久化相关机制 SpringBoot操作Redis Redis分布式缓存实现 Resis中主从复制架构和哨兵机制 Redis集群搭建 Redis实 ...

  3. SpringBoot搭建基于Apache Shiro+Redis的分布式Session共享功能

    我们在上一遍文档中已经完成了Shiro验证功能.(http://www.cnblogs.com/nbfujx/p/7773789.html),在此基础上我们将完成分布式Session共享功能. Red ...

  4. 补习系列(15)-springboot 分布式会话原理

    目录 一.背景 二.SpringBoot 分布式会话 三.样例程序 四.原理进阶 A. 序列化 B. 会话代理 C. 数据老化 小结 一.背景 在 补习系列(3)-springboot 几种scope ...

  5. Spring Boot(十一)Redis集成从Docker安装到分布式Session共享

    一.简介 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API,Redis也是技术领域使用最为广泛的存储中间件,它是 ...

  6. 分布式Session共享解决方案

    分布式Session解决方案 Author:SimpleWu 分布式Session一致性? 说白了就是服务器集群Session共享的问题 Session的作用? Session 是客户端与服务器通讯会 ...

  7. Spring boot整合redis实现shiro的分布式session共享

    我们知道,shiro是通过SessionManager来管理Session的,而对于Session的操作则是通过SessionDao来实现的,默认的情况下,shiro实现了两种SessionDao,分 ...

  8. SpringBoot分布式篇Ⅷ --- 整合SpringCloud

    SpringCloud是一个分布式的整体解决方案.Spring Cloud为开发者提供了在分布式系统(配置管理,服务发现,熔断,路由,微代理,控制总线,一次性token,全局锁,leader选举.分布 ...

  9. 分布式session的实现

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

随机推荐

  1. 防F12审查元素扒代码:按下F12关闭当前页面

    有的时候我看别人的网站的某个部分做的比较好我都会通过按F12审查元素来查看别人的代码,那么如果不然别人查看自己网站的代码呢.一段JavaScript代码即可实现上述功能,插入到footer.php或者 ...

  2. Object源码解析(JDK1.8)

    package java.lang; public class Object { /** * 一个本地方法,具体是用C(C++)在DLL中实现的,然后通过JNI调用 */ private static ...

  3. Java面试宝典-2017

    Java面试宝典2017版 一. Java基础部分........................................................................... ...

  4. Java读取properties文件连接数据库

    先说为什么要有这种东西,或者我们为什么要用这种方式来写,先看经常用的方法,我们经常写的 package util; import java.sql.Connection; import java.sq ...

  5. 2017总结&2018展望

    2017已逝2018已来,是时候放下包袱来好好回顾下2017做了什么,有什么收获,遗憾之处的原因是什么.2018应该怎么做才能让自己满意,才能少一些遗憾. 2017 工作 工作中所参与的项目是一个直播 ...

  6. CXF-01: WebService的第一个例子

    HelloWorld.java: package com.war3.ws; import javax.jws.WebService; @WebService public interface Hell ...

  7. Linux 绝对路径与相对路径

    根据文件名写法的不同,可将所谓的路径(path)定义为绝对路径(absolute)和相对路径(relative). 绝对路径:由根目录(/)开始写起的文件名或目录名称. 相对路径:相对于当前路径的文件 ...

  8. /var/spool/clientmqueue目录下存在大量文件的原因及解决方法

    问题现象:linux操作系统中的/var/spool/clientmqueue/目录下存在大量文件.原因分析: 系统中有用户开启了cron,而cron中执行的程序有输出内容,输出内容会以邮件形式发给c ...

  9. Sublime Text3下使用Python,REPL的安装与快捷键设置方法

    前提条件:连接外网   1.安装管理插件(CTRL+SHIFT+P),找到Package Control:install package一项,回车后继续选择SublimeREPL插件,进行安装:   ...

  10. Leetcode 28——Implement strStr()

    Implement strStr(). Return the index of the first occurrence of needle in haystack, or -1 if needle ...