redis之通過(guò)redisson實(shí)現(xiàn)tomcat+redis的session共享

一.常見(jiàn)的session共享方案

1.使用nginx的ip_hash

使用ip綁定ip_hash算法時(shí),用戶的請(qǐng)求都會(huì)綁在同一個(gè)節(jié)點(diǎn)服務(wù)器上,這樣的設(shè)置會(huì)導(dǎo)致一臺(tái)或多臺(tái)服務(wù)器過(guò)載無(wú)法提供服務(wù),而后端正常的服務(wù)器無(wú)法提供服務(wù),當(dāng)綁定的服務(wù)器掛了,用戶只能重啟瀏覽器后才能重新訪問(wèn),這樣用戶體驗(yàn)度極差,除了特殊需要,不建議使用這種機(jī)制實(shí)現(xiàn)session共享。

2.基于服務(wù)端的session共享

1)服務(wù)端的session復(fù)制

session復(fù)制是指session信息會(huì)在集群節(jié)點(diǎn)之間復(fù)制,每個(gè)節(jié)點(diǎn)服務(wù)器上都會(huì)有session信息。
優(yōu)點(diǎn):即使一個(gè)節(jié)點(diǎn)服務(wù)器掛了,只要還有服務(wù)器可以提供服務(wù),就不會(huì)影響用戶使用。
缺點(diǎn):服務(wù)器之間通信頻繁,效能感應(yīng)速度有影響,多并發(fā)、高頻率操作的情況下性能下降比較明顯。
這里提供一個(gè)實(shí)現(xiàn)方法的鏈接地址:https://www.cnblogs.com/ouyida3/p/9425027.html

2)session共享

將session緩存之內(nèi)存或保存在本地文件中,使用redis/memcached/file來(lái)實(shí)現(xiàn)。

3)session持久化

將session存儲(chǔ)在數(shù)據(jù)庫(kù)中,像操作數(shù)據(jù)一樣操作session。

二.session應(yīng)用方案

解決session共享的問(wèn)題,網(wǎng)上有很多的解決方案,比如通過(guò)memcached來(lái)實(shí)現(xiàn),通過(guò)redis來(lái)實(shí)現(xiàn),很多人都是通過(guò)jcoleman的redis解決方案,但是此方案僅支持tomcat6和7,如果要支持tomcat8或9需要修改代碼,然后打包部署,非常麻煩。不建議使用。
這里主要介紹一個(gè)更為簡(jiǎn)單的方案:redisson,支持最新的jdk和各個(gè)版本的tomcat,官方網(wǎng)站:https://redisson.org/redisson是redis官網(wǎng)推薦的java語(yǔ)言實(shí)現(xiàn)的分布式鎖項(xiàng)目。該項(xiàng)目還包括很多的分布式結(jié)構(gòu)項(xiàng)目,這里主要使用的是redisson提供的tomcat session manager 功能。
tomcat session 共享的githu的地址:https://github.com/redisson/redisson/tree/master/redisson-tomcat

三.場(chǎng)景規(guī)劃與地址分配

首先說(shuō)明一下實(shí)踐的應(yīng)用環(huán)境

對(duì)應(yīng)服務(wù)安裝的主機(jī)如上表,通過(guò)實(shí)現(xiàn)web01和web02的負(fù)載均衡,進(jìn)而判斷兩個(gè)tomcat示例是否實(shí)現(xiàn)了session共享。

四.nginx+tomcat+redis部署過(guò)程

1.redis安裝部署

1)redis安裝

redis安裝比較簡(jiǎn)單,這里直接使用yum進(jìn)行安裝。

[root@db01 ~]#  yum -y install redis

2)配置redis并啟動(dòng)

#打開(kāi)redis配置文件/etc/redis.conf,修改配置文件內(nèi)容
[root@db01 ~]# vim /etc/redis.conf 
bind 127.0.0.1 172.16.1.51
#保存退出并啟動(dòng)redis
[root@db01 ~]# systemctl start redis
[root@db01 ~]# systemctl enable redis

2.tomcat安裝部署

1.安裝tomcat
部署tomcat之前,需要先安裝jdk,這里選擇jdk1.8版本,從orcal官網(wǎng)下載linux-64版本的JDK,下載時(shí)選擇自己機(jī)器適合的版本運(yùn)行即可,oracle官網(wǎng)提供的JDK都是二進(jìn)制版本的,因此,JDK的安裝非常簡(jiǎn)單,只需要下按在下來(lái)的程序包解壓到相應(yīng)的目路下即可。(這里是下載orecle官方的安裝包然后后上傳安裝)

