Session共享三种方式
1.nginx基于ip_hash负载均衡。
只需要更改nginx.conf配置文件。添加ip_hash就可以了。
缺点:1.由于ip_hash分配tomcat的时候用的是除法,所以新添加一台服务器会导致分配不到原来程序上,session会丢失。2.同一个公网ip访问时,ngnix会分到tomcat1上面,后面所有的同一公网下的内网路由访问都会分配到tomcat1上,还是会造成单台设备服务压力大3.单台服务器挂了后会导致session丢失。需要用户重新登录
2.服务器session复制
操作:修改tomcat配置文件
- 修改server.xml中的Cluster节点;
<Cluster className=”org.apache.catalina.ha.tcp.SimpleTcpCluster”>
- 修改应用web.xml,增加节点:<distributable />
优点:
对应用无侵入性,不需要修改代码
能适应各种负载均衡策略
服务器重启或宕机不会造成session丢失
安全性较高
缺点:
Session同步会有一定的延时
占用内网带宽资源
受制于内存资源,水平扩展能力差
序列化反序列化消耗CPU性能
3.session统一缓存
配置步骤:修改应用的配置文件
- 增加redis client和spring session的依赖;
- 修改web.xml,增加filter:springSessionRFilter;
- 修改spring配置文件,在容器中注入spring session和redis相关的bean;
1.
<!--spring session的依赖 -->
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
<version>1.2.1.RELEASE</version>
</dependency>
<!—redis client的依赖 -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.8.1</version>
</dependency>
2.
<filter>
<filter-name>springSessionRepositoryFilter</filter-name>
<filter-class>
org.springframework.web.filter.DelegatingFilterProxy
</filter-class>
</filter>
<filter-mapping>
<filter-name>springSessionRepositoryFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
3.
<bean id="redisHttpSessionConfiguration"
class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration" scope="singleton">
<property name="maxInactiveIntervalInSeconds" value="600" />
</bean>
<bean id=”jedisPoolConfig” class=”redis.clients.jedis.JedisPoolConfig”>
<property name=”maxTotal” value=”100” />
<property name=”maxIdle” value=”10”/>
</bean>
<bean id=”jedisCOnnectionFactory”
Class=”org.springframework.data.redis.connection.jedis.JedisConnectionFactory” destroy-method=”destroy”>
<property name=”hostName” value=”localhost” />
<property name=”port” value=”6379” />
<property name=”timeout” value=”3000” />
<property name=”usePool” value=”true” />
<property name=”poolConfig” ref=”jedisPoolConfig” />
</bean>
注意的坑:修改应用的配置文件
- 放置在session中的对象必须是可序列化的;
- springSessionRepositoryFilter的顺序要在其他获取session的filter的之前
- session的失效时间由redis节点失效时间决定,原有的配置不起作用
- 登出的时候,一定确保显示的调用了session.invalidate();
Session统一缓存
优点:
能使用各种负载均衡策略
服务器重启或宕机不会造成session丢失
安全性较高
扩展能力强
适合集群数量大时使用
缺点:
对应用有入侵,需要增加相关配置
增加一次网络开销,用户体验降低
序列化反序列化消耗CPU性能
4.redis+tomcat实现session共享
1.tomcat的lib下引入jar包:commons-pool2-2.0.jar、jedis-2.5.2.jar、tomcat-redis-session-manager1.2.jar
2.修改tomcat的conf下的context.xml
3.tomcat7和tomcat8区别在tomcat-redis-session-manager这个jar包上
jar下载地址:
tomcat7:链接:https://pan.baidu.com/s/1ITUDNDhpp3hl3nXEE5EW9w
提取码:amcn
tomcat8:链接:https://pan.baidu.com/s/1fwVU8uaKtAkJQEgPqzx_FQ
提取码:j1ax
总结:
Session统一缓存适应于:
大型分布式环境下首选
专业的工具用在专业的地方
可扩展性和健壮性强
基于ip_hash负载均衡
较大分布式环境下可选
对应无侵入性
配置简单,可扩展性强
服务器session复制
小型分布式环境首选
对应用无侵入性
健壮性和用户体验较好