同域名下相同項(xiàng)目(集群環(huán)境)實(shí)現(xiàn)Session共享
在同一個(gè)域名下,比如:www.p2p.com
同一個(gè)項(xiàng)目,部署了多臺(tái)tomcat,這就是典型的集群。我們的入門案例就屬于這種應(yīng)用場(chǎng)景,只不過(guò)在實(shí)際開(kāi)發(fā)的過(guò)程中,我們?nèi)绻嬖诹藅omcat集群,那么肯定會(huì)使用nginx進(jìn)行負(fù)載均衡,那么這種情況下我們?cè)撊绾翁幚怼?/span>
我們將上一個(gè)階段的p2p項(xiàng)目實(shí)現(xiàn)集群部署下的Session共享,因?yàn)槲覀冎皇茄菔維ession共享,所以我們?cè)囉靡粋€(gè)簡(jiǎn)易版本的p2p,在我給大家提供的資料中,該p2p中只包含p2p和dataservice,在Linux服務(wù)器上,我們準(zhǔn)備三臺(tái)tomcat,其中兩臺(tái)部署p2p,并實(shí)現(xiàn)session共享,另一臺(tái)部署dataservice。
① 使用Xftp將p2p上傳到tomcat9100和9200的webapps目錄下
② 使用Xftp將dataservice上傳到tomcat9300的webapps目錄下
③ 使用資源下的SQL腳本,重新創(chuàng)建數(shù)據(jù)庫(kù)的表
因?yàn)槟壳斑@個(gè)p2p的項(xiàng)目表結(jié)構(gòu)和上一個(gè)階段的稍微有些區(qū)別,所以我們這里更新一下:
A、 啟動(dòng)mysql數(shù)據(jù)庫(kù)
B、 通過(guò)MySQL客戶端工具Navivat創(chuàng)建新的庫(kù)
C、 指定數(shù)據(jù)庫(kù)名字為p2p2,字符集編碼為utf-8
D、 新建查詢,執(zhí)行p2p-data.sql腳本
E、 執(zhí)行成功后,表結(jié)構(gòu)如下
④ 通過(guò)Xftp工具連接Linux,修改tomcat9300下的dataservice的連接信息
A、 使用記事本打開(kāi),修改redis.properties,保存
B、 修改datasource.properties,保存
C、 修改applicationContext-dubbo-provide.xml注冊(cè)中心的地址,并保存
⑤ 通過(guò)Xftp工具連接Linux,修改tomcat9100下的p2p的連接信息
這里只需要修改applicationContext-dubbo-consumer.xml文件中zk注冊(cè)中心的地址即可。
⑥ 通過(guò)Xftp工具連接Linux,修改tomcat9200下的p2p的連接信息
這里只需要修改applicationContext-dubbo-consumer.xml文件中zk注冊(cè)中心的地址即可。
⑦ 確保Linux系統(tǒng)上的各應(yīng)用服務(wù)器啟動(dòng)
注意:先通過(guò)ps –ef | grep XXX命令查看,如果已經(jīng)啟動(dòng),就不需要再啟動(dòng)了。
A、 啟動(dòng)ZooKeeper服務(wù)器
B、 啟動(dòng)MySQL服務(wù)器
C、 啟動(dòng)Redis服務(wù)器
D、 啟動(dòng)tomcat9300服務(wù)器(為了避免出錯(cuò)先關(guān)閉,再啟動(dòng))
E、 啟動(dòng)tomcat9100服務(wù)器(為了避免出錯(cuò)先關(guān)閉,再啟動(dòng))
F、 啟動(dòng)tomcat9200服務(wù)器(為了避免出錯(cuò)先關(guān)閉,再啟動(dòng))
G、 直接訪問(wèn)tomcat的方式,在瀏覽器輸入地址訪問(wèn)tomcat9100和tomcat9200
⑧ 使用Nginx對(duì)tomcat9100和tomcat9200進(jìn)行負(fù)載均衡
A、 負(fù)載均衡的配置,這里使用的是輪詢策略
upstream www.p2p.com{
???????? server 127.0.0.1:9100;
???????? server 127.0.0.1:9200;???????
}?
B、location匹配的配置,注意:這里對(duì)靜態(tài)資源的處理,我們暫時(shí)先注釋掉
location /p2p{
?????????????proxy_pass http://www.p2p.com;
????????}
如果要是實(shí)現(xiàn)了靜態(tài)代理,別忘了啟動(dòng)所有的nginx服務(wù)器(負(fù)載|代理)
C、 重啟Nginx
D、 在瀏覽器中輸入地址,直接訪問(wèn)Nginx服務(wù)器,實(shí)現(xiàn)負(fù)載均衡
⑨ Nginx對(duì)集群負(fù)載均衡之后,登錄不成功,但是直接訪問(wèn)tomcat9100或者tomcat9200都是可以成功登錄的(Session丟失),分析原因:
因?yàn)槟J(rèn)我們負(fù)載均衡使用的是輪詢策略,每次發(fā)送請(qǐng)求給nginx服務(wù)器,都會(huì)切換tomcat服務(wù)器,這個(gè)時(shí)候沒(méi)有使用任何session共享策略,所以登錄不成功。
⑩ Nginx對(duì)集群負(fù)載均衡之后,Session共享方案
A、 修改nginx.conf配置文件,將輪詢策略修改為ip_hash
但是這種情況,一旦ip發(fā)生變化,或者某臺(tái)服務(wù)器出現(xiàn)故障,會(huì)重新分配,不穩(wěn)定;
所以我們看下這種情況后,將ip_hash注釋掉。
B、 使用SpringSession
使用Spring Session實(shí)現(xiàn)session共享,我們不需要修改代碼,只要修改一些配置文件即可,為了演示方便,我們直接使用Xftp修改已經(jīng)發(fā)布到tomcat上的項(xiàng)目;
向tomcat9100和tomcat9200的p2p項(xiàng)目中加jar包,這個(gè)jar包我已經(jīng)準(zhǔn)備好了。
修改tomcat9100和tomcat9200的p2p項(xiàng)目的web.xml配置文件,添加Spring Session過(guò)濾器,因?yàn)槲覀冺?xiàng)目本身已經(jīng)通過(guò)springMVC啟動(dòng)了容器,所以spring監(jiān)聽(tīng)器不需要加了,直接從01-springsession-web中拷貝即可;
將01-springsession-web項(xiàng)目中resources下的applicationContext-session.xml和redis.properties拷貝到tomcat9100和tomcat9200的p2p項(xiàng)目WEB-INF/classes下
修改tomcat9100和tomcat9200的p2p項(xiàng)目WEB-INF/classes下applicationContext.xml文件,引入applicationContext-session.xml
重啟三臺(tái)tomcat服務(wù)器,瀏覽器訪問(wèn)進(jìn)行登錄測(cè)試,可以實(shí)現(xiàn)Session共享。
在同一個(gè)域名下,有多個(gè)不同的項(xiàng)目(項(xiàng)目的上下文根不一樣)比如:
www.web.com/p2p
www.web.com/shop
如圖:
在01-springsession-web項(xiàng)目的基礎(chǔ)上,將本地tomcat9100的上下文根修改為p2p,將本地tomcat92
① 打開(kāi)Edit Configurations進(jìn)行配置
② 在Deployment選項(xiàng)卡下,設(shè)置本地tomcat9100的Application context為/p2p
③ 在Deployment選項(xiàng)卡下,設(shè)置本地tomcat9200的Application context為/shop???????
④ 在idea中重新啟動(dòng)本地的兩臺(tái)tomcat服務(wù)器
⑤ 在瀏覽器中訪問(wèn)tomcat9100(p2p),設(shè)置session
⑥ 在瀏覽器中訪問(wèn)tomcat9200(shop),獲取session
⑦ 分析Session共享失敗原因
我們通過(guò)瀏覽器提供的開(kāi)發(fā)人員工具可以發(fā)現(xiàn),這兩個(gè)請(qǐng)求的cookie的路徑(path)不一致,雖然我們已經(jīng)加了Spring Session共享機(jī)制,但是后臺(tái)服務(wù)器認(rèn)為這是兩個(gè)不同的會(huì)話(session),可以通過(guò)Redis客戶端工具(Redis Destop Mananger)查看,先清空,然后訪問(wèn),發(fā)現(xiàn)是維護(hù)了兩個(gè)不同的session,所以不能實(shí)現(xiàn)共享。
⑧ 解決方案 設(shè)置Cookie路徑為根/上下文
在applicationContext-session.xml文件中,加如下配置:
⑨ 在idea中重新啟動(dòng)本地的兩臺(tái)tomcat服務(wù)器
⑩ 在瀏覽器中訪問(wèn)tomcat9100(p2p),設(shè)置session
? 在瀏覽器中訪問(wèn)tomcat9200(shop),獲取session
注意:測(cè)試的時(shí)候要先清空瀏覽器緩存。
同一個(gè)根域名,不同的二級(jí)子域名
比如:
www.web.com
beijing.web.com
nanjing.web.com
如圖:
• 設(shè)置Cookie路徑為根/上下文,項(xiàng)目名一樣的話,此步驟可以省略
• 設(shè)置cookie的域名為根域名 web.com
在01-springsession-web項(xiàng)目的基礎(chǔ)上,將本地tomcat9100的上下文根修改為p2p,將本地tomcat9200的上下文根修改為shop;在本機(jī)host文件中修改127.0.0.1的映射關(guān)系模擬不同的域名訪問(wèn)。
① 延續(xù)上面的案例的配置,兩臺(tái)本地tomcat服務(wù)器9100和9200,上下文根分別是p2p和shop
② 修改本地hosts文件,加入如下配置
③ 在idea中重新啟動(dòng)本地的兩臺(tái)tomcat服務(wù)器
④ 在瀏覽器中訪問(wèn)tomcat9100(p2p),設(shè)置session
注意,這里不再使用localhost訪問(wèn),而是使用我們映射的域名
⑤ 在瀏覽器中訪問(wèn)tomcat9200(shop),獲取session
注意,這里也不再使用localhost訪問(wèn),而是使用我們映射的域名
⑥ 分析Session共享失敗原因
我們通過(guò)瀏覽器提供的開(kāi)發(fā)人員工具可以發(fā)現(xiàn),雖然這兩個(gè)cookie的路徑(path)都設(shè)置為了“/”,但是這兩個(gè)cookie的域名不一致,雖然我們已經(jīng)加了Spring Session共享機(jī)制,但是后臺(tái)服務(wù)器同樣認(rèn)為這是兩個(gè)不同的會(huì)話(session),可以通過(guò)Redis客戶端工具(Redis Destop Mananger)查看,先清空,然后訪問(wèn),發(fā)現(xiàn)是維護(hù)了兩個(gè)不同的session,所以不能實(shí)現(xiàn)共享,也就是說(shuō)后臺(tái)區(qū)分是否同一個(gè)session和路徑和域名有關(guān)。
⑦ 解決方案 設(shè)置Cook ie的域名為根域名 web.com
在applicationContext-session.xml文件中,加如下配置:
注意:域名要和hosts文件中配置的域名后面一樣
⑧ 在idea中重新啟動(dòng)本地的兩臺(tái)tomcat服務(wù)器
⑨ 在瀏覽器中訪問(wèn)tomcat9100(p2p),設(shè)置session
⑩ 在瀏覽器中訪問(wèn)tomcat9200(shop),獲取session
注意:清空瀏覽器緩存???????