#方法一
[root@web01 ~]# yum -y localinstall jdk-8u102-linux-x64.rpm 
[root@web01 ~]# mkdir /app
[root@web01 ~]# tar xf apache-tomcat-8.0.27.tar.gz -C /app
#簡(jiǎn)化名稱
[root@web01 /app]# mv apache-tomcat-8.0.27 tomcat
#啟動(dòng)tomcat
[root@web01 /app/tomcat]# /app/tomcat/bin/startup.sh
#方法二
[root@web01 ~]# mkdir /app/
[root@web01 ~]# tar xf jdk-8u60-linux-x64.tar.gz -C /app/
[root@web01 ~]# ln -s /app/jdk1.8.0_60 /app/jdk
[root@web01 ~]# sed -i.ori '$a export JAVA_HOME=/app/jdk\nexport PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH\nexport CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar' /etc/profile
[root@web01 ~]# source /etc/profile
[root@web01 ~]# tar xf apache-tomcat-8.0.27.tar.gz -C /app
[root@web01 ~]# /app/apache-tomcat-8.0.27/bin/startup.sh 

3.tomcat與redis整合實(shí)現(xiàn)session共享

接下來(lái)就是配置tomcat和readis整合,實(shí)現(xiàn)session管理,需要如下兩個(gè)步驟。

1)部署jar包

根據(jù)github上的說(shuō)明,需要下載兩個(gè)jar包,根據(jù)現(xiàn)有的環(huán)境,需要下載redisson-all-3.11.5.jar和redisson-tomcat-8-3.11.5.jar,這兩個(gè)jar包都可以從https://github.com/redisson/redisson/tree/master/redisson-tomcat
下載。
將下載下來(lái)的jar包放到$TOMCAT_BASE/lib($TOMCAT_BASE是指tomcat的安裝目錄)目錄下,這里的路徑就是指/app/tomcat/lib。

2)增加RedissonSessionManager配置

此步驟就是在$TOMCAT_BASE/conf/context.xml中,添加如下配置

<Manager className="org.redisson.tomcat.RedissonSessionManager"
  configPath="${catalina.base}/conf/redisson.conf" 
  readMode="REDIS" updateMode="DEFAULT"/>

然后在${catalina.base}/conf/創(chuàng)建redisson.conf文件,文件內(nèi)容如下:

[root@web01 /app/tomcat/conf]# vim redisson.conf
{
   "singleServerConfig":{
      "idleConnectionTimeout":10000,
      "connectTimeout":10000,
      "timeout":3000,
      "retryAttempts":3,
      "retryInterval":1500,
      "password":null,
      "subscriptionsPerConnection":5,
      "clientName":null,
      "address": "redis://172.16.1.51:6379",
      "subscriptionConnectionMinimumIdleSize":1,
      "subscriptionConnectionPoolSize":50,
      "connectionMinimumIdleSize":32,
      "connectionPoolSize":64,
      "database":0,
      "dnsMonitoringInterval":5000
   },
   "threads":0,
   "nettyThreads":0,
   "codec":{
      "class":"org.redisson.codec.FstCodec"
   },
   "transportMode":"NIO"
}

需要注意這里的"address"一項(xiàng)的值,如果tomcat和redis安裝在一起,可以寫(xiě)成127.0.0.1:6379,如果redis在獨(dú)立的一臺(tái)服務(wù)器上,就寫(xiě)redis所在機(jī)器的ip地址。這里redis所在的主機(jī)的ip為172.16.1.51,所以就寫(xiě)上面的地址即可。到此tomcat與redis的互聯(lián)配置完成。

4.測(cè)試獲取session

在tomcat的$TOMCAT_BASE/webapps/ROOT目錄下創(chuàng)建一個(gè)session.jsp內(nèi)容如下:

[root@web01 /app/tomcat/webapps/ROOT]# vim session.jsp
<html>
<head>
<title>test1</title>
</head>
<body>
    SessionID is
    <%=session.getId()%>
    <BR> SessionIP is
    <%=request.getServerName()%>
    <BR> SessionPort is
    <%=request.getServerPort()%>
    <%
        out.println("Response from tomcat1");
    %>
</body>
</html>

接著,先關(guān)閉tomcat,之后再啟動(dòng)

[root@web01 /app/tomcat/bin]# ./shutdown.sh
[root@web01 /app/tomcat/bin]# ./startup.sh

啟動(dòng)tomcat后,在瀏覽器中訪問(wèn):http://10.0.0.7:8080/session.jsp


