如何實現(xiàn)多個應用的Session共享
使用Redis緩存用戶session

Spring 為 Spring Session 和 Redis 的集成提供了組件:spring-session-data-redis
@RequestMapping(value = "/index")
public String index (HttpServletRequest request){
String msg="首頁內容";
Object user= request.getSession().getAttribute("user");
if (user==null){
msg="請先登錄!";
}
return msg;
分布式的CAP
Consistency (一致性):
更新操作成功并返回客戶端后,所有節(jié)點在同一時間的數(shù)據(jù)完全一致,這就是分布式的一致性。
Availability (可用性):
服務一直可用,而且是正常響應時間。好的可用性主要是指系統(tǒng)能夠很好的為用戶服務,不出現(xiàn)用戶操作失敗或者訪問超時等用戶體驗不好的情況。
Partition Tolerance (分區(qū)容錯性):
即分布式系統(tǒng)在遇到某節(jié)點或網(wǎng)絡分區(qū)故障的時候,仍然能夠對外提供滿足一致性或可用性的服務。
這三者不可能同時滿足:
假設服務器N1和N2之間的網(wǎng)絡斷開了,但我們仍要支持這種網(wǎng)絡異常,也就是滿足分區(qū)容錯性(一般分布式系統(tǒng)都是需要滿足P)。
當有用戶向N1發(fā)送數(shù)據(jù)更新請求,那N1中的數(shù)據(jù)DB0將被更新為DB1,由于網(wǎng)絡是斷開的,N2中的數(shù)據(jù)庫仍舊是DB0;
如果這個時候,有用戶向N2發(fā)送數(shù)據(jù)讀取請求,由于數(shù)據(jù)還沒有進行同步,應用程序沒辦法立即給用戶返回最新的數(shù)據(jù)DB1,怎么辦呢?
有二種選擇,第一,犧牲數(shù)據(jù)一致性,響應舊的數(shù)據(jù)DB0給用戶;第二,犧牲可用性,阻塞等待,直到網(wǎng)絡連接恢復,數(shù)據(jù)更新操作完成之后,再給用戶響應最新的數(shù)據(jù)DB1。
可用性高于一致性的場景:發(fā)布一張網(wǎng)頁到 CDN,多個服務器有這張網(wǎng)頁的副本。后來發(fā)現(xiàn)一個錯誤,需要更新網(wǎng)頁,這時只能每個服務器都更新一遍。
一般來說,網(wǎng)頁的更新不是特別強調一致性。
一致性高于可用性的場景:最典型的就是分布式數(shù)據(jù)庫,如Redis、HBase
RPC和微服務概念
https://blog.csdn.net/weixin_34341117/article/details/92389162
ngnix負載均衡
負載均衡的作用
1、轉發(fā)功能
按照一定的算法【權重、輪詢】,將客戶端請求轉發(fā)到不同應用服務器上,減輕單個服務器壓力,提高系統(tǒng)并發(fā)量。
2、故障移除
通過心跳檢測的方式,判斷應用服務器當前是否可以正常工作,如果服務器期宕掉,自動將請求發(fā)送到其他應用服務器。(keepalive_timeout)
3、恢復添加
如檢測到發(fā)生故障的應用服務器恢復工作,自動將其添加到處理用戶請求隊伍中。
Nginx 的 upstream目前支持的分配算法:
1)、輪詢 ——1:1 輪流處理請求(默認)
每個請求按時間順序逐一分配到不同的應用服務器,如果應用服務器down掉,自動剔除,剩下的繼續(xù)輪詢。
2)、權重 ——you can you up
通過配置權重,指定輪詢幾率,權重和訪問比率成正比,用于應用服務器性能不均的情況。
3)、ip_哈希算法
每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個應用服務器,可以解決session共享的問題。
upstream tomcatserver1 {
server 192.168.72.49:8080 weight=3;
server 192.168.72.49:8081;
}
server {
listen 80;
server_name 8080.max.com;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
proxy_pass http://tomcatserver1;
index index.html index.htm;
}
}