享学课堂特邀作者:老顾转载请声明出处!

前言

今天老顾带着大家了解一下session会话在微服务架构中采用的技术方案,以及 企业应用中需要注意的问题。

session作用

我们知道在web应用中,web服务器和浏览器之间是用http协议进行通信的,而http协议是无状态的,也就是每个请求都是独立的。如:用户看一条A新闻,不管是谁看到的都是一模一样的新闻。也就是跟用户是谁没有任何关系

但业务自身的发展,需要把不同的内容展示给不同的用户,即信息和用户状态关联起来。如:历史阅读列表---列出用户之前看的新闻。这个需求就是跟用户相关,每个用户看到的历史阅读列表都是不一样的。

Session的产生就是为了解决这个问题,把服务器和客户端之间进行状态保持的解决方案。

session原理

浏览器在第一次访问web服务器,服务器端会响应一个sessionId,并且把这个sessionId传输给浏览器,并以cookie保存sessionId到浏览器本地

以后的访问会把这个cookie的sessionId以请求头的方式传给服务器,这样服务器就可以拿着这个sessionId进行查找,服务器中有没有此sessionId对应的用户,这样就能标识出哪个用户,如果有用户相关的业务,就是利用这个sessionId返回用户相关的业务

本质就是浏览器客户端本地保存了sessionId服务器端保存了sessionId和用户信息映射,这样就实现了web应用有状态化。

单体架构

在早期的单体架构中,也就是只有一台web服务器,虽然在web应用中也进行的分层设计,但其实本质是在代码逻辑级别,本身还是一个应用而已(或者说就是一个war/jar包)。

这个时期的session都是保存在本地的web服务器内存中,非常简单就能保持用户状态。

集群/分布式架构

随着业务的复杂度升高,和对应用性能、高可用的需求,系统演变成了集群和分布式架构

集群架构可以看服务器A和服务器B,部署同一个应用A,就是为了提升性能和高可用目的;服务器C是部署了另一个应用B,代表系统不是单一业务,而是多个应用集合的,即分布式架构。

这个架构中,我们之前的session方案就会有问题,因为服务器端的session是存放在本地内存中的。请看下面的流程

1、用户A第一次访问系统,由负载均衡器映射到服务器A中
2、会在服务器A的本地内存中,存放着session
3、用户A第二次访问系统,又被随机分配到了服务器B中
4、但服务器B中是没有存放用户A的session的,所以此sessionId在服务器B中找不到对应的session,就会以为用户没有登录,就会引导用户去登录
5、这样就导致session不一致的问题

session复制

session复制方案是一个服务器端的方案,对客户端是透明的,客户端不需要改变什么。看架构图

这个方案本质是利用了应用服务器自身的特性,如:tomcat。修改一下tomcat的配置文件,就是让应用服务器之间进行session复制,这样就可以达到每个服务器都有一样的session。

这个方案2-3个服务器还行,但服务器一旦多起来,就会有问题。1、session之间的复制就会占用很大的网络带宽2、session复制是有时间延迟的3、服务器的内存是有限的,代表着session存放是有限的

session粘性

这个方案就利用负载均衡器的特性,把同一个浏览器的同一个用户都定向发送到同一个服务器上。看架构图

上图的核心思路,用户甲访问系统被负载均衡器一直分配到服务器A上,这样也就保证了用户一直在同一个服务器中进行查找session,保证了用户session一致性

不过此方案也存在一些问题:

1、服务器的内存是有限的,代表着session存放是有限的2、这个方案适用集群架构,但不适用分布式架构3、一旦服务器拓展数量,session就会出现混乱

cookie方案

之前的方案都是在服务器端进行改造的,cookie方案是客户端的方案,就是把session信息保存到cookie中,即用户信息保存到cookie中,这样就不需要服务器保存session(用户信息)了。每次请求时,把此cookie传给服务器端,这样服务器端就知道是哪个用户了

此方案比较实现比较简单,而且还不占用服务器端的内存资源。但是此方案的问题很大哦。

1、cookie在客户端是有限的,存储容量也是很小的
2、安全是很有问题的,因为保存在本地,很容易被人拿到

session外部存储

之前的服务器端改造的方案,session都是存储到本地内存中的,导致一些问题。此外部存储就是把思路进行改变,让session的存储与应用服务器隔离出来,看架构图

这个方案的核心就是把session的存储的地方改造到一个独立的媒介中,这样就不需要和应用服务器耦合了,客户端传入sessionId时,用户信息的映射关系直接到这个独立媒介中去查找。

数据库存储

存储媒介的选择之一就是数据库,就是把session信息存储到数据库中。

好处就是session持久化到数据库中,不会丢失。但性能比较差,因为session的访问是非常频繁的,会对数据库造成很大压力,

Memcache存储

此方案就是把session存储到memcache中,Memcache-Tomcat-Session就是利用tomcat实现session的集中化管理的开源方案,修改tomcat配置就行了,使用扩展的sessionManager替换tomcat默认的Session管理器。

memcache性能比较高,但此方案和tomcat强耦合了,不适合其他的应用服务器,如:jetty。而且memcache无持久化,一旦重启,session就丢失了

Redis存储

redis存储方案一般结合spring session方式,把session存储到redis中。

这个方案是spring提供的一套Session管理方案,通过一个SessionFilter将所有请求拦截下来,对session进行管理,此方案的好处就是不与应用服务器耦合,可以部署到任何web应用服务器中。redis也是高性能的缓存服务器,且可持久化。这个方案也是官方推荐的。

