实现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共享。

  • 实现步骤
  1. docker部署nginx,nginx.conf配置文件。
  2. docker 部署redis
  3. 制作tomcat7镜像
  4. 导入第三方jar,修改tomcat配置,使其支持redis管理session功能
  5. docker 部署tomcat1和tomcat2
  6. 访问测试
  • 具体细节实现
  1. nginx安装和配置同上一章,配置文件,启动nginx容器

docker run –p 80:80 --name mynginx –v /data/nginx/conf/nginx.conf:/etc/nginx/nginx.conf –d nginx(启动容器)

docker logs mynginx(查看日志)

  1. 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

结果如下:

  1. 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

    1. 下载ubuntu镜像

docker pull index.alauda.cn/alauda/ubuntn

3.2在主机/data/software/文件下面准备jdk7和tomcat7

    1.  启动容器,并编辑配置文件

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

  1. docker 部署tomcat1和tomcat2
    1. 准备配置文件

context.xml /data/testfile/context.xml

在/data/testfile/tomcat1/下准备setsession.jsp

在/data/testfile/tomcat2下准备getsession.jsp

    1. 启动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挂载到相应目录

    1. 启动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

  1. 访问测试

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共享。

  • 总结
  1. 采用开源项目tomcat-redis-session-manager,目前该项目仅仅支持tomcat7

发现采用docker pull tomcat中tomcat版本为tomcat8,因此需要自己根据ubuntu镜像制作tomcat7镜像。

  1. 支持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

  1. pom.xml

需要jar包:

spring-data-redis  spring-session commons-pool2  jedis

  1. web.xml

配置spring-session的filter

  1. applicaiton-context.xml

  1. views session redis

 

可以首先尝试使用spring-session来实现共享session,便于配置和使用,同时也便于移植。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