实现web集群共享session以后给出两种实现方案,一种是tomcat服务器层面实现,一种是代码层面实现。
一. Docker+Ngnix+Redis+Tomcat实现共享session
- 整体结构
如图所示:服务器启动4个docker容器nginx,tomcat1,tomcat2,redis,分别映射到服务器的80,18080,28080,6379端口。Tomcat /conf/context.xml配置RedisSessionManager节点,监听6379端口。tomcat1 root目录下setsession.jsp设置session的值保存到redis,访问tomcat2 root目录下的getsession.jsp取出保存的session值,从而实现session共享。
- 实现步骤
- docker部署nginx,nginx.conf配置文件。
- docker 部署redis
- 制作tomcat7镜像
- 导入第三方jar,修改tomcat配置,使其支持redis管理session功能
- docker 部署tomcat1和tomcat2
- 访问测试
- 具体细节实现
- nginx安装和配置同上一章,配置文件,启动nginx容器
docker run –p 80:80 –name mynginx –v /data/nginx/conf/nginx.conf:/etc/nginx/nginx.conf –d nginx(启动容器)
docker logs mynginx(查看日志)
- docker redis
docker search redis
docker pull redis
docker run -p 6379:6379 -d redis redis-server –appendonly yes
命令说明:
-p 6379:6379 :将容器的6379端口映射到主机的6379端口
-v $PWD/data:/data :将主机中当前目录下的data挂载到容器的/data
redis-server –appendonly yes :在容器执行redis-server启动命令,并打开redis持久化配置.
测试redis是否安装成功
docker run –it redis redis-cli –h 10.104.15.62
结果如下:
- tomcat支持redis管理session—制作tomcat7镜像。
说明:采用开源项目tomcat-redis-session-manager
https://github.com/jcoleman/tomcat-redis-session-manager/downloads
目前该项目支持tomcat7版本,需要的jar包有:
特别注意,jedis版本不能过高,否则会出现jar版本不兼容。而docker pull tomcat中tomcat版本为tomcat8,版本不兼容,因此首先自己制作tomcat7镜像。
参考地址:
http://www.cnblogs.com/Leo_wl/p/5035437.html
- 下载ubuntu镜像
docker pull index.alauda.cn/alauda/ubuntn
3.2在主机/data/software/文件下面准备jdk7和tomcat7
- 启动容器,并编辑配置文件
docker run –i –t –v /data/software/:/data/software/ –name myubuntu index.alauda.cn/alauda/ubuntu /bin/bash
cd /data/software主机文件已经挂载到容器/data/software/目录下:
安装jdk和tomcat:
tar -zxvf jdk-7u25-linux-x64.tar.gz -C /data/
mv jdk1.7.0_25 jdk
tar apache-tomcat-7.0.54.tar.gz -C /data/
mv apache-tomcat-7.0.54 tomcat
配置环境变量:
vi /etc/profile
#set java environment
export JAVA_HOME=/data/jdk
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:{JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
export CATALINA_HOME=/data/tomcat
export CATALINA_BASE=/data/tomcat
保存并退出,设置立即生效:
source /etc/profile
编写启动脚本
vi /data/start.sh
#!/bin/bash
# Export environment variable
source /etc/profile
# Start tomcat
bash /data/tomcat/bin/catalina.sh run
添加可执行权限:
chmod u+x /data/start.sh
3.3 保存上述设置为新的tomcat7镜像
docker commit myubuntu iyangcong/tomcat7
测试tomcat:
Docker run –d –p 9090:8080 –name mytomcat7 iyangcong/tomcat7 /data/start.sh
浏览器访问10.104.15.62:9090,可知tomcat7安装成功。
4.导入第三方jar,修改tomcat配置,使其支持redis管理session功能
启动新制作的镜像的一个容器,名字为mytomcat
docker run –name mytomcat –d iyangcong/tomcat7
4.1 /data/testfile/context.xml 编辑配置文件:
在context下面添加:
<Valve className="com.radiadesign.catalina.session.RedisSessionHandlerValve" />
<Manager className="com.radiadesign.catalina.session.RedisSessionManager"
host="localhost"
port="6379" />(注意为****valve)
4.2 /data/testfile/jar目录下准备4个jar
将上述
comons-pool-1.5.4.jar,
commons-pool2-2.4.1.jar,
jedis-2.1.0.jar,
tomcat-redis-session-manager-1.2-tomcat7.jar
四个jar复制到容器/data/tomcat/lib(自己制作tomcat镜像tomcat lib所在目录下)
docker cp /data/testfile/ comons-pool-1.5.4.jar mytomcat:/data/tomcat/lib
docker cp /data/testfile/ commons-pool2-2.4.1.jar mytomcat:/data/tomcat/lib
docker cp /data/testfile/ jedis-2.1.0.jar mytomcat:/data/tomcat/lib
docker cp /data/testfile/ tomcat-redis-session-manager-1.2-tomcat7.jar mytomcat:/data/tomcat/lib
保存上述设置为新的镜像:
docker commit mytomcat tomcat-redis
-
docker 部署tomcat1和tomcat2
-
准备配置文件
context.xml /data/testfile/context.xml
在/data/testfile/tomcat1/下准备setsession.jsp
在/data/testfile/tomcat2下准备getsession.jsp
- 启动tomcat1
docker run –p 18080:8080 –name tomcat-redis1
–v /data/testfile/context.xml:/data /tomcat/conf/context.xml
–v /data/testfile/tomcat1:/data/tomcat/webapps/ROOT
–d tomcat-redis
将配置文件和jsp挂载到相应目录
- 启动tomcat2
docker run –p 28080:8080 –name tomcat-redis2
–v /data/testfile/context.xml:/data/tomcat/conf/context.xml
–v /data/testfile/tomcat2:/data/tomcat/webapps/ROOT
–d tomcat-redis
- 访问测试
docker ps 查看一下正在运行的容器,以及相应的端口映射。
tomcat-redis1
tomcat-redis2
frevent_stonebraker
mynginx
此时浏览器访问:10.104.15.62:18080/setsession.jsp
Redis中Session中应该已经保存了id和name两个属性值。
浏览器访问:10.104.15.62:28080/getsession.jsp
可知由tomcat1中jsp设置的session中属性值,已经共享到tomcat2jsp中,从而实现了session共享。
- 总结
- 采用开源项目tomcat-redis-session-manager,目前该项目仅仅支持tomcat7
发现采用docker pull tomcat中tomcat版本为tomcat8,因此需要自己根据ubuntu镜像制作tomcat7镜像。
- 支持tomcat-redis-session-manager使用的jar包有4个,而jedis版本不能过高,否则会出现各种jar包不兼容问题,这里使用jedis-2.1.0.jar。
2.支持tomcat-redis-session-manager使用的jar包有4个,而jedis版本不能过高,否则会出现各种jar包不兼容问题,这里使用jedis-2.1.0.jar。
二.spring-session+redis代码层面实现共享session
Spring-session实现tomcat共享session
官方参考文档:
http://docs.spring.io/spring-session/docs/1.0.2.RELEASE/reference/html5/\#httpsession-redis-xml
- pom.xml
需要jar包:
spring-data-redis spring-session commons-pool2 jedis
- web.xml
配置spring-session的filter
-
applicaiton-context.xml
-
views session redis