总结

到这里老顾已经介绍了常用的session管理方案,最终推荐的是spring session方式进行session管理,存储在redis中。小伙伴们看到这里是不是感觉蛮好了,可以在企业中进行应用了?

如果企业小,项目不复杂,是可以应用了。

但如果系统很复杂,有很多业务系统都是有session的,那么如何对session从业务角度进行管理呢?上面我们介绍cookie方案,小伙伴们有没有考虑到JWT Token方案,jwt方案又会怎么样?留下二个问题,请小伙伴们仔细思考下。请持续关注老顾的文章,谢谢!!!

asp.net session 如何知道是哪个浏览器客户端_微服务下的分布式session管理相关推荐

  1. 直接访问 可以拿到cookie 本地起的服务拿不到 cookie_微服务下的分布式session管理...

    享学课堂特邀作者:老顾转载请声明出处! 前言 今天老顾带着大家了解一下session会话在微服务架构中采用的技术方案,以及 企业应用中需要注意的问题. session作用 我们知道在web应用中,we ...

  2. asp.net session 如何知道是哪个浏览器客户端_小弟该如何复习 Java?

    本文同名博客老炮说Java:https://www.laopaojava.com/,每天更新Spring/SpringMvc/SpringBoot/实战项目等文章资料 1.面向对象的特征主要有哪些? ...

  3. 使用ASP.NET Core、Ocelot、MongoDB和JWT的微服务

    目录 介绍 开发环境 技术 体系结构 源代码 微服务 API网关 客户端应用 单元测试 使用健康检查进行监视 如何运行应用程序 如何部署应用程序 进一步阅读 本文显示了一个使用ASP.NET Core ...

  4. 微服务服务器集群Session管理演进史

    点击上方"JavaEdge",关注公众号 设为"星标",好文章不错过! 应用服务器的高可用设计主要基于服务无状态这一特性,但事实上,业务总 是有状态: 在电商网 ...

  5. 使用Spring Session做分布式会话管理

    在Web项目开发中,会话管理是一个很重要的部分,用于存储与用户相关的数据.通常是由符合session规范的容器来负责存储管理,也就是一旦容器关闭,重启会导致会话失效.因此打造一个高可用性的系统,必须将 ...

  6. Spring Session, Redis 实现微服务 Session 共享

    在微服务中,实现各个微服务模块之间的Session共享,可以通过 Spring Session 和 Redis 技术实现. 本实例直接在之前的两个微服务中添加同样的配置,然后测试两个接口查看 Sess ...

  7. 分布式系统中使用分布式session和token的区别

    一.分布式session 因为是分布式的系统,传统的单机session不适用于分布式系统中,可以使用分布式session. 本质是使用第三方的数据库(建议是非关系型数据库)来存储session信息,例 ...

  8. 分布式Session分析与代码实战(SpringSession)

    一.介绍 1.什么是session? cookie? session对象存储在服务器端内存中,cookie存储在客户端浏览器中.一般是客户端请求服务器,服务器端生成session对象,将session ...

  9. 分布式session的实现方式

    分布式session的实现方式 引言 首先session 是啥?浏览器有个 cookie,在一段时间内这个 cookie 都存在,然后每次发请求过来都带上一个特殊的 jsessionid cookie ...

最新文章

  1. 计算机科学NIP,NIP自然语言处理主要应用在哪些领域呢?
  2. 2016 VR年终大趴行业大佬齐聚,共同探讨AR、VR的商业化道路之变
  3. java Servlet Filter 拦截Ajax请求,统一处理session超时的问题
  4. php post请求后端拿不到值_[精选] uniapp实现多端开发,与PHP是如何结合的
  5. UART_RECV详细设计方案
  6. ABAP的自学之路 ,初步认识ABAP 一
  7. HTML5 飞秋官方下载 fps 也为咱国人争点脸
  8. ORACLE坏块检查
  9. Springboot — 用更优雅的方式发HTTP请求(RestTemplate详解)
  10. WinServer2008R2搭建和授权DHCP服务器详解
  11. 实习成长之路:MySQL七:事务到底是隔离的还是不隔离的?
  12. pythonnumpy算术函数_python的numpy.prod函数运行实例详解
  13. 计算机组成原理什么是模,计算机组成原理中字、位元组、位各指什么?单位用什么表示?...
  14. 最全电商分类信息(03)
  15. zabbix 5.0所有依赖包_开源的Zabbix报表系统ZbxTable正式发布!
  16. android虚拟器没有菜单,网易MuMu模拟器不显示Menu(菜单)键的解决办法
  17. UBUNTU系统镜像定制
  18. 光学红外雨量IFR202型传感器应用于智慧灌溉智能家居地质灾害等行业
  19. murmurHash使用方法
  20. 详解GaussDB(DWS) 资源监控

热门文章

  1. python声明编码作用_Python源代码中的编码声明字符串的作用
  2. mysql从库同步delete不动了_MySQL主从同步报错故障处理集锦
  3. mysql 5.5 替换字符_Mysql 5.7替换表中某些字段的字符串
  4. 加速安装LibcSeacher
  5. python基础教程:两个list之间移动元素
  6. Python执行精确的浮点数运算
  7. python实现两数之和
  8. python中json.dump() 和 json.dumps() 有那些区别?
  9. ftp服务器不显示缩略图,ftp服务器不显示缩略图
  10. mysql链表_MySql链表语句--博客园老牛大讲堂