Nginx+Tomcat+Redis实现负载均衡与Session共享之五 — Nginx+Tomcat+Redis实现Session共享

前言:

      本系列文章的目的,在于记录下来本人本次实现Nginx+Tomcat+Redis实现负载均衡,tomcat集群并同时解决Session共享整个流程的攻坚细节。在这个过程中也在网上搜索了许多资料,但是发现许多资料都不完全,有许多遗漏,学习使用起来会碰到许多错误却没有解决办法。秉着一个交流学习的原则,这次我将从Java的JDK安装起到整个集群的实现,将每一个细节点都记录下来。使学习者通俗易懂,大家都能跟着步骤一步步搭建并成功运行。

PS:本次搭建是在Win环境下实现,后续本人将在Linux环境下搭建运行,并仍会写成博客记录下来。


一、概述

      上节我们介绍了nginx(反向代理/负载均衡)+tomca(集群),但是存在一个问题,就是session并没有共享。我们可以看见每次访问,都跳转到不同的tomcat(因为轮训机制,并且权重都设置了1),但是session也一直在改变。这篇博文,我们就来通过redis来实现session共享。

二、环境配置

      测试环境是基于WinServer 2012 R2,tomcat、nginx、redis的配置如下

     

      1、tomcat、nginx下载、配置请见:http://blog.csdn.net/xie_xiansheng/article/details/78042176

      2、redis下载启动请见:http://blog.csdn.net/xie_xiansheng/article/details/78041623


三、编译 tomcat-redis-session-manager-master

      1、根据作者的源码构建编译 tomcat-redis-session-manager-master 基于gradle,需要先配置gradle环境

        下载并配置gradle请见:http://blog.csdn.net/xie_xiansheng/article/details/78041858

     

      2、从github上下载 tomcat-redis-session-manager-master的源码,github地址如下

        https://github.com/jcoleman/tomcat-redis-session-manager

        PS:直接选择master节点下载,不要下载其他版本

     



      3、解压源码后,找到路径下的build.gradle文件。可看出作者使用了第三方仓库(sonatype),需要注册账号,否则build会报错。直接注释后使用maven中央仓库,同时注释签名相关脚本并增加依赖包的输出脚本copyJars(dist目录)。最后的build.gradle文件如下所示:


apply plugin: 'java'
apply plugin: 'maven'
apply plugin: 'signing'

group = 'com.orangefunction'
version = '2.0.0'

repositories {
  mavenCentral()
}

compileJava {
  sourceCompatibility = 1.7
  targetCompatibility = 1.7
}

dependencies {
  compile group: 'org.apache.tomcat', name: 'tomcat-catalina', version: '7.0.81'
  compile group: 'redis.clients', name: 'jedis', version: '2.5.2'
  compile group: 'org.apache.commons', name: 'commons-pool2', version: '2.2'
  //compile group: 'commons-codec', name: 'commons-codec', version: '1.9'

  testCompile group: 'junit', name: 'junit', version: '4.+'
  testCompile 'org.hamcrest:hamcrest-core:1.3'
  testCompile 'org.hamcrest:hamcrest-library:1.3'
  testCompile 'org.mockito:mockito-all:1.9.5'
  testCompile group: 'org.apache.tomcat', name: 'tomcat-coyote', version: '7.0.27'
}

task javadocJar(type: Jar, dependsOn: javadoc) {
  classifier = 'javadoc'
  from 'build/docs/javadoc'
}

task sourcesJar(type: Jar) {
  from sourceSets.main.allSource
  classifier = 'sources'
}

artifacts {
  archives jar

  archives javadocJar
  archives sourcesJar
}

//signing {
//  sign configurations.archives
//}

task copyJars(type: Copy) {
  from configurations.runtime
  into 'dist'  
}

