TA的每日心情 | 衰 2021-2-2 11:21 |
|---|
签到天数: 36 天 [LV.5]常住居民I
|
前言6 E* c0 u! x0 E6 ]& f
O' l% z0 i4 p2 F
通常在web开发中,会话管理是很重要的一部分,用于存储与用户相关的一些数据。对于java开发者来说,项目中的session一般由Tomcat或者jetty容器来管理。7 V5 Z V' z2 {/ `) Q& L
, O! W0 G) d' R! j' g) u! M特点介绍
% @0 ?; E/ v1 A2 C4 b$ m. G+ z; {3 T! _0 h
尽管使用特定的容器可以很好地实现会话管理,但是独立容器挂掉或者由于其他原因重启会导致用户信息丢失,并且无法支持分布式集群会话管理。
3 ?* v% @5 G$ s% s% X* ^- R7 D" l# u5 {* z1 W6 F) U% r) z- l9 Y
上图举例:. e! h/ ^) Y; F4 Z1 y) h0 y
' g9 j. G: }8 h$ ?
2 T0 Q7 Y9 L6 ~9 @7 V/ e
; ?& g% p+ @5 g. u这是一个简单的负载均衡集群架构模型,后端三台Tomcat服务,假设每台服务都使用自己的会话管理,而集群策略是基于加权轮询的方式实现。试想一下,用户是不是永远无法登陆系统?) i. G6 _! N) y& V9 h2 Q/ W
; q5 E; \) ]9 ~0 n' p$ }$ s当然,你可能会想,我可以使用基于IP_hash的方式实现负载均衡嘛。但是如果地区分布相对单一,产生的hash值分布可能也不会太均匀,那就起不到负载均衡的作用了。6 R0 l9 J# b- M" `
; N, _! _" z% W) c0 }; v# \% @
一般来说,有两种解决方案,session复制和session统一管理。对于session复制,简单的几台还是可以的,但是如果上百台甚至上千台就要考虑复制成本问题了。1 c. H4 Z: }7 h& p2 @ F3 T
6 ~5 ?. C+ \% t/ }- k: [
对于统一session管理可以是关系型数据库,比如MySql(基本不用,考虑到效率问题);非关系型数据库 redis,memcache等等。4 [, V4 o1 L3 f8 V
5 Q: l [3 ^$ p* g' y6 c: H解决方案
2 x* h2 _6 h1 u6 J9 k- Z( E* }# b+ W4 N! o0 {' K( u& M5 I
基于Tomcat的会话插件实现tomcat-redis-session-manager 和tomcat-memcache-session-manager,会话统一由NoSql管理。对于项目本身来说,无须改动代码,只需要简单的配置Tomcat的server.xml就可以解决问题。但是插件太依赖于容器,并且对于Tomcat各个版本的支持不是特别的好
* i; l: P9 C& |; I
; H7 |. P* m! y% [$ w重写Tomcat的session管理,代码耦合度高,不利于维护。* h) T2 }5 {. G; a; ?
. l! N. A" x+ E9 z* o, h使用开源的session管理框架,比如spring_session,既不需要修改Tomcat配置,又无须重写代码,只需要配置相应的参数即可。- C: j$ \- e4 }+ h. i& H$ @
& x( x/ a) i* W6 o4 |* @9 }9 G+ m- w2 p% c( }
更多关注博客:http://blog.52itstyle.com/archives/759/9 W& m8 U4 u1 U8 [
|
|