SpringBoot 一個依賴搞定 session 共享

思路

在傳統的單服務架構中,一般來說,只有一個服務器,那麼不存在 Session 共享問題,但是在分佈式/集羣項目中,Session 共享則是一個必須面對的問題,先看一個簡單的架構圖:
在這裏插入圖片描述
在這樣的架構中,會出現一些單服務中不存在的問題,例如客戶端發起一個請求,這個請求到達 Nginx 上之後,被 Nginx 轉發到 Tomcat A 上,然後在 Tomcat A 上往 session 中保存了一份數據,下次又來一個請求,這個請求被轉發到 Tomcat B 上,此時再去 Session 中獲取數據,發現沒有之前的數據。對於這一類問題的解決,思路很簡單,就是將各個服務之間需要共享的數據,保存到一個公共的地方(主流方案就是 Redis):
在這裏插入圖片描述
當所有 Tomcat 需要往 Session 中寫數據時,都往 Redis 中寫,當所有 Tomcat 需要讀數據時,都從 Redis 中讀。這樣,不同的服務就可以使用相同的 Session 數據了。

這樣的方案,可以由開發者手動實現,即手動往 Redis 中存儲數據,手動從 Redis 中讀取數據,相當於使用一些 Redis 客戶端工具來實現這樣的功能,毫無疑問,手動實現工作量還是蠻大的。

一個簡化的方案就是使用 Spring Session 來實現這一功能,Spring Session 就是使用 Spring 中的代理過濾器,將所有的 Session 操作攔截下來,自動的將數據 同步到 Redis 中,或者自動的從 Redis 中讀取數據。
對於開發者來說,所有關於 Session 同步的操作都是透明的,開發者使用 Spring Session,一旦配置完成後,具體的用法就像使用一個普通的 Session 一樣。

實戰

1 創建工程
首先 創建一個 Spring Boot 工程,引入 Web、Spring Session 以及 Redis:
![在這裏插入圖片描述](https://img-blog.csdnimg.cn/20200610183325321.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1JvY2NjNjY2,size_16,color_FFFFFF,t_70)
創建成功之後,pom.xml 文件如下:
  <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.session</groupId>
            <artifactId>spring-session-data-redis</artifactId>
        </dependency>
    </dependencies>

注意:
這裏我使用的 Spring Boot 版本是 2.1.4 ,如果使用當前最新版 Spring Boot2.1.5 的話,除了上面這些依賴之外,需要額外添加 Spring Security 依賴(其他操作不受影響,僅僅只是多了一個依賴,當然也多了 Spring Security 的一些默認認證流程)。

2 配置 Redis
    spring.redis.host=192.168.66.128
    spring.redis.port=6379
    spring.redis.password=123
    spring.redis.database=0

這裏的 Redis ,我雖然配置了四行,但是考慮到端口默認就是 6379 ,database 默認就是 0,所以真正要配置的,其實就是兩行。

# 總結

本文主要向大家介紹了 Spring Session 的使用,另外也涉及到一些 Nginx 的使用 ,雖然本文較長,但是實際上 Spring Session 的配置沒啥。

我們寫了一些代碼,也做了一些配置,但是全都和 Spring Session 無關,配置是配置 Redis,代碼就是普通的 HttpSession,和 Spring Session 沒有任何關係!
唯一和 Spring Session 相關的,可能就是我在一開始引入了 Spring Session 的依賴吧!

如果大家沒有在 SSM 架構中用過 Spring Session ,可能不太好理解我們在 Spring Boot 中使用 Spring Session 有多麼方便,因爲在 SSM 架構中,Spring Session 的使用要配置三個地方 ,一個是 web.xml 配置代理過濾器,然後在 Spring 容器中配置 Redis,最後再配置 Spring Session,步驟還是有些繁瑣的,而 Spring Boot 中直接幫我們省去了這些繁瑣的步驟!不用再去配置 Spring Session。

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