uploadArchives {
  repositories {
    mavenDeployer {
      beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) }

      //repository(url: "https://oss.sonatype.org/service/local/staging/deploy/maven2/") {
      //  authentication(userName: sonatypeUsername, password: sonatypePassword)
      //}
      //repository(url: "https://oss.sonatype.org/content/repositories/snapshots") {
      //  authentication(userName: sonatypeUsername, password: sonatypePassword)
      //}

      pom.project {
        name 'tomcat-redis-session-manager'
        packaging 'jar'
        description 'Tomcat Redis Session Manager is a Tomcat extension to store sessions in Redis'
        url 'https://github.com/jcoleman/tomcat-redis-session-manager'

        issueManagement {
          url 'https://github.com:jcoleman/tomcat-redis-session-manager/issues'
          system 'GitHub Issues'
        }

        scm {
          url 'https://github.com:jcoleman/tomcat-redis-session-manager'
          connection 'scm:git:git://github.com/jcoleman/tomcat-redis-session-manager.git'
          developerConnection 'scm:git:[email protected]:jcoleman/tomcat-redis-session-manager.git'
        }

        licenses {
          license {
            name 'MIT'
            url 'http://opensource.org/licenses/MIT'
            distribution 'repo'
          }
        }

        developers {
          developer {
            id 'jcoleman'
            name 'James Coleman'
            email '[email protected]'
            url 'https://github.com/jcoleman'
          }
        }
      }
    }
  }
}


      4、cd到源码路径下,执行gradle build(或 gradle build -x test  copyJars)命令构建源码,编译 tomcat-redis-session-manager-master及依赖的jar包

        提示不用理会。所使用的过时API是设置session时效性的API,可以忽略


     


      5、编译成功后,..\tomcat-redis-session-manager-1.2-tomcat-7\tomcat-redis-session-manager-master\build\libs目录下,可以找到编译成功的jar包

        tomcat-redis-session-manager-master-2.0.0.jar

     

      6、在 C:\Users\Administrator\.gradle\caches\modules-2\files-2.1目录下,可以找到其余的依赖jar包(主要是tomcat-redis-session-manager-master-2.0.0.jar 这个jar包,其余jar包即使找不到也可以通过maven下载,能编译成功肯定代表maven中央仓库存在这些jar包)


        最后编译成功的全部jar包如下图所示:

     


四、tomcat配置文件修改

      1、将编译成功的jar包复制到两个tomcat的 \apache-tomcat-7.0.81\lib 目录下


      2、分别修改2台 tomcat 的 context.xml 文件(路径\apache-tomcat-7.0.81\conf\context.xml),使 tomcat-redis-session-manager-master 作为session管理器,同时指定redis地址和端口。

        在<Context>标签内添加:     

<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />
<Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
     host="localhost"
     port="6379"
     database="0"
     maxInactiveInterval="60" />

      其中,host是redis的地址,port是redis的端口号


      3、重启两台tomcat


五、session共享测试

      1、启动顺序:redis、nginx、tomcat*2

      2、在浏览器输入localhost:8080,多次刷新

    

 

     


      3、可见不论怎么刷新,session都是同一个。并且打开redis服务端窗口,可见redis已经开始服务,session共享完成!

        PS:如若项目中有调用 request.getSession().setAttribute()方法,并且set进javaBean的话,那这个javaBean一定要实现 Serializable 进行序列化,否则会报错。因为redis存储的存储机制问题,存储在redis中的对象都要经过序列化。


 



最后的话:

       本次在Win下搭建nginx(负载均衡)+tomcat(集群)+redis(session共享)整个实例已经完结。也奋斗了一天多,付出了许多心血。这也是自己学习成长的一步,希望对其它想要学习的博友也能起到帮助。整个过程我已经做到尽量的明细,并且是本人亲测过的整个流程,从java环境搭建开始到redis、nginx、tomcat、gradle下载安装配置,全部都过了一遍。如果有博友在实现过程中仍有问题,可以留言交流探讨。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章