解决不同服务之间、子域名之间session共享。
四种方案:
1. Session 复制
各个tomcat服务器之间自己同步。
优点:只需要修改tomcat配置
缺点:session同步占用带宽,每个节点都存储了全量session,受内存限制
大型集群下不可取
2. 存到客户端cookies中
存储到浏览器cookies中。
优点:服务器不需要存储
缺点:不安全,受大小限制,每次请求都要携带,浪费网络带宽
这种方式不使用
3. hash一致性
同一个用户的请求根据hash 始终访问同一服务器
优点:只需要更改nginx配置,负载均衡
缺点:session只存在一台服务器中,服务重启导致丢失,水平扩展需rehash
这种反向代理可以使用
4. redis统一存储
引入redis等第三方
优点:没有安全隐患,可以水平扩展,重启不丢失
缺点:增加了一次网络调用,需要写代码,redis比内存慢
SpringSession有完美解决方案可参考官网。
结果
因为原来单体的jsessionid这个cookie默认是当前系统域名的,当拆分服务时,比如不同域名jd.com和passport.jd.com的作用域Domain中的值都是当前服务的,
1.通过Spring Session整合redis实现RedisHttpSession解决不同服务间的共享;
2.实现CookieSerializer自定义将Cookies中存入Domain解决子域名间的共享
原理
装饰者模式
@EnableRedisHttpSession导入RedisHttpSessionConfiguration配置
1。给容器添加了一个组件SessionRepository,里面是redis操作session的增删改查。
2。SessionRepositoryFilter==>session过滤器,将原始的request,response包装起来,以后request.getSession()获取到的session都是被他包装过的session。