一些项目初期出于简单快速, 都是做单机开发与部署, 但是随着业务的扩展或对可用性要求的提高, 单机环境已不满足需求. 单机部署往多机部署切换, 其中可能存在的一个重要环节就是 session 的共享 (如果一开始就是基于 token 的认证则可忽略). 本文介绍一个基于 Redis 的 tomcat session 管理开源项目: redission-tomcat, 可无代码侵入式地快速实现 session 共享.
1. 简介
redisson 是与 jedis 类似的一个 Redis 客户端, 其功能比 jedis 要更丰富一些. redission-tomcat 是一个基于 Redis 的 tomcat session 管理器项目, 项目地址: . 相比于其它实现, 该项目的存储更为高效, 写操作也更为优化. 每一个 session 参数是在调用 HttpSession.setAttribute 时写入 Redis 的, 其它方案却一般是每次都将整个 session 进行序列化后写入.
2. 使用
将 redisson-all-3.11.0.jar,redisson-tomcat-8-3.11.0.jar(针对 tomcat8, 其它版本可在上述项目地址页面找到下载链接) 两个 jar 包下载放到 tomcat 的 lib 目录下.
在 tomcat conf 目录下的 context.xml 文件中添加如下配置
- <Manager className="org.redisson.tomcat.RedissonSessionManager" configPath="${catalina.base}/conf/redisson.conf"
- readMode="MEMORY" updateMode="AFTER_REQUEST" broadcastSessionEvents="false"
- />
其中
configPath: 指向 Redisson 的 JSON 或 YAML 格式的配置文件, 第 3 步中给出.
readMode:session 属性的读取模式. 可取值 1. MEMORY, 该模式会将 session 属性同时保存到本地 tomcat session 与 Redis 中, 后续的 session 更新通过 Redis 事件传播到本地 tomcat session;2. Redis, 只将 session 属性保存到 Redis 中. 默认为 Redis.
updateMode:session 属性的更新模式. 可取值 1. DEFAULT,session 属性只通过 setAttribute 方法保存到 Redis 中; 2. AFTER_REQUEST, 在每次请求之后, 将所有 session 属性保存至 Redis. 默认为 DEFAULT.
broadcastSessionEvents: 如果设置为 true, 则 sessionCreated 与 sessionDestroyed 事件将会被广播到所有 tomcat 实例, 并使所有注册的 HttpSessionListeners 监听器被触发. 默认为 false.
在 tomcat conf 目录下新增配置文件 redisson.conf, 内容如下
- {
- "singleServerConfig":{
- "idleConnectionTimeout":10000,
- "connectTimeout":10000,
- "timeout":3000,
- "retryAttempts":3,
- "retryInterval":1500,
- "password":"123456",
- "subscriptionsPerConnection":5,
- "clientName":null,
- "address": "redis://127.0.0.1:6379",
- "subscriptionConnectionMinimumIdleSize":1,
- "subscriptionConnectionPoolSize":50,
- "connectionMinimumIdleSize":24,
- "connectionPoolSize":64,
- "database":0,
- "dnsMonitoringInterval":5000
- },
- "threads":16,
- "nettyThreads":32,
- "codec":{
- "class":"org.redisson.codec.FstCodec"
- },
- "transportMode":"NIO"
- }
以上为单机模式 Redis 环境配置, 其中 password,address 修改为自己的值. 如果是集群模式, 则配置文件为
- {
- "sentinelServersConfig":{
- "idleConnectionTimeout":10000,
- "connectTimeout":10000,
- "timeout":3000,
- "retryAttempts":3,
- "retryInterval":1500,
- "failedSlaveReconnectionInterval":3000,
- "failedSlaveCheckInterval":60000,
- "password":null,
- "subscriptionsPerConnection":5,
- "clientName":null,
- "loadBalancer":{
- "class":"org.redisson.connection.balancer.RoundRobinLoadBalancer"
- },
- "subscriptionConnectionMinimumIdleSize":1,
- "subscriptionConnectionPoolSize":50,
- "slaveConnectionMinimumIdleSize":24,
- "slaveConnectionPoolSize":64,
- "masterConnectionMinimumIdleSize":24,
- "masterConnectionPoolSize":64,
- "readMode":"SLAVE",
- "subscriptionMode":"SLAVE",
- "sentinelAddresses":[
- "redis://127.0.0.1:26379",
- "redis://127.0.0.1:26389"
- ],
- "masterName":"mymaster",
- "database":0
- },
- "threads":16,
- "nettyThreads":32,
- "codec":{
- "class":"org.redisson.codec.FstCodec"
- },
- "transportMode":"NIO"
- }
我们可以使用 nginx 来实现负载均衡, 参考配置
- upstream cnserver{
- server 127.0.0.1:8080 weight=2 fail_timeout=10s max_fails=1;
- server 127.0.0.1:8081 weight=2 fail_timeout=10s max_fails=1;
- }
- server {
- listen 80;
- server_name localhost;
- index index.html index.htm;
- location /REST/ {
- index index.HTML;
- proxy_pass http://cnserver/REST/;
- }
- }
以上即为使用 redisson-tomcat 来实现单机部署到多机部署的所有配置.
3. 总结
技术架构都是随着业务的发展而不断演进. 在业务发展初期, 用户量, 业务复杂度都相对较低, 为了实现快速上线验证, 往往采用简单单一的架构. 许多项目可能还没来得及进行架构演进升级就 GG 了, 而有幸继续成长的项目必然会随着业务的扩张不断优化与升级. 本文介绍的 redisson-tomcat 可帮助单机项目快速切换到多机支持, 当然只是在 session 管理环节. 如果涉及到其它如文件上传, 定时任务等分布式支持, 则要另做相应调整了.
我的个人博客地址: http://blog.jboost.cn/
我的 GitHub 地址: https://github.com/ronwxy
我的微信公众号: jboost-ksxy (一个不只有实战干货的技术公众号, 欢迎关注)
---------------------------------------------------------------
来源: https://www.cnblogs.com/spec-dog/p/11105943.html