前言:
本系列文章的目的,在于记录下来本人本次实现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包如下图所示:
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地址和端口。
在
其中,host是redis的地址,port是redis的端口号
3、重启两台tomcat
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下载安装配置,全部都过了一遍。如果有博友在实现过程中仍有问题,可以留言交流探讨。