阿里雲系列四 tomcat+redis+nginx 實現session共享

阿里雲系列一 JDK、Maven、GIT
阿里雲系列二 nginx安裝、負載均衡、https配置
阿里雲系列三 RocketMQ

Session 共享的意義

當程序進行單機部署的時session存儲在一臺服務器上容易跟蹤處理,隨着業務量的增加和高可用的解決方案,我們需要以集羣式的方式將程序部署在不同的服務器上.如果沒有進行session共享,當用戶的session存儲在服務器A上,是無法在服務器B上對session進行操作的。最常見的就是,當用戶登錄後我們將用戶的相關常用信息存儲在session中顯示頁面中,當用戶請求到服務器B時無法顯示session中保存的信息。

session共享方案

  1. nginx的配置IPhash配置
    nginx通過配置IP的hash值,使相同的IP地址總是訪問同一臺服務器,間接實現了session共享,配置比較簡單,如果客戶端通過代理服務器進行操作,負載就沒什麼作用了,session共享就沒什麼意義了。服務器宕機也會丟失大量session。
  2. tomcat集羣session複製
    使用tomcat自帶的cluster方式,多個tomcat間自動實時複製session信息,配置起來很簡單。但這個方案的效率比較低,在大併發下表現並不好
  3. redis緩存session
    這是現在比較通用的解決方案,session存儲在redis中,服務器重啓session也不會丟失。

seesion 共享配置

要實現session共享需要有前面搭建的JDK、maven、git的基礎
1. tocmat 部署

現在只有一臺遠程服務器,創建不同的用戶上傳tomcat的,分別配置端口8080和8087。如果在同一臺服務器上只修改server.xml的Connector 爲8087 啓動tomcat會報端口被佔用,我們共需修改3處


1 .<Server port="8006" shutdown="SHUTDOWN">

2 .<Connector port="8087" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />

 1. <Connector port="8010" protocol="AJP/1.3" redirectPort="8443" />
  1. 下載tomcat-cluster-redis-session-manager
git colne https://github.com/ran-jit/tomcat-cluster-redis-session-manager.git

進入 tomcat-cluster-redis-session-manager 編譯工程

mvn package
  1. 在本地maven倉庫複製以下3個jar文件到tomcat的lib目錄下

jedis.jar、commons-pool2.jar、slf4j-api.jar

	
	cp ./redis/clients/jedis/3.0.1/jedis-3.0.1.jar  apache-tomcat-8.0.45/lib/
	cp ./org/apache/commons/commons-pool2/2.6.2/commons-pool2-2.6.2.jar  apache-tomcat-8.0.45/lib/
mv ./org/slf4j/slf4j-api/1.7.26/slf4j-api-1.7.26.jar apache-tomcat-8.0.45/lib/
  1. 複製編譯後的omcat-cluster-redis-session-manager-3.0.5.jar到tomcat的lib目錄下
cp tomcat-cluster-redis-session-manager-3.0.5.jar   apache-tomcat-8.0.45/lib/

複製redis-data-cache.properties到tocmat的conf的目錄下

cp /home/apacheUser/tomcat-cluster-redis-session-manager/src/main/resources/redis-data-cache.properties  /home/apacheUser/apache-tomcat-8.0.45/conf/
  1. 編輯tomcat目錄下的conf/context.xml新增
<Valve className="tomcat.request.session.redis.SessionHandlerValve" />
<Manager className="tomcat.request.session.redis.SessionManager" />

session共享驗證

修改tomcat/webapps/ROOT/index.jsp新增

 session Id : <%= request.getSession().getId() %>
 session set <% request.getSession().setAttribute("name","test"); %>
 session get  <%= request.getSession().getAttribute("name") %>

1.分別訪問兩個端口的tomcat,看到如下圖
8087端口如下圖
在這裏插入圖片描述8080端口如下圖
在這裏插入圖片描述兩臺機器都可以獲取到session中設置的值,並且無論我們怎麼刷新頁面,sessionID兩個頁面顯示的都是一一致的。

查看redis存儲的值,可以看到redis存儲的值正是頁面中顯示的sessionID,說明我們的session已經存儲在在redis中實現了session共享

在這裏插入圖片描述nginx的負載,我們只需要在nginx/nginx.conf中增

 upstream  SpringBoot {
        server   182.92.236.76:8080 weight=2;
        server   182.92.236.76:8087 weight=8;
     }

更多詳細配置,請參考之前的文章
阿里雲系列二 nginx安裝、負載均衡、https配置
很喜歡的一個文藝女青年的公衆號“內心的話”,大家可以去關注一下。

在這裏插入圖片描述

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