要實現session共享,多個tomcat服務器之間須使用負載均衡模塊進行調度,這裏用nginx+tomcat+ckv爲例進行說明;
部署tomcat服務器
1. 首先部署多個tomcat服務器,並確保每個服務器均能正常訪問;2. 下載memcached-session-manager-${version}.jar,此jar包包含了msm的核心功能;根據不一樣的tomcat版本下載對應的支持庫:Tomcat6:memcached-session-manager-tc6-${version}.jarTomcat7:memcached-session-manager-tc7-${version}.jarTomcat8:memcached-session-manager-tc8-${version}.jar3. 爲了支持memcached協議還必須下載spymemcached-2.11.1.jar4. 肯定序列化方案,不一樣方案對jar包的依賴關係以下:• kryo-serializermsm-kryo-serializer,kryo-serializers-0.11(0.11 is needed, as 0.20+ is for kryo2),kryo,minlog,reflectasm,asm-3.2• javolution-serializermsm-javolution-serializer,javolution-5.4.3.1• xstream-serializermsm-xstream-serializer,xstream,xmlpull,xpp3_min• flexjson-serializermsm-flexjson-serializer,flexjson• java自帶序列化方案spymemcached-2.11.1.jar已自帶,性能相對較差5. 如今咱們須要把已經準備好的jar包所有放在tomcat的lib目錄下,而後修改conf目錄下的context.xml文件,此處以java自帶序列化方案爲例,在context標籤下添加以下內容:
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:10.66.121.134:9101"
requestUriIgnorePattern=".*\.(png|gif|jpg|css|js)$"
sessionBackupAsync="false"
sessionBackupTimeout="100"
sticky="false"
transcoderFactoryClass="de.javakaffee.web.msm.JavaSerializationTranscoderFactory"
copyCollectionsForSerialization="false" />
其中n1爲已備好的支持memcached協議的緩存服務器,能夠設置多個,此處爲ckv服務器,manager其餘選項和說明可[
參照這裏].
安裝nginx服務器
配置好全部tomcat服務器以後,須要安裝nginx服務器,以實現負載均衡的功能,確保nginx起始頁能夠正常打開以後,打開nginx目錄下的nginx.conf文件,添加以下內容:
upstream tomcats {
server 10.104.37.25:8080 weight=1;
server 10.104.42.64:8080 weight=1;
}
server {
listen 13355;
server_name tomcats;
charset utf-8;
location / {
proxy_pass http://tomcats;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
}
}
這裏我把監聽端口改成了13355,tomcats裏面的兩個ip爲兩個tomcat服務器,weight爲權重,爲了便於觀察效果,將權重設爲相同。
編寫測試代碼
最後,咱們須要實現jsp頁面,測試結果,jsp頁面示例代碼以下:
<%@ page language="java" import="java.util.*,java.net.InetAddress" pageEncoding="ISO-8859-1"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'ShowSessionJsp.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<%
out.println("Session id is " + session.getId());%>
<br/>
<%
out.println("Server IP is "+InetAddress.getLocalHost().getHostAddress());%>
<br/>
<%
out.println("Server name is "+request.getServerName());
%>
</body>
</html>
測試結果
訪問nginx服務器
http://119.29.82.140:13355/ShareSession/ShowSession,反覆刷新頁面,測試結果:
Session id is 5526F95AEB3#88C6F1C0B9C7A5B92E23-n1
Server IP is 127.0.0.1
Server name is tomcats
Session id is 5526F95AEB3E88C6F1C0B9C7A5B92E23-n1
Server iIP is 10.104.42.64
Server name is tomcats
其中一個tomcat服務器與nginx在同一臺機器上,能夠看到ip地址在變化,session id保持不變,說明共享session成功.經過Manager中的設置還能夠設置多個緩存節點,實現緩存服務器的容災,此處不作贅述。另:負載均衡還能夠經過apache等方式實現.