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下載安裝配置,全部都過了一遍。如果有博友在實現過程中仍有問題,可以留言交流探討。




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