天天看點

分布式Session架構示範史(上)無狀态會話有狀态會話為何使用無狀态會話單Tomcat會話動靜分離會話

Session代表的是用戶端與伺服器的一次互動過程,這個過程可以是連續也可以是時斷時續的。曾經的Sevlet時代(JSP),一旦使用者與服務端互動,Tomcat就會為使用者建立一個session,同時前端會有一個jsessionid,每次互動都會攜帶。

伺服器隻要在接到使用者請求時候,就可以拿到jsessionid, 并根據這個ID在記憶體中找到對應的會話session,當拿到session會話後,那麼我們就可以操作會話了。會話存活期間,我們就能認為使用者一直處于正在使用着網站的狀态,session超期過時,那麼就可以認為使用者已經離開網站,停止互動了。使用者的身份資訊,我們也是通過session來判斷的,在session中可以儲存不同使用者的資訊。

session的使用之前在單體部分示範過,代碼如下:

@GetMapping("/setSession")
public object setSession(HttpServletRequest request) {
    HttpSession session = request . getSessionO;
    session. setAttribute("userInfo", "new user");
    session. setMaxInactiveInterval(3600);
    session. getAttribute("userInfo");
    session. removeAttribute("userInfo");
    return "ok" ;
}      

無狀态會話

HTTP請求是無狀态的,使用者向服務端發起多個請求,服務端并不會知道這多次請求都是來自同一使用者,這就叫無狀态。

cookie的出現就是為了有狀态的記錄使用者。

常見的,ios與服務端互動, 安卓與服務端互動,前後端分離,小程式與服務端互動,他們都是通過發起HTTP請求調用接口資料,每次互動服務端都不會拿到用戶端的狀态,但是我們可以通過手段去處理,比如每次使用者發起請求的時候攜帶一個

userid或者user-toke,就能讓服務端根據使用者id或token來獲得相應的資料。每個使用者的下一次請求都能被服務端識别來自同一個使用者。

有狀态會話

Tomcat中的會話,就是有狀态的,一旦使用者和服務端互動,就有會話,會話儲存了使用者的資訊,這樣使用者就"有狀态”了, 服務端會和每個用戶端都保持着這樣的一層關系,這個由容器來管理(也就是tomcat) , 這個session會話是儲存到記憶體空間裡的,如此一來,當不同的使用者通路服務端,那麼就能通過會話知道誰是誰了。如果使用者不再和服務端互動,那麼會話則消失,結束了他的生命周期。如此-來,每個使用者其實都會有一個會話被維護,這就是有狀态會話。

在傳統項目或JSP項目使用的最多的session都是有狀态,session的存在就是為了彌補HTTP的無狀态。

tomcat會話自身可配置實作多系統之間的狀态同步,但是會損耗一定的時間, 一旦發生同步那麼使用者請求就會等待,這種做法不可取。

為何使用無狀态會話

有狀态會話都是放在伺服器的記憶體中的。一旦使用者會話量多,那麼記憶體就會出現瓶頸。而無狀态會話可以采用媒體,前端可以使用cookie (app可以使用緩存) 儲存使用者id或token, 後端比如redis。相應的使用者會話都能放入redis中進行管理,如此,對應用部署的伺服器就不會造成記憶體壓力。使用者在前端發起http謂求,攜帶id或token, 如此服務端能夠根據前端提供的id或token來識别使用者了,可伸縮性就更強了。

單Tomcat會話

單個tomcat會話,這個就是有狀态的,使用者首次通路服務端,這個時候會話産生,井且會設定jsessionid放入cookie中,後绠每次請求都會攜帶jsessionid以保持使用者狀态。

分布式Session架構示範史(上)無狀态會話有狀态會話為何使用無狀态會話單Tomcat會話動靜分離會話

動靜分離會話

使用者請求服務端,由于動靜分離,前端發起htp請求,不會攜帶任何狀态,當使用者 第一次請求以後,我們手動設定一個token,作為使用者會話,放入redis中,如此作為redis-session,并且這個token設定後放入前端cookie中(app或小程式可以放

入本地緩存) ,如此後續互動過程中,前端隻需要傳遞token給後端,後端就能識别這個使用者請求來自誰。

分布式Session架構示範史(上)無狀态會話有狀态會話為何使用無狀态會話單Tomcat會話動靜分離會話

繼續閱讀