今天我們開始聊SpringSession,先介紹一下SpringSession。
簡介:一句話SpringSession提供了用於管理用戶會話信息的API和實現。
特點:SpringSession使得支持集羣會話變得非常簡單,而無需綁定到特定於應用程序容器的解決方案。它還提供透明的整合,包括:
-
HttpSession
-允許在應用程序容器(即Tomcat)中性的方式中替換HttpSession,支持在頭中提供會話ID以使用RESTfulAPI -
WebSocket
-提供在接收WebSocket消息時保持HttpSession活動的能力 -
WebSession
-允許以與應用程序容器無關的方式替換SpringWebFlux的WebSession
構成模塊:
-
SpringSession Core-提供核心Spring會話功能和API
-
SpringSession Data Redis-提供由Redis和配置支持的SessionRepository和ReactiveSessionRepository實現
-
SpringSessionJDBC-提供由關係數據庫和配置支持的SessionRepository實現
-
SpringSessionHazelcast-提供由Hazelcast和配置支持的SessionRepository實現
總結歸納一下上面的東西,以真實存在的線上情況來梳理:
在傳統單機web應用中,一般使用tomcat/jetty等web容器時,用戶的session都是由容器管理。瀏覽器使用cookie中記錄sessionId,容器根據sessionId判斷用戶是否存在會話session。這裏的限制是,session存儲在web容器中,被單臺服務器容器管理。
但是網站主鍵演變,分佈式應用和集羣是趨勢(提高性能)。此時用戶的請求可能被負載分發至不同的服務器,此時傳統的web容器管理用戶會話session的方式即行不通。除非集羣或者分佈式web應用能夠共享session,儘管tomcat等支持這樣做。但是這樣存在以下兩點問題:
- 需要侵入web容器,提高問題的複雜
- web容器之間共享session,集羣機器之間勢必要交互耦合
基於這些,必須提供新的可靠的集羣分佈式/集羣session的解決方案,突破traditional-session單機限制(即web容器session方式,下面簡稱traditional-session),spring-session應用而生。
下面來看一下單機session和集羣session的區別,其實主要是traditional-session和spring-session之間的區別:
傳統模式中,當request進入web容器,根據reqest獲取session時,如果web容器中存在session則返回,如果不存在,web容器則創建一個session。然後返回response時,將sessonId作爲response的head一併返回給客戶端或者瀏覽器。
但是上節中說明了traditional-session的侷限性在於:單機session。在此限制的相反面,即將session從web容器中抽出來,形成獨立的模塊,以便分佈式應用或者集羣都能共享,即能解決。
spring-session的核心思想在於此:將session從web容器中剝離,存儲在獨立的存儲服務器中。目前支持多種形式的session存儲器:Redis、Database、MogonDB等。session的管理責任委託給spring-session承擔。當request進入web容器,根據request獲取session時,由spring-session負責存存儲器中獲取session,如果存在則返回,如果不存在則創建並持久化至存儲器中。
順便在這裏插一嘴:JSR340是Java Servlet 3.1的規範提案,其中定義了大量的api,包括:servlet、servletRequest/HttpServletRequest/HttpServletRequestWrapper、servletResponse/HttpServletResponse/HttpServletResponseWrapper、Filter、Session等,是標準的web容器需要遵循的規約,如tomcat/jetty/weblogic等等。
其中HttpServletRequest和HttpSession都是servlet規範中定義的接口,web容器實現的標準。那如果引入spring-session,要如何獲取session?
- 第一種:遵循servlet規範,同樣方式獲取session,對應用代碼無侵入。
- 第二種:全新實現一套session規範,定義一套新的api和session管理機制
兩種方案都可以實現,但是顯然第一種更友好,且具有兼容性。spring-session正是第一種方案的實現。
實現第一種方案的關鍵點在於做到透明和兼容
- 接口適配:仍然使用HttpServletRequest獲取session,獲取到的session仍然是HttpSession類型——適配器模式
- 類型包裝增強:Session不能存儲在web容器內,要外化存儲——裝飾模式
讓人興奮的是,以上的需求在Servlet規範中的擴展性都是予以支持!Servlet規範中定義一系列的接口都是支持擴展,同時提供Filter支撐擴展點。
好了,以上就是對SpringSession的大致的介紹。接下來我們看看SpringSession大致的工作原理圖:
好了,這就是SpringSession的介紹和工作流程圖。下一篇我們聊聊怎麼用,說完怎麼用以後我們來說一下他每個模塊的作用和工作原理。