Spring Session实战-传统单体应用集群部署解决方案

场景值1

一个维护了几百年的单体老项目,忽然就火起来了,访问人数忽然暴增,服务器资源告急,担忧一下驾崩,老板一个电话过来跟你说:“!4@!#!!¥@!¥1¥@!”,而后你得大半夜从睡梦中醒来屁颠屁颠的整服务器。前端

场景值2

下班了,准备发完版本就回去。等等,老板还在演示,又不能中断服务器去部署应用。一不当心,一个钟过去了,还没结束,你得等啊等啊,终于能够发布了。而后你利索的./shutdown下去,代码啪啦啪啦的上传完,准备启动了,盯着启动日志,天哪,怎么log卡住不动了。而后客服机立马就有人来找你麻烦了。java

更多场景值,此处省略好多 ...nginx

Spring Session是什么

  • Spring Session提供了一个管理用户会话信息的API和实现。它还提供透明的整合:git

    • HttpSession - 容许以应用程序容器(即Tomcat)中立的方式替换HttpSession。其余功能包括:
    • 群集会话 - Spring Session使得支持群集会话变得垂手可得,而不会受限于特定于应用程序容器的解决方案。
    • 多个浏览器会话 - 春季会话支持在单个浏览器实例中管理多个用户的会话(即与Google相似的多个通过身份验证的账户)。
    • RESTful API - Spring Session容许在头文件中提供会话标识符以使用RESTful API
  • WebSocket - 提供HttpSession在接收WebSocket消息时保持活动状态的能力

白话:spring session抽象了一套API,并基于这套API对servlet容器提供的session进行无侵入集成,好比使用redis进行session管理,实现所谓的分布式session。web

Spring Session坐标

以Maven作为依赖管理,基于redis的Spring Session实现redis

<dependency>
    <groupId>org.springframework.session</groupId>
    <artifactId>spring-session-data-redis</artifactId>
    <version>1.0.2.RELEASE</version>
    <type>pom</type>
</dependency>

Spring Session怎么使用

Spring session对主流的Servlet容器如Tomcat提供透明的整合HttpSession。这意味着开发人员使用HttpSession可借助Spring Session支持的实现切换实现。spring

使用redis

Redis有多种客户端实现,经常使用的有Jedis和Lettuce。具体差异读者可另行翻阅其余资料。本文以Jedis为例。浏览器

  • 基于java配置缓存

    • Sring Java配置tomcat

      @EnableRedisHttpSession
      public class Config{
          @Bean
          public LettuceConnectionFactory connectionFactory() {
              return new JedisConnectionFactory();
          }
      }

      说明:默认的JedisConnectionFactory()构造方法是连接localhost:6379无密码的redis-server,实际生产环境可按需选择合适的构造方法。

    • Java Servlet容器初始化
      Spring配置建立了一个名为springSessionRepositoryFilter实现的Spring Bean Filter。该springSessionRepositoryFilterbean负责HttpSession用Spring Session支持的自定义实现来替换它。

      为了让咱们Filter发挥它的魔力,Spring须要加载Config.java。最后,咱们须要确保咱们的Servlet容器(即Tomcat)使用咱们springSessionRepositoryFilter的每一个请求。
      幸运的是,Spring Session提供了一个AbstractHttpSessionApplicationInitializer,继承它,把配置传入进去便可,代码以下:

      public class Initializer extends AbstractHttpSessionApplicationInitializer {
          publicInitializer() {
              super(Config.class);
          }
      }
  • 基于xml配置

    • bean 配置

      <context:annotation-config />
      
      <bean class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration" />
      
      <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" 
          p:host-name="${redis.host}" 
          p:port="${redis.port}" 
          p:password="${redis.password}" />

      基于xml的配置也至关简单,这里注意一下p命名空间,添加引用xmlns:p="http://www.springframework.org/schema/p"

    • web.xml 配置 filter

      <filter>
          <filter-name>springSessionRepositoryFilter</filter-name>
          <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
      </filter>
      <filter-mapping>
          <filter-name>springSessionRepositoryFilter</filter-name>
          <url-pattern>/*</url-pattern>
          <dispatcher>REQUEST</dispatcher>
          <dispatcher>ERROR</dispatcher>
      </filter-mapping>

到此为止,应用已经集成了Spring Session,感受不要太爽了!

测试Spring Session

  • 把浏览器本地缓存先清一清
  • 输入访问地址 http://localhost:8080/login

图片
注意看中间的红色部分,没有了原来的jessionid,可是新增了 session。这是实现分布式session的关键。

  • 登陆系统,访问到主页
  • 关闭服务器,重启
  • 刷新页面,咦?不须要从新登陆?

集群部署(负载均衡)

这里不是本文重点,就不展开细说了,因为上面已经解决了应用服务器session共享的问题,因此集群实现也是很是的简便,经过nginx反向代理到2个部署到应用的tomcat便可。

推荐

ifast是一款基于Spring Boot + Mybatis + Mybatis Plus搭建的快速开发平台。ifast集成了代码生成器,具备高效的开发效率。以Spring Boot为基础框架,Mybatis plus为数据访问层, Apache Shiro为权限受权层,Ehcahe对经常使用数据进行缓存,基于Bootstrap构建的hplus做为前端框架。
访问请点击 Java快速开发脚手架 ifast

相关文章
相关标签/搜索