SpringSecurity、Spring Social、SpringSession、TX-LCN、Spring Cloud Data Flow、JWT 架構(七)

今天我們開始聊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的介紹和工作流程圖。下一篇我們聊聊怎麼用,說完怎麼用以後我們來說一下他每個模塊的作用和工作原理。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章