TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
前言5 j: q8 F1 r0 f6 x; S( ~: x
0 Y( E. k' o; v
通常在web开发中,会话管理是很重要的一部分,用于存储与用户相关的一些数据。对于java开发者来说,项目中的session一般由Tomcat或者jetty容器来管理。
$ F" k: y$ e( w& y# L8 ~% S% X# Y5 r+ G7 B
特点介绍
( _( t0 t7 D4 a
8 c2 h, S- d4 j y! i k4 D尽管使用特定的容器可以很好地实现会话管理,但是独立容器挂掉或者由于其他原因重启会导致用户信息丢失,并且无法支持分布式集群会话管理。
8 e: N* s$ s' f9 U4 _& [/ y' d2 m! g* K' O, b+ |1 ~4 }
上图举例:7 _: X- A: ?8 v5 z% F- l; K
1 {& a- a) E3 G: `% H
# Q5 ^) {! t7 D# g# O6 A
. `) G/ [; Y% d; J9 h) C这是一个简单的负载均衡集群架构模型,后端三台Tomcat服务,假设每台服务都使用自己的会话管理,而集群策略是基于加权轮询的方式实现。试想一下,用户是不是永远无法登陆系统?
G3 B6 N! W# w/ P1 }2 C3 D% g& A* L6 A3 w5 E
当然,你可能会想,我可以使用基于IP_hash的方式实现负载均衡嘛。但是如果地区分布相对单一,产生的hash值分布可能也不会太均匀,那就起不到负载均衡的作用了。: h9 L6 G+ r3 _- `4 o% e. a9 u
, I& Y7 W5 `& A1 y7 U' a- n0 p
一般来说,有两种解决方案,session复制和session统一管理。对于session复制,简单的几台还是可以的,但是如果上百台甚至上千台就要考虑复制成本问题了。
& z9 ^% @9 S' R1 A s) k e: K0 y* l7 e2 L2 B6 ?& R
对于统一session管理可以是关系型数据库,比如MySql(基本不用,考虑到效率问题);非关系型数据库 redis,memcache等等。
+ J7 v4 d) f2 h
" h% z# k3 I& r. @- g: k7 a1 A解决方案
/ G; E5 G7 V# M# ^' J
' T, o. \9 m2 z7 y5 x基于Tomcat的会话插件实现tomcat-redis-session-manager 和tomcat-memcache-session-manager,会话统一由NoSql管理。对于项目本身来说,无须改动代码,只需要简单的配置Tomcat的server.xml就可以解决问题。但是插件太依赖于容器,并且对于Tomcat各个版本的支持不是特别的好5 U& v6 H3 ? b0 e
) `1 H/ F( x" }) h+ L9 Q
重写Tomcat的session管理,代码耦合度高,不利于维护。
, A+ m& f3 `. l$ B) m# S8 Q
8 k1 G* j( y+ J使用开源的session管理框架,比如spring_session,既不需要修改Tomcat配置,又无须重写代码,只需要配置相应的参数即可。& a4 K2 b+ L7 u
0 I) e2 i( a( a2 [
" K% @4 j1 V% f6 [
更多关注博客:http://blog.52itstyle.com/archives/759/
& X4 j7 @& ]* r; ^ |
|