集群的关键点是 session 共享,这里使用 spring-session-data-redis
把 session 存储到 Redis 实现集群里 session 的共享,全是配置,不需要修改一行 Java 代码就能实现 Session 的集群共享。
Gradle 依赖
1 | "org.springframework.session:spring-session-data-redis:1.3.1.RELEASE" |
spring-session.xml
1 |
|
虽然上面的配置一般情况下足够了,但是很多时候需要配置 JedisPool, Redis Server 的 IP,密码等等,可以参考下面的配置:
1 |
|
web.xml
Spring Session Data Redis 使用 Servlet Filter 来实现的,filter-name 必须为 springSessionRepositoryFilter
,并且必须放在 Spring Security 的 filter springSecurityFilterChain
之前(filter 是按照定义的顺序加载的),web.xml 中加入下面的代码:
1 | <listener> |
通过上面的配 就实现了在 Redis 里存储 Session,集群里共享 Session 了,不需要修改任何代码,当然,别忘了启动 Redis 服务器(redis-servr
)。
测试
- Redis 必须在应用前启动
- 应用启动前没有启动 Redis,应用启动失败,不能处理请求
- 应用启动前已经启动 Redis,应用启动成功,中途 Redis 关闭了,处理请求会报异常,再次启动 Redis,应用会自动连接 Redis,正常处理请求
- 既然是集群,就需要一个负债均衡如
Nginx
来分发请求 - 启动多个应用的实例
- 访问 http://localhost:8080/admin
- 登陆
- 不停的刷新访问 http://localhost:8080/admin
- 看到只需要一次登陆,集群中的所有应用都不需要再次登陆了