一、Session 介绍


Session 一词直译为 “会话”,意指有始有终的一系列动作/消息。Session 是 Web 应用蓬勃发展的产物之一。在 Web 应用中隐含有“面向连接”和“状态保持”两个含义,同时也指代了 Web 服务器与客户端之间进行状态保持的解决方案。
在 Web 应用诞生之初,应用服务器与浏览器之间仅仅只是基于 HTTP 协议进行通信。而 HTTP 协议是无状态的,也就是说每一个请求之间都是相互独立的,互不关联。但是随着应用业务的复杂,服务器需要按照用户的一系列业务操作向用户提供某些特定的、按需的内容。这时候就需要通过保存用户状态,将用户的请求关联起来。Session 管理正是这一问题的解决方案。

二、单体架构


早期的 Web 应用基本都采用的是单体架构,也就是把一个使用了分层架构的 Web 应用部署在单节点 Web 服务器上。虽然采用了分层架构,将整个应用分为了表现层、业务逻辑层和数据访问层,每一层各司其职,让 Web 应用的各个方面都有所改善。但这样的分层只停留于逻辑层面。由于将所有应用都部署在单个服务器节点上,随着应用的不断迭代开发,单体应用将会发展成巨石应用,臃肿不堪,难以维护。
在这样的单体架构中,由于所有的用户请求都是由这个唯一的服务器进行响应处理,所以只需要把保存了用户信息和状态的 Session 对象,存放在应用服务器的内存中,就能轻松地达到保持用户状态的目的。

三、集群和分布式架构


随着 Web 应用的发展,用户访问量和业务复杂度与日俱进,应用的性能和代码的维护难度成为应用的瓶颈,为了突破瓶颈,开发者开始尝试在应用架构中引入负载均衡器,继而演化出了集群分布式两种架构类型。

集群:是指在多个服务器节点上部署相同的应用,例如上图中的服务器B和服务器C,然后通过负载均衡的分发功能,把用户请求分发到集群中的任意一个服务节点上。如果有更大的访问量,只要向集群中增加服务器节点,就能改善压力。集群既能保证应用的高可用,又能提高应用的负载能力。

分布式:是把原来的单体架构应用,通过分而治之的手段,按照业务功能,切分成一些小的模块应用,部署在不同服务器节点上,例如上图中的服务器A和服务器B。然后通过负载均衡和门户应用整合起来,组成一个完成的应用。

集群和分布式架构中,后端包含了多个服务器节点。当用户进行登录时,登录请求是由其中一个服务器节点进行响应,而后续的用户请求将可能被负载均衡器分发到其他服务器节点,这时候就可能因为这个服务节点上没有用户 Session ,导致服务器判定用户是未登陆状态,让用户重新登录。所以,在集群和分布式架构中,必须保证用户进行登录后,架构中的所有服务器节点都能共享 Session 数据,常用的 Session 管理方案有如下3种:

方案一:将 Session 对象保存在 Cookie,然后存放在浏览器端


每次浏览器向服务器发送请求的时候,都会把整个 Session 对象放在请求里一起发送到服务器,以此来实现 Session 共享。这种方法实现起来特别方便,但是由于 Cookie 的存储容量较小,且不安全。所以这个方案只适用于 Session 数量小和安全性不高的场景。

方案二:Session 复制


部分应用服务器能够支持 Session 复制功能,例如 Tomcat。用户可以通过修改配置文件,让应用服务器进行 Session 复制,保持每一服务节点的 Session 数据达成一致。但是这个方案的实现依赖于应用服务器。当应用被大量用户访问时,每个服务器都需要有一部分内存用来存放 Session,同时因为大量 Session 通过网络传输进行复制,将会占用网络资源,这可能因为网络延迟导致程序异常。

方案三:Session 粘滞


利用负载均衡的分发能力,将同一浏览器上同一用户的请求,都定向发送都固定的服务器上,让这个服务器处理该用户的所有请求,这样只要这个服务器上保存的用户 Session,就能保证用户的状态一致性。但是这个方案依赖于负载均衡器,而且只适用于横向扩展的集群场景,不能满足分布式场景。同时,当指定的服务器宕机后,会session 信息丢失的情况。也无法利用 Nginx负载均衡,提高服务器的利用率,而且如果 Nginx不是放在最前面一层,那么拿到的就可能不是用户的真实ip,那么转发到的服务器就会不一样。

1 upstream backend{
2 server 127.0.0.1:8001;
3 server 127.0.0.1:8002;
4 ip_hash;
5 }

方案四:Session 集中管理方案选择


这里简单介绍下 Spring Session。Spring Session 是 Spring 提供的一套 Session 管理方案,通过一个 SessionFilter 将所有访问应用的请求都拦截下来,然后使用 Request 包装类接管 Session 管理。将 Session 从Web 容器中拦截下来后,Session 会被存储在独立的存储服务器中。目前支持多种形式的 Session 存储器:Redis、Database、MogonDB等。当 Request 进入 Web 容器,根据 Request 获取 Session 时,由 Spring Session 负责从存储器中获取 Session,如果存在则返回,如果不存在则创建并持久化至存储器中。Spring Session不与应用服务器耦合,能使用于常规服务器。同时还提供了浏览器下对同一应用存储多个 Session 等功能。

【1】引入Spring-Session 相关 jar 包:

1 <!-- redis -->
2 <dependency>
3 <groupId>org.springframework.session</groupId>
4 <artifactId>spring-session-data-redis</artifactId>
5 <version>1.3.1.RELEASE</version>
6 <type>pom</type>
7 </dependency>