然后登陸redis客戶端進(jìn)行查看

[root@db01 ~]# redis-cli
127.0.0.1:6379> keys *
1) "redisson:tomcat_session:CEA8347FDF151A82ED8B08A59120ED55"
127.0.0.1:6379> 

5.部署第二臺(tái)tomcat實(shí)例

第二臺(tái)與第一臺(tái)部署全部一樣這里不在過(guò)多描述,為了區(qū)分,這里只需要將測(cè)試的文件session.jsp稍作修改,具體內(nèi)容如下:

[root@web02 /app/tomcat/webapps/ROOT]# vim session.jsp 
<html>
<head>
<title>test2</title>
</head>
<body>
    SessionID is
    <%=session.getId()%>
    <BR> SessionIP is
    <%=request.getServerName()%>
    <BR> SessionPort is
    <%=request.getServerPort()%>
    <%
        out.println("Response from tomcat2");
    %>
</body>
</html>

修改完成后,先關(guān)閉tomcat,之后再啟動(dòng),通過(guò)瀏覽器訪問(wèn):http://10.0.0.8:8080/session.jsp


然后登陸redis客戶端進(jìn)行查看

[root@db01 ~]# redis-cli
127.0.0.1:6379> keys *
1) "redisson:tomcat_session:CEA8347FDF151A82ED8B08A59120ED55"
127.0.0.1:6379> keys *
1) "redisson:tomcat_session:CEA8347FDF151A82ED8B08A59120ED55"
2) "redisson:tomcat_session:AAB9C0437D53573FB9C60565F345A63D"
127.0.0.1:6379> http://10.0.0.8:8080/session.jsp

說(shuō)明:通過(guò)上圖可以看到,兩次訪問(wèn)得到session信息不一樣,這是正常的現(xiàn)象。

6.部署nginx負(fù)載均衡

1.使用nginx官方源進(jìn)行安裝。

i.使用vi /etc/yum.repos.d/nginx.repo創(chuàng)建nginx.repo源文件。
按下i鍵,添加以下內(nèi)容。

[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

ii.按下Esc鍵,輸入:wq并回車以保存并關(guān)閉文件。
iii.下載安裝nginx。

[root@web01 ~]# yum -y install nginx

iv.啟動(dòng)nginx并設(shè)置開(kāi)機(jī)自啟動(dòng)

[root@web01 ~]#systemctl start nginx
[root@web01 ~]#systemctl enable nginx
2.配置nginx負(fù)載均衡

打開(kāi)nginx配置文件nginx.conf,重點(diǎn)配置如下內(nèi)容:

[root@lb01 /etc/nginx]# vim nginx.conf 
upstream zrlog_pools {
  server 172.16.1.7:8080;
  server 172.16.1.8:8080;
 }
server {
    listen 80;
    server_name zrlog.session.com;
    location / {
    proxy_pass http://zrlog_pools;
    include proxy_params;
   }
}
#保存退出,檢查語(yǔ)法并檢查語(yǔ)法
   [root@lb01 /etc/nginx]# nginx -t
   [root@lb01 /etc/nginx]# systemctl restart nginx                        

五.測(cè)試nginx+tomcat+redis的共享功能

首先在本地hosts配置域名解析,將zrlog.session.com解析到lb01的公網(wǎng)ip:10.0.0.5。
之后在瀏覽器上測(cè)試訪問(wèn):http://zrlog.session.com/session.jsp
測(cè)試結(jié)果如下:

登錄redis客戶端查看結(jié)果如下:

[root@db01 ~]# redis-cli
127.0.0.1:6379> keys *
1) "redisson:tomcat_session:CEA8347FDF151A82ED8B08A59120ED55"
127.0.0.1:6379> keys *
1) "redisson:tomcat_session:CEA8347FDF151A82ED8B08A59120ED55"
2) "redisson:tomcat_session:AAB9C0437D53573FB9C60565F345A63D"
127.0.0.1:6379> keys *
1) "redisson:tomcat_session:CEA8347FDF151A82ED8B08A59120ED55"
2) "redisson:tomcat_session:AAB9C0437D53573FB9C60565F345A63D"
3) "redisson:tomcat_session:84B3D1117D22661FAD32264A4DFD4C5B"
127.0.0.1:6379> 

至此驗(yàn)證結(jié)果都已經(jīng)實(shí)現(xiàn),如果版本不同,請(qǐng)注意下載對(duì)應(yīng)的版本的jar包。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請(qǐng)通過(guò)簡(jiǎn)信或評(píng)論聯(lián)系作者。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容