中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SpringBoot一招搞定session,這么簡單你確定不看這篇文章

發布時間:2020-05-31 17:04:25 來源:網絡 閱讀:1435 作者:java周某人 欄目:編程語言


SpringBoot一招搞定session,這么簡單你確定不看這篇文章


在傳統的單服務架構中,一般來說,只有一個服務器,那么不存在 Session 共享問題,但是在分布式/集群項目中,Session 共享則是一個必須面對的問題,先看一個簡單的架構圖:

SpringBoot一招搞定session,這么簡單你確定不看這篇文章


在這樣的架構中,會出現一些單服務中不存在的問題,例如客戶端發起一個請求,這個請求到達 Nginx 上之后,被 Nginx 轉發到 Tomcat A 上,然后在 Tomcat A 上往 session 中保存了一份數據,下次又來一個請求,這個請求被轉發到 Tomcat B 上,此時再去 Session 中獲取數據,發現沒有之前的數據。對于這一類問題的解決,思路很簡單,就是將各個服務之間需要共享的數據,保存到一個公共的地方(主流方案就是 Redis):

SpringBoot一招搞定session,這么簡單你確定不看這篇文章


當所有 Tomcat 需要往 Session 中寫數據時,都往 Redis 中寫,當所有 Tomcat 需要讀數據時,都從 Redis 中讀。這樣,不同的服務就可以使用相同的 Session 數據了。

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

一個簡化的方案就是使用 Spring Session 來實現這一功能,Spring Session 就是使用 Spring 中的代理過濾器,將所有的 Session 操作攔截下來,自動的將數據 同步到 Redis 中,或者自動的從 Redis 中讀取數據。

對于開發者來說,所有關于 Session 同步的操作都是透明的,開發者使用 Spring Session,一旦配置完成后,具體的用法就像使用一個普通的 Session 一樣。

1 實戰

1.1 創建工程

首先 創建一個 Spring Boot 工程,引入 Web、Spring Session 以及 Redis:

SpringBoot一招搞定session,這么簡單你確定不看這篇文章


創建成功之后,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 的一些默認認證流程)。

1.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,所以真正要配置的,其實就是兩行。

1.3 使用

配置完成后 ,就可以使用 Spring Session 了,其實就是使用普通的 HttpSession ,其他的 Session 同步到 Redis 等操作,框架已經自動幫你完成了:

@RestController
public
?
class
?
HelloController
?{
?
@Value
(
"${server.port}"
)
?
Integer
?port;
?
@GetMapping
(
"/set"
)
?
public
?
String
?set(
HttpSession
?session)?{
?session.setAttribute(
"user"
,?
"javaboy"
);
?
return
?
String
.valueOf(port);
?}
?
@GetMapping
(
"/get"
)
?
public
?
String
?get(
HttpSession
?session)?{
?
return
?session.getAttribute(
"user"
)?+?
":"
?+?port;
?}
}

考慮到一會 Spring Boot 將以集群的方式啟動 ,為了獲取每一個請求到底是哪一個 Spring Boot 提供的服務,需要在每次請求時返回當前服務的端口號,因此這里我注入了 server.port 。

接下來 ,項目打包:

SpringBoot一招搞定session,這么簡單你確定不看這篇文章


打包之后,啟動項目的兩個實例:

java?-jar?sessionshare-
0.0
.
1
-SNAPSHOT.jar?--server.port=
8080
java?-jar?sessionshare-
0.0
.
1
-SNAPSHOT.jar?--server.port=
8081

然后先訪問 localhost:8080/set 向 8080 這個服務的 Session 中保存一個變量,訪問完成后,數據就已經自動同步到 Redis 中 了 :

SpringBoot一招搞定session,這么簡單你確定不看這篇文章


然后,再調用 localhost:8081/get 接口,就可以獲取到 8080 服務的 session中的數據:

SpringBoot一招搞定session,這么簡單你確定不看這篇文章


此時關于 session 共享的配置就已經全部完成了,session 共享的效果我們已經看到了,但是每次訪問都是我自己手動切換服務實例,因此,接下來我們來引入 Nginx ,實現服務實例自動切換。

1.4 引入 Nginx

很簡單,進入 Nginx 的安裝目錄的 conf 目錄下(默認是在 /usr/local/nginx/conf),編輯 nginx.conf 文件:

SpringBoot一招搞定session,這么簡單你確定不看這篇文章


在這段配置中:

  1. upstream 表示配置上游服務器

  2. javaboy.org 表示服務器集群的名字,這個可以隨意取名字

  3. upstream 里邊配置的是一個個的單獨服務

  4. weight 表示服務的權重,意味者將有多少比例的請求從 Nginx 上轉發到該服務上

  5. location 中的 proxy_pass 表示請求轉發的地址, / 表示攔截到所有的請求,轉發轉發到剛剛配置好的服務集群中

  6. proxy_redirect 表示設置當發生重定向請求時,nginx 自動修正響應頭數據(默認是 Tomcat 返回重定向,此時重定向的地址是 Tomcat 的地址,我們需要將之修改使之成為 Nginx 的地址)。

配置完成后,將本地的 Spring Boot 打包好的 jar 上傳到 Linux ,然后在 Linux 上分別啟動兩個 Spring Boot 實例:

nohup?java?-jar?sessionshare-
0.0
.
1
-SNAPSHOT.jar?--server.port=
8080
?&
nohup?java?-jar?sessionshare-
0.0
.
1
-SNAPSHOT.jar?--server.port=
8081
?&

其中

  • nohup 表示當終端關閉時,Spring Boot 不要停止運行

  • & 表示讓 Spring Boot 在后臺啟動

配置完成后,重啟 Nginx:

/usr/local
/nginx/sbin/nginx?-s?reload

Nginx 啟動成功后,我們首先手動清除 Redis 上的數據,然后訪問 192.168.66.128/set 表示向 session中保存數據,這個請求首先會到達 Nginx上,再由 Nginx 轉發給某一個 SpringBoot 實例:

SpringBoot一招搞定session,這么簡單你確定不看這篇文章


如上,表示端口為 8081 的 SpringBoot 處理了這個 /set 請求,再訪問 /get 請求:

SpringBoot一招搞定session,這么簡單你確定不看這篇文章


可以看到, /get 請求是被端口為 8080 的服務所處理的。

2 總結

本文主要向大家介紹了 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。

最后記得給我點個關注哦,每天都會分享java有關的文章


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

古蔺县| 邯郸县| 运城市| 晋州市| 铜陵市| 鹰潭市| 永兴县| 东平县| 华阴市| 内乡县| 庆元县| 历史| 安顺市| 海丰县| 云霄县| 阿克陶县| 平遥县| 桐柏县| 青神县| 淮南市| 确山县| 双流县| 瑞丽市| 汾阳市| 洪洞县| 永泰县| 永嘉县| 柘荣县| 长泰县| 漳浦县| 新巴尔虎右旗| 乐平市| 祁阳县| 巨野县| 十堰市| 乌兰察布市| 湖州市| 搜索| 罗平县| 永州市| 福海县|