1、分布式 Session 共享概念不同进程之间的 session 共享访问。解决了分布式系统或者系统集群部署时出现的问题: web 容器(如 tomcat)管理的 session 都存放于本地内存中无法共享,用户每次访问的服务器可能都不一样,因此出现服务器不能识别用户、用户登录状态失效等。解决方案:方案一:黏性 sessionNGINX 等负载均衡网关,可以通过 hash 映射等方式,保证相同用户的请求会转发到同一台服务器。优点:简单高效,易实施。缺点:存在大量请求转发到单点服务器极端情况导致负载均衡失效;单点故障导致用户 session 丢失。方案二:tomcat 集群 session 复制T
2、omcat 提供集群环境下的 session 复制功能,以达到 session 共享。优点:无开发工作量。缺点:session 复制会消耗大量服务器资源,只能应用于小规模的集群。方案三:Spring session + redis(推荐)Spring session 可以接管 web 容器的 session 管理,并可以将session 数据存放于 redis 等第三方存储。优点:Spring boot/cloud 项目无缝集成;可存储海量 session 数据;可以利用 redis 提供的持久化保证宕机恢复、服务升级重启用户session 不丢失;很好的支持服务在线扩容!缺点:Spring
3、session 没有多语言版本,限制了微服务框架下不同的技术选型。Spring boot/cloud 下的使用方法:1. 增加配置 redis 和 spring session 的配置spring.redis.host=127.0.0.1spring.redis.password=123456spring.redis.port=6379spring.session.store-type=redis2. 创建配置类,开启注解ConfigurationEnableRedisHttpSessionpublic class UserCenterSessionConfig Beanpublic Jedi
4、sConnectionFactory connectionFactory()return new JedisConnectionFactory();Spring Cloud 微服务项目中存在如下情况,导致 session 共享失效:1. Zuul 做 API 网关,转发时默认禁止传递 Cookie。需要开启Cookie 传递。# zuul 默认的 zuul.sensitive-headers 配置将过滤请求 header 的 Cookie、Set-Cookie、Authorization 三个属性,导致 cookie 无法传播。# 敏感头信息设置为空zuul.sensitive-headers
5、=2. Feigin 整合 Hystrix,仿 RPC 调用其他微服务接口。最终请求的发送是由另一个 Hystrix 线程完成的,与 Feign 不在同一个线程,导致请求头信息丢失,Cookie 传递失败。需要做请求拦截,手动添加。Configurationpublic class FeignConfig Beanpublic RequestInterceptor requestInterceptor()return new RequestInterceptor() Overridepublic void apply(RequestTemplate requestTemplate) String sessionId = RequestContextHolder.currentRequestAttributes().getSessionId();requestTemplate.header(“Cookie“, “SESSION=“ + sessionId);