在构建基于Spring Cloud微服务框架时,使用了常用的框架NGINX+ZUUL+Eureka+业务服务,Session使用Spring boot的Redis集成,所有微服务间共享Session。
所有业务的微服务Rest接口前台调用接口通过ZUUL进行转发,而ZUUL通过创建ZUULFilter过滤器来对请求鉴权及一些Session操作,而且为了保证Session实时生效,故设置Spring boot的Redis Session声明为立即生效,如下所示:
@EnableRedisHttpSession(redisFlushMode = RedisFlushMode.IMMEDIATE)
在第一次业务请求时ZUUL过滤器会创建Session并设置属性,然后直接将请求转发到业务服务,
@Componentpublic class LoginFilter extends ZuulFilter { private final static Logger LOG = LoggerFactory.getLogger(LoginFilter.class); @Override public Object run() throws ZuulException { Double rand = Math.random() * 100; int randInt = rand.intValue(); RequestContext ctx = RequestContext.getCurrentContext(); HttpServletResponse response = ctx.getResponse(); HttpServletRequest request = ctx.getRequest(); HttpSession session = request.getSession(); session.setAttribute("test", randInt); LOG.info("Session id:{} test:{}",session.getId(),randInt); return null; } @Override public boolean shouldFilter() { return true; } @Override public int filterOrder() { return 0; } @Override public String filterType() { return "pre"; } }
然而业务服务在调用方法时通过request.getSession(false)获取的Session为null,但紧接着第二次及后续调用时业务服务都能获取到了正确的Session。
@RestControllerpublic class BusinessController { private final static Logger LOG = LoggerFactory.getLogger(BusinessController.class); @RequestMapping(path="/getsession/{key}") public String getSessionVal(HttpServletRequest request,@PathVariable("key") String key) { HttpSession session = request.getSession(false); Object value = null; if(null != session) { value = session.getAttribute(key); } LOG.info("Session id:{} value:{}",session == null ? null:session.getId(),value); return ""; } }
这么奇葩的现象,第一次Session创建成功居然Session不能传递,实在是令人匪夷所思。
由于没有特殊定制过Spring boot Session机制,都是使用默认的Cookie传递方式。业务服务获取不到Session,有两种可能,一种是Redis没有实时创建Session对象,另外一种是业务不能通过SESSIONID获取到对象。
通过Debug断点定位,在ZUUL创建Session时,通过Redis客户端,直接连接到Redis服务器,查看发现Redis实时的生成了Session对象,故第一个假设应该不成立的。
然后通过打印在ZUUL与业务服务中Request Cookie信息,发现ZUUL在创建完Session后,并没有更新request的Cookie中的SESSIONID,且request.isRequestedSessionIdValid()为false,故业务第一次获取到的request中的Cookie没有新的SESSIONID,就更不能根据Cookie获取Session了,第二种假设成立。
通过查询资料,明白了只有在请求Response响应后请求的Cookie才会更新,第一次请求时创建的Session不会在微服务间进行传递。天真的认为可以宽心的使用Spring cloud全家桶,殊不知还是需要细心与思考,同时也许需要知识积累。
从单体引用根本不会出现这种情况,Session在一个服务中传递,不存在Session重新通过Cookie获取。而微服务简化了业务,但多了交互,外部交流越多,越容易出错,也许在微服务的路上还有更多的坑需要填补。
如何填补这个坑呢?
下次再进行分析~~
Original url: Access
Created at: 2019-03-07 23:34:33
Category: default
Tags: none
未标明原创文章均为采集,版权归作者所有,转载无需和我联系,请注明原出处,南摩阿彌陀佛,知识,不只知道,要得到
java windows火焰图_mob64ca12ec8020的技术博客_51CTO博客 - 在windows下不可行,不知道作者是怎样搞的 监听SpringBoot 服务启动成功事件并打印信息_监听springboot启动完毕-CSDN博客 SpringBoot中就绪探针和存活探针_management.endpoint.health.probes.enabled-CSDN博客 u2u转换板 - 嘉立创EDA开源硬件平台 Spring Boot 项目的轻量级 HTTP 客户端 retrofit 框架,快来试试它!_Java精选-CSDN博客 手把手教你打造一套最牛的知识笔记管理系统! - 知乎 - 想法有重合-理论可参考 安宇雨 闲鱼 机械键盘 客制化 开贴记录 文本 linux 使用find命令查找包含某字符串的文件_beijihukk的博客-CSDN博客_find 查找字符串 ---- mac 也适用 安宇雨 打字音 记录集合 B站 bilibili 自行搭建 开坑 真正的客制化 安宇雨 黑苹果开坑 查找工具包maven pom 引用地 工具网站 Dantelis 介绍的玩轴入坑攻略 --- 关于轴的一些说法 --- 非官方 ---- 心得而已 --- 长期开坑更新 [本人问题][新开坑位]关于自动化测试的工具与平台应用 机械键盘 开团 网站记录 -- 能做一个收集的程序就好了 不过现在没时间 -- 信息大多是在群里发的 - 你要让垃圾佬 都去一个地方看难度也是很大的 精神支柱 [超级前台]sprinbboot maven superdesk-app 记录 [信息有用] [环境准备] [基本完成] [sebp/elk] 给已创建的Docker容器增加新的端口映射 - qq_30599553的博客 - CSDN博客 [正在研究] Elasticsearch, Logstash, Kibana (ELK) Docker image documentation elasticsearch centos 安装记录 及 启动手记 正式服务器 39 elasticsearch 问题合集 不断更新 6.1.1 | 6.5.1 两个版本 博客程序 - 测试 - bug记录 等等问题 laravel的启动过程解析 - lpfuture - 博客园 OAuth2 Server PHP 用 Laravel 搭建带 OAuth2 验证的 RESTful 服务 | Laravel China 社区 - 高品质的 Laravel 和 PHP 开发者社区 利用Laravel 搭建oauth2 API接口 附 Unauthenticated 解决办法 - 煮茶的博客 - SegmentFault 思否 使用 OAuth2-Server-php 搭建 OAuth2 Server - 午时的海 - 博客园 基于PHP构建OAuth 2.0 服务端 认证平台 - Endv - 博客园 Laravel 的 Artisan 命令行工具 Laravel 的文件系统和云存储功能集成 浅谈Chromium中的设计模式--终--Observer模式 浅谈Chromium中的设计模式--二--pre/post和Delegate模式 浅谈Chromium中的设计模式--一--Chromium中模块分层和进程模型 DeepMind 4 Hacking Yourself README.md update 20211011
Laravel China 简书 知乎 博客园 CSDN博客 开源中国 Go Further Ryan是菜鸟 | LNMP技术栈笔记 云栖社区-阿里云 Netflix技术博客 Techie Delight Linkedin技术博客 Dropbox技术博客 Facebook技术博客 淘宝中间件团队 美团技术博客 360技术博客 古巷博客 - 一个专注于分享的不正常博客 软件测试知识传播 - 测试窝 有赞技术团队 阮一峰 语雀 静觅丨崔庆才的个人博客 软件测试从业者综合能力提升 - isTester IBM Java 开发 使用开放 Java 生态系统开发现代应用程序 pengdai 一个强大的博主 HTML5资源教程 | 分享HTML5开发资源和开发教程 蘑菇博客 - 专注于技术分享的博客平台 个人博客-leapMie 流星007 CSDN博客 - 舍其小伙伴 稀土掘金 Go 技术论坛 | Golang / Go 语言中国知识社区
最新评论