TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
前言
/ v X3 [- N& i5 x$ x
5 ]8 I& i) Y1 s- Z' O通常在web开发中,会话管理是很重要的一部分,用于存储与用户相关的一些数据。对于java开发者来说,项目中的session一般由Tomcat或者jetty容器来管理。
% z" N$ j6 V5 G @: A5 V5 G% e2 n7 l3 B! s$ l. C, _& \
特点介绍' R5 H- s5 Q( |* C8 z Y; y
+ Z0 c& \5 U6 `! a9 B4 L
尽管使用特定的容器可以很好地实现会话管理,但是独立容器挂掉或者由于其他原因重启会导致用户信息丢失,并且无法支持分布式集群会话管理。
# z4 ~9 |, G) h7 j7 ?0 k9 y3 V" D3 }* ?- V0 l. M
上图举例:" z' x: F3 [: R& a9 h+ `
* g& V" _$ N- i# [3 t/ z* o0 x& A. c, s! y0 ]9 r4 D1 z2 m! i
- `9 g+ ~1 V1 e2 l- u4 c4 G i这是一个简单的负载均衡集群架构模型,后端三台Tomcat服务,假设每台服务都使用自己的会话管理,而集群策略是基于加权轮询的方式实现。试想一下,用户是不是永远无法登陆系统?( I# \1 i1 E2 x D) K( L* W% s
/ `3 w3 y+ x) K2 t/ E r4 N
当然,你可能会想,我可以使用基于IP_hash的方式实现负载均衡嘛。但是如果地区分布相对单一,产生的hash值分布可能也不会太均匀,那就起不到负载均衡的作用了。
; K" G+ F+ d8 e" f1 A* [. l3 V7 J N9 d2 R, L8 \ E6 k
一般来说,有两种解决方案,session复制和session统一管理。对于session复制,简单的几台还是可以的,但是如果上百台甚至上千台就要考虑复制成本问题了。, L* H9 _; @# |
# B; L; ^6 G2 A$ ~9 r8 r2 W3 N5 A* b
对于统一session管理可以是关系型数据库,比如MySql(基本不用,考虑到效率问题);非关系型数据库 redis,memcache等等。4 U5 M X5 T q' L
. b# x& O* y! [2 o, L- d4 O' H" U
解决方案0 r0 _: B I+ v# Z0 N, I) i' t# \$ Q$ e
* f4 Q; J, L; w1 t6 y7 G8 O
基于Tomcat的会话插件实现tomcat-redis-session-manager 和tomcat-memcache-session-manager,会话统一由NoSql管理。对于项目本身来说,无须改动代码,只需要简单的配置Tomcat的server.xml就可以解决问题。但是插件太依赖于容器,并且对于Tomcat各个版本的支持不是特别的好
/ y9 Z' @( U$ X: W0 V& d j' X9 i4 E# c+ D- W' |6 ]
重写Tomcat的session管理,代码耦合度高,不利于维护。
1 J7 X7 Y2 N& O7 R+ E; w$ Y8 m0 g( [) u5 i8 ~7 |# ?. x8 m% u
使用开源的session管理框架,比如spring_session,既不需要修改Tomcat配置,又无须重写代码,只需要配置相应的参数即可。
8 @6 W/ a- x( n' |) z) W b; R4 j, g& ~1 ^0 a$ e0 X) p, X" I
" F1 v; P1 w1 s' G3 Y
更多关注博客:http://blog.52itstyle.com/archives/759/
4 G3 ?2 t3 c, ?. a) T. a |
|