【2】 在 web.xml中,加入关于session的过滤器,只有这样session才会被 Redis所操纵:就实现了 Redis对 session的管理。

1 <filter>
2 <filter-name>springSessionRepositoryFilter</filter-name>
3 <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
4 </filter>
5 <filter-mapping>
6 <filter-name>springSessionRepositoryFilter</filter-name>
7 <url-pattern>/*</url-pattern>
8 </filter-mapping>

分布式 WEB应用中Session(会话管理)的变迁之路的更多相关文章

  1. JavaWeb中Session会话管理,理解Http无状态处理机制

    注:图片如果损坏,点击文章链接:https://www.toutiao.com/i6512955067434271246/ 1.<Servlet简单实现开发部署过程> 2.<Serv ...

  2. JavaWeb中Cookie会话管理,理解Http无状态处理机制

    注:图片如果损坏,点击文章链接:https://www.toutiao.com/i6512995108961387015/ 1.<Servlet简单实现开发部署过程> 2.<Serv ...

  3. Java中的会话管理——HttpServlet,Cookies,URL Rewriting(译)

    参考谷歌翻译,关键字直接使用英文,原文地址:http://www.journaldev.com/1907/java-session-management-servlet-httpsession-url ...

  4. session会话管理

    session会话和cookie一起被称为会话跟踪技术,主要通过保存在服务器端的session数据和客户端浏览器的cookie数据共同完成用户访问服务器的足迹记录. 1. 什么是会话 会话sessio ...

  5. Java 中的会话管理—— HttpServlet,Cookies,URL Rewriting(转)

    索引 1.什么是 Session? 2.Java 中的会话管理—— Cookie 3.Java Servlet 中的 Session —— HttpSession 理解 JSESSIONID Cook ...

  6. .net用SQL Server进行session会话管理

    保存在内存中的session经常由于dll的变动导致丢失.有一种方法可以长期保存session,那就是session的SqlServer模式. ASP.NET允许将会话数据存储到一个数据库服务器中,方 ...

  7. 下面哪项技术可以用在WEB开发中实现会话跟踪实现?

    下面哪项技术可以用在WEB开发中实现会话跟踪实现? A:session B:Cookie C:地址重写 D:隐藏域 答案:ABCD 会话跟踪是一种灵活.轻便的机制,它使Web上的状态编程变为可能. H ...

  8. 分布式web架构中对session同步的常用处理方法以及优缺点

    写在前面 最近在读一本来自淘宝技术团队大牛的书,名字叫<大型网站系统与Java中间件实践>.开篇的章节详细地介绍了一个网站架构由小变大不断演进的过程,其中从单机架构升级到集群架构的过程中着 ...

  9. 基于nginx tomcat redis分布式web应用的session共享配置

    一.前言 nginx 作为目前最流行的开源反向代理HTTP Server,用于实现资源缓存.web server负载均衡等功能,由于其轻量级.高性能.高可靠等特点在互联网项目中有着非常普遍的应用,相关 ...

  10. Servle中的会话管理

    最近整理了下会话管理的相关笔记,以下做个总结: 一.会话管理(HttpSession) 1.Web服务器跟踪客户状态的四种方法: 1).使用Servlet API的Session机制(常用) 2).使 ...

随机推荐

  1. Write down for Segments, Extents, and Blocks

    Segments, Extents, and Blocks(段.区.块) • Segments exist in a tablespace. • Segments are collections of ...

  2. Cubemx 生成工程代码失败的原因

    折腾了好久(躺)翻了很多解答试了试终于捣鼓正常了,就在这里汇总一下看到过的问题 1.文件名.工程名或者工程文件路径/库路径上有中文名 2.Cubemx的版本过高 3.java环境的版本不适配 4.可能 ...

  3. echarts 图表 tooltip提示框,formatter自定义

    自定义图表提示框样式, 自定义原因:series中有多个数据样式,那么提示框会展示多条. tooltip: { formatter(params) { let circle = `<span s ...

  4. 个人PSP(四则运算)升级

    源代码管理平台Gitbee地址:https://gitee.com/chen-haijin/ 1.题目要求:能自动生成小学四则运算题目,且每一道题目的运算结果不能为负.除了支持整数运算外,还要支持真分 ...

  5. win10 wampserver升级 php7.0至 php7.2

    1.去官网下载php7.2 下载地址: https://windows.php.net/download#php-7.0 2.下载安装 visual c++ 2017 或  visual c++ 20 ...

  6. IntelliJ IDEA 2021.2 暴力破解

    注意 本教程适用于 IntelliJ IDEA 2021.2 以下所有版本,请放心食用~ 本教程适用于 JetBrains 全系列产品,包括 Pycharm.IDEA.WebStorm.Phpstor ...

  7. django_ORM基础字段和选项

    一.修改ORM 1.任何关于表结构的修改,务必在对应模型类上修改. 2.在上一篇博文中,创建了bookstore_book表,如果需要再添加一个名为info(varchar 100)的字段,则需要如下 ...

  8. npm publish命令

    npm publish . 注意后面有个点,否则会报错

  9. Angular Material TreeTable Component 使用教程

    一. 安装 npm i ng-material-treetable --save npm i @angular/material @angular/cdk @angular/animations -- ...

  10. DOS基本命令与快捷键

    DOS命令 #查看当前盘下的所有目录 dir #切换盘符 直接盘符名称: 例如切换D: #切换目录 cd 目录名称 #清屏 cls #退出 exit #创建 cd>文件名称.文件后缀 #查询电脑 ...