分布式 Session常用解决方案(一)

107 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第3天,点击查看活动详情      

     提到session大家可能并不陌生,我们接触比较多的session使用场景通常是与浏览器的cookie结合使用的,通俗的说就是在我们打开网页浏览器时,浏览器端会存在一个 Cookie,在一段时间内这个 Cookie 都是存在的,然后每次在我们触发浏览器向服务器发送请求时都会在请求中携带一个特殊的jsessionid,服务器就是根据就根据jsessionid去获取指定的Session域数据(有点像我们常用的缓存map,根据key去获取缓存的数据值)。一般的话只要你没关掉浏览器,只要服务器端的Cookie还在,那么对应的那个Session域的数据就是存在的,但是如果服务器端的Cookie没了,那对应的Session域数据也就没了。一般我们可以使用此特性实现网站的用户登录信息的保存。但是提到分布式session大家可能会有点疑惑,什么是分布式session呢?

大家可以考虑一个场景,在传统的单体架构用户在进行页面操作数据请求时后台接收到请求首先需要校验该用户是否登录,若当前用户未登录则相应的请求就会被拦截,这在传统的单体应用中是非常常见的操作也非常容易实现,我们只需在请求到达后台时校验服务器端的Session数据验证用户是否登录即可,但在分布式应用中,我们的后台服务部署往往不止一台,如果登录信息存在A服务器、校验请求发送到B服务器那显然是有问题的。本次文章我将分两次给大家讲解相关分布式session的相关解决方案。

方案一
Tomcat + Redis

       这种解决方案其实是比较常见的一种,其实就是利用原生的Tomcat+Session 的能力,然后基于此配置Tomcat RedisSessionManager,使用RedisSessionManager将我们集群中所有tomcat的session信息都存储到redis中去,以此达到session在各个服务器之间共享的能力。

在 Tomcat 的配置文件中配置:

<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />
<Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
         host="{redis.host}"
         port="{redis.port}"
         database="{redis.dbnum}"
         maxInactiveInterval="60"/>

然后指定 Redis相关配置属性就可以了。

<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />
<Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
	 sentinelMaster="mymaster"
	 sentinels="<sentinel1-ip>:26379,<sentinel2-ip>:26379,<sentinel3-ip>:26379"
	 maxInactiveInterval="60"/>

此次介绍到这里就结束了,如有不足欢迎大家评论区及时指正。