以前在做这种分布式部署的时候,习惯性的用nginx里面配置上iphash的方式,简单,不用配置什么就可以。但是这种方式有种种问题。于是,抽空研究了session共享。session共享大概有一下几种方式:
1. 客户端cookie加密的方式
2. web server的session复制方式
3. 使用关系数据库保存session
4. 使用nosql数据库保存session
5. 采用Session Stick
6. 使用terracotta来保存session
文章http://blog.csdn.net/mr_smile2014/article/details/50211677,详细说明了他们的优缺点。
通过分析,我选择用nosql的方式进行session共享,网上很多说明共享的方式,我选择利用redis方式进行配置。
1、根pom.xml配置相关包
<!-- redis配置 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.4.2</version>
</dependency>
<dependency> <groupId>org.springframework.session</groupId>
<artifactId>spring-session</artifactId>
<version>1.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
<version>1.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>1.6.1.RELEASE</version>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.7.2</version>
</dependency>
2、基础pom中引进
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
3、配置ctx-redis.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd"
default-autowire="byName">
<bean
class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration" />
<bean
class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
<property name="port" value="${redis.port}"></property>
<property name="hostName" value="${redis.ip}"></property>
</bean>
</beans>
4、配置ip、port相关文件redis.properties
redis.pool.maxActive=1024
redis.pool.maxIdle=200
redis.pool.maxWait=1000
redis.pool.testOnBorrow=true
#IP
redis.ip=127.0.0.1
#Port
redis.port=6379
redis.timeout=15000
5、引入redis.properties
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="ignoreUnresolvablePlaceholders" value="true" />
<property name="locations">
<list>
<value>classpath:jdbc.properties</value>
<value>classpath:important.properties</value>
<value>classpath:redis.properties</value>
</list>
</property>
</bean>
6、引入ctx-redis.xml
<import resource="classpath*:ctx-redis.xml" />
7、在web.xml中配置过滤
<!-- redis的session共享 -->
<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>
ok,配置完成了,你可以敬请的使用了。嘿,别高兴的太早了,我使用的时候结果就是报错,原因主要由以下两点引起:
- spring版本号错误
redis服务器版本号错误
确保你的spring使用的是4.1.7.RELEASE及以上,我使用的版本为4.1.7.RELEASE。
确保你redis服务器为2.8以上的,我使用的为3.0.5版本。
替换成响应版本后,应该就可以,当然替换spring版本,不是那么容易,很容易报一堆缺包的错误,你需要确认你的maven库里面有对应的包,如果没有自动下载成功,你需要到search.maven.org里面自己找到下载后放到相应目录就行了。
代码上可以跑起来了,下面就进行多个服务器的配置了。我选择两个服务器,端口分别为8080、8090,将相关包放在tomcat中启动这两个tomcat。
在nginx中配置如下:
upstream hdd {
#weigth参数表示权值,权值越高被分配到的几率越大
server 127.0.0.1:8080 weight=1;
server 127.0.0.1:8090 weight=1;
}
###服务器配置
server {
listen 80;
server_name www.hdd.com;
location / {
proxy_pass http://hdd;
proxy_redirect off;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 32m;
client_body_buffer_size 128k;
proxy_connect_timeout 8;
proxy_send_timeout 90;
proxy_read_timeout 90;
}
}
修改自己的hosts配置文件
127.0.0.1 www.hdd.com
启动redis,nginx,然后通过www.hdd.com访问,你就可以进入自己的主页了。再浏览器中测试,将sessionId打印出来,观察在两个tomcat中的sessionId的值。
也可以观察redis中数据变化,redis中常见命令汇总:
http://www.cnblogs.com/kreo/p/4399612.html
参考资料: