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

前言

今天老顾带着大家了解一下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方案又会怎么样?留下二个问题,请小伙伴们仔细思考下。请持续关注老顾的文章,谢谢!!!

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

  1. dbnetlib不存在或拒绝访问_idou老师教你学Istio 16:如何用 Istio 实现微服务间的访问控制...

    本文由华为云容器Istio团队撰稿,未经允许谢绝转载. 摘要 使用 Istio 可以很方便地实现微服务间的访问控制.本文演示了使用 Denier 适配器和黑白名单两种方法. 使用场景 有时需要对微服务 ...

  2. 微服务常见安全认证方案Session token cookie跨域

    HTTP 基本认证 HTTP Basic Authentication(HTTP 基本认证)是 HTTP 1.0 提出的一种认证机制,这个想必大家都很熟悉了,我不再赘述.HTTP 基本认证的过程如下: ...

  3. 无法访问netflix服务_Choerodon 的微服务之路(三):服务注册与发现

    本文是 Choerodon 的微服务之路系列推文第三篇.在上一篇<Choerodon的微服务之路(二):微服务网关>中,介绍了Choerodon 在搭建微服务网关时考虑的一些问题以及两种常 ...

  4. ddd 访问权限_基于DDD的微服务设计和开发实战

    作者:欧创新.邓頔.文艺 你是否还在为微服务应该拆多小而争论不休?到底如何才能设计出收放自如的微服务?怎样才能保证业务领域模型与代码模型的一致性?或许本文能帮你找到答案. 本文是基于 DDD 的微服务 ...

  5. SpringSecurity-基于微服务的认证与权限访问

    目录 一.微服务概述 1.1 微服务由来 1.2 微服务优势 1.3 微服务本质 1.4 微服务的认证与授权实现思路 1.5 权限管理数据模型(举例) 二.JWT概述 2.1 Sesssion认证与T ...

  6. 微服务访问安全设计方案全探索

    文章来源:https://segmentfault.com/a/1190000006785852 今天给大家带来的是 数人云工程师文权在高效运维线上群的分享实录.从传统单体应用架构到微服务架构,安全问 ...

  7. linux篡改url命令,linux 使用curl命令访问url并模拟cookie

    1.目录 linux下通过命令访问url的方式有多种,主要如下 2.1.elinks elinks – lynx-like替代角色模式WWW的浏览器 2.1.2.wget 这个会将访问的首页下载到本地 ...

  8. docker的接口 外部如何访问k8s_本地服务调用K8S环境中的SpringCloud微服务实战

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:原创文章分类汇总及配套源码,涉及Java.Docker.K8S.Devops等 下图是典型的微 ...

  9. 【学习笔记】cookie、session、token和分布式session

    文章目录 cookie和Session session和token cookie和token总结 分布式Session cookie和Session 为什么要有session的出现? 答:是由于网络中 ...

最新文章

  1. ajax formdata提交上传,Ajax提交用FormData()上传文件
  2. 从java到c_Binder机制,从Java到C (4. Parcel)
  3. kafka时间轮linux时间轮,Kafka解惑之时间轮 (TimingWheel)
  4. UVA10785 The Mad Numerologist
  5. js Date 函数方法
  6. Map的两种遍历方法
  7. 3d怎么把两个面拼接在一起_vr全景看房用什么软件做的?3D看房是怎么拍摄的?...
  8. java string类型详解_Java字符串类型详解
  9. 小米球ngrok内网穿透
  10. 【英语学习】【WOTD】shanghai 释义/词源/示例
  11. 集群的可扩展性及其分布式体系结构(3)--上
  12. 多线程下的单例模式你真的了解吗?
  13. HDU 3966 dfs序+LCA+树状数组
  14. 执行cmd并获得结果_用JAVA执行CMD命令备份PG数据库,解决需要口令的问题
  15. CIC滤波器的设计与仿真
  16. android 8187驱动 win7,RTL8187 无线网卡在win7下的驱动问题
  17. 2017高教杯数学建模B 题分析
  18. VisualEffectGraph概述
  19. 云计算HCIA学习笔记-云计算基础概念
  20. 联通4g 小米不显示无服务器,小米旗舰机断流严重,信号满格消息却发不出去?...

热门文章

  1. win10 object type
  2. SpringBoot文档翻译系列——26.日志logging
  3. c#中params关键字应用
  4. 通过Mybatis获取mysql表中重复记录的方法
  5. delphi IOS 通知 TNotification
  6. Android WebService
  7. 移动时代软件测试团队该往哪里去?
  8. Oracle物化视图和普通视图区别
  9. JPA多表查询映射自定义实体类(包含两个表字段)
  10. 三十五岁后,就不能做软件测试了?