在网站访问量急剧上升时,通常需要使用集群的方法进行横向扩展。
对于没有状态的应用来说,直接用nginx进行处理即可。
但对于有状态的应用来说,比如登录状态等,除了使用nginx进行扩展外,就需要考虑到Session共享的问题了。
大家知道可以用apache+tomcat来实现Session共享,但效率太低了,而且容易出错。
今天说的主要是用nginx+tomcat+redis+tomcat-redis-session-manager的方式实现共享。
原理比较简单:
1、tomcat-redis-session-manage扩展了 org.apache.catalina.valves.ValveBase; org.apache.catalina.session.ManagerBase; org.apache.catalina.session.StandardSession; 并通过Tomcat配置,替代了这几个类。 2、Set属性时,用session id作为key,将Tomcat的整个Session拆分为SessionSerializationMetadata+RedisSession然后序列化为byte[],存放到Redis。 3、Get属性时,用session id作为key,从Redis获取byte[],然后反序列化为SessionSerializationMetadata+RedisSession,供Tomcat使用。
配置也很简单:
1、从github下载源码tomcat-redis-session-manager
2、用gradle进行编译
#master分支下面,要把signing段和uploadArchives段删掉,才能正常编译 #release就不需要了 gradle build
3、将三个Jar包拷贝到Tomcat的lib文件夹下
#%TOMCAT_HOME%/lib tomcat-redis-session-manager-master-2.0.0.jar commons-pool2-2.2.jar jedis-2.5.2.jar
4、修改context.xml配置文件,新增下面内容就搞定咯
<!--%TOMCAT_HOME%/conf/context.xml--> <Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" /> <Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager" host="localhost" port="6379" database="0" maxInactiveInterval="60"/>
好处是:不需要修改应用
坏处是:要耗费一定的时间来(序列化+保存到Redis)、(反序列化+从Redis读取)。