JSESSIONID是Session的標識,當客戶端請求服務器端的時候,服務器端會檢查是否已經給這個客戶端建立過Session,也就是看客戶端的請求中的header是否有Cookie:JSESSIONID=…,若是客戶端請求包含JSESSIONID,那麼服務器端能夠根據JSESSIONID找到對應的Session;若是沒有,則服務端認爲該客戶端第一次訪問,會在response中增長header,即Set-Cookie:JSESSIONID=…,當客戶端收到該response後就會被設置Cookie,之後的請求都會攜帶該Cookie,保證Session的一致性;java
根據客戶端的IP,將請求分配到不一樣的服務器上;nginx
配置以下:後端
upstream my_upstream {服務器
ip_hash;cookie
server 10.20.35.11:8001;
server 10.20.35.11:8002;
}session
https://bitbucket.org/nginx-goodies/nginx-sticky-module-ng/overview
下載以後經過--add-module從新編譯nginx;app
配置以下:負載均衡
upstream my_upstream{ sticky; server 10.20.35.11:8001; server 10.20.35.11:8002; }
實現原理:分佈式
Sticky是nginx的一個模塊,它是基於cookie的一種nginx的負載均衡解決方案,經過分發和識別cookie,來使同一個客戶端的請求落在同一臺服務器上,默認標識名爲route
1 客戶端首次發起訪問請求,nginx接收後,發現請求頭沒有cookie,則以輪詢方式將請求分發給後端服務器。
2 後端服務器處理完請求,將響應數據返回給nginx。
3 此時nginx生成帶route的cookie,返回給客戶端。route的值與後端服務器對應,多是明文,也多是md五、sha1等Hash值
4 客戶端接收請求,並保存帶route的cookie。
5 當客戶端下一次發送請求時,會帶上route,nginx根據接收到的cookie中的route值,轉發給對應的後端服務器。測試
後端實現:
1 繼承HttpSessionWrapper,好比DistributeHttpSessionWrapper,覆蓋getAttributeNames、getAttribute、setAttribute等方法,改成到一個公共的地方讀寫session屬性,好比DB、Memcached、Redis等;
javax.servlet.http.HttpSession
2 繼承HttpServletRequestWrapper,好比DistributeHttpServletRequestWrapper,覆蓋getSession方法,改成返回DistributeHttpSessionWrapper;
javax.servlet.http.HttpServletRequestWrapper
2 繼承Filter,好比DistributeSessionFilter,覆蓋doFilter方法,在調用鏈中將HttpServletRequest替換爲DistributeHttpServletRequestWrapper;
javax.servlet.Filter