阿里雲系列一 JDK、Maven、GIT
阿里雲系列二 nginx安裝、負載均衡、https配置
阿里雲系列三 RocketMQ
Session 共享的意義
當程序進行單機部署的時session存儲在一臺服務器上容易跟蹤處理,隨着業務量的增加和高可用的解決方案,我們需要以集羣式的方式將程序部署在不同的服務器上.如果沒有進行session共享,當用戶的session存儲在服務器A上,是無法在服務器B上對session進行操作的。最常見的就是,當用戶登錄後我們將用戶的相關常用信息存儲在session中顯示頁面中,當用戶請求到服務器B時無法顯示session中保存的信息。
session共享方案
- nginx的配置IPhash配置
nginx通過配置IP的hash值,使相同的IP地址總是訪問同一臺服務器,間接實現了session共享,配置比較簡單,如果客戶端通過代理服務器進行操作,負載就沒什麼作用了,session共享就沒什麼意義了。服務器宕機也會丟失大量session。 - tomcat集羣session複製
使用tomcat自帶的cluster方式,多個tomcat間自動實時複製session信息,配置起來很簡單。但這個方案的效率比較低,在大併發下表現並不好 - 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" />
- 下載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
- 在本地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/
- 複製編譯後的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/
- 編輯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配置
很喜歡的一個文藝女青年的公衆號“內心的話”,大家可以去關注一下。