SpringBoot一招搞定session,這么簡(jiǎn)單你確定不看這篇文章-創(chuàng)新互聯(lián)

SpringBoot一招搞定session,這么簡(jiǎn)單你確定不看這篇文章

創(chuàng)新互聯(lián)建站是一家集網(wǎng)站建設(shè),三沙企業(yè)網(wǎng)站建設(shè),三沙品牌網(wǎng)站建設(shè),網(wǎng)站定制,三沙網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷(xiāo),網(wǎng)絡(luò)優(yōu)化,三沙網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力。可充分滿(mǎn)足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專(zhuān)業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶(hù)成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。

在傳統(tǒng)的單服務(wù)架構(gòu)中,一般來(lái)說(shuō),只有一個(gè)服務(wù)器,那么不存在 Session 共享問(wèn)題,但是在分布式/集群項(xiàng)目中,Session 共享則是一個(gè)必須面對(duì)的問(wèn)題,先看一個(gè)簡(jiǎn)單的架構(gòu)圖:

SpringBoot一招搞定session,這么簡(jiǎn)單你確定不看這篇文章

在這樣的架構(gòu)中,會(huì)出現(xiàn)一些單服務(wù)中不存在的問(wèn)題,例如客戶(hù)端發(fā)起一個(gè)請(qǐng)求,這個(gè)請(qǐng)求到達(dá) Nginx 上之后,被 Nginx 轉(zhuǎn)發(fā)到 Tomcat A 上,然后在 Tomcat A 上往 session 中保存了一份數(shù)據(jù),下次又來(lái)一個(gè)請(qǐng)求,這個(gè)請(qǐng)求被轉(zhuǎn)發(fā)到 Tomcat B 上,此時(shí)再去 Session 中獲取數(shù)據(jù),發(fā)現(xiàn)沒(méi)有之前的數(shù)據(jù)。對(duì)于這一類(lèi)問(wèn)題的解決,思路很簡(jiǎn)單,就是將各個(gè)服務(wù)之間需要共享的數(shù)據(jù),保存到一個(gè)公共的地方(主流方案就是 Redis):

SpringBoot一招搞定session,這么簡(jiǎn)單你確定不看這篇文章

當(dāng)所有 Tomcat 需要往 Session 中寫(xiě)數(shù)據(jù)時(shí),都往 Redis 中寫(xiě),當(dāng)所有 Tomcat 需要讀數(shù)據(jù)時(shí),都從 Redis 中讀。這樣,不同的服務(wù)就可以使用相同的 Session 數(shù)據(jù)了。

這樣的方案,可以由開(kāi)發(fā)者手動(dòng)實(shí)現(xiàn),即手動(dòng)往 Redis 中存儲(chǔ)數(shù)據(jù),手動(dòng)從 Redis 中讀取數(shù)據(jù),相當(dāng)于使用一些 Redis 客戶(hù)端工具來(lái)實(shí)現(xiàn)這樣的功能,毫無(wú)疑問(wèn),手動(dòng)實(shí)現(xiàn)工作量還是蠻大的。

一個(gè)簡(jiǎn)化的方案就是使用 Spring Session 來(lái)實(shí)現(xiàn)這一功能,Spring Session 就是使用 Spring 中的代理過(guò)濾器,將所有的 Session 操作攔截下來(lái),自動(dòng)的將數(shù)據(jù) 同步到 Redis 中,或者自動(dòng)的從 Redis 中讀取數(shù)據(jù)。

對(duì)于開(kāi)發(fā)者來(lái)說(shuō),所有關(guān)于 Session 同步的操作都是透明的,開(kāi)發(fā)者使用 Spring Session,一旦配置完成后,具體的用法就像使用一個(gè)普通的 Session 一樣。

1 實(shí)戰(zhàn)

1.1 創(chuàng)建工程

首先 創(chuàng)建一個(gè) Spring Boot 工程,引入 Web、Spring Session 以及 Redis:

SpringBoot一招搞定session,這么簡(jiǎn)單你確定不看這篇文章

創(chuàng)建成功之后,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 ,如果使用當(dāng)前最新版 Spring Boot2.1.5 的話(huà),除了上面這些依賴(lài)之外,需要額外添加 Spring Security 依賴(lài)(其他操作不受影響,僅僅只是多了一個(gè)依賴(lài),當(dāng)然也多了 Spring Security 的一些默認(rèn)認(rèn)證流程)。

1.2 配置 Redis

spring.redis.host=
192.168
.
66.128
spring.redis.port=
6379
spring.redis.password=
123
spring.redis.database=
0

這里的 Redis ,我雖然配置了四行,但是考慮到端口默認(rèn)就是 6379 ,database 默認(rèn)就是 0,所以真正要配置的,其實(shí)就是兩行。

1.3 使用

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

@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;
?}
}

考慮到一會(huì) Spring Boot 將以集群的方式啟動(dòng) ,為了獲取每一個(gè)請(qǐng)求到底是哪一個(gè) Spring Boot 提供的服務(wù),需要在每次請(qǐng)求時(shí)返回當(dāng)前服務(wù)的端口號(hào),因此這里我注入了 server.port 。

接下來(lái) ,項(xiàng)目打包:

SpringBoot一招搞定session,這么簡(jiǎn)單你確定不看這篇文章

打包之后,啟動(dòng)項(xiàng)目的兩個(gè)實(shí)例:

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

然后先訪(fǎng)問(wèn) localhost:8080/set 向 8080 這個(gè)服務(wù)的 Session 中保存一個(gè)變量,訪(fǎng)問(wèn)完成后,數(shù)據(jù)就已經(jīng)自動(dòng)同步到 Redis 中 了 :

SpringBoot一招搞定session,這么簡(jiǎn)單你確定不看這篇文章

然后,再調(diào)用 localhost:8081/get 接口,就可以獲取到 8080 服務(wù)的 session中的數(shù)據(jù):

SpringBoot一招搞定session,這么簡(jiǎn)單你確定不看這篇文章

此時(shí)關(guān)于 session 共享的配置就已經(jīng)全部完成了,session 共享的效果我們已經(jīng)看到了,但是每次訪(fǎng)問(wèn)都是我自己手動(dòng)切換服務(wù)實(shí)例,因此,接下來(lái)我們來(lái)引入 Nginx ,實(shí)現(xiàn)服務(wù)實(shí)例自動(dòng)切換。

1.4 引入 Nginx

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

SpringBoot一招搞定session,這么簡(jiǎn)單你確定不看這篇文章

在這段配置中:

  1. upstream 表示配置上游服務(wù)器

  2. javaboy.org 表示服務(wù)器集群的名字,這個(gè)可以隨意取名字

  3. upstream 里邊配置的是一個(gè)個(gè)的單獨(dú)服務(wù)

  4. weight 表示服務(wù)的權(quán)重,意味者將有多少比例的請(qǐng)求從 Nginx 上轉(zhuǎn)發(fā)到該服務(wù)上

  5. location 中的 proxy_pass 表示請(qǐng)求轉(zhuǎn)發(fā)的地址, / 表示攔截到所有的請(qǐng)求,轉(zhuǎn)發(fā)轉(zhuǎn)發(fā)到剛剛配置好的服務(wù)集群中

  6. proxy_redirect 表示設(shè)置當(dāng)發(fā)生重定向請(qǐng)求時(shí),nginx 自動(dòng)修正響應(yīng)頭數(shù)據(jù)(默認(rèn)是 Tomcat 返回重定向,此時(shí)重定向的地址是 Tomcat 的地址,我們需要將之修改使之成為 Nginx 的地址)。

配置完成后,將本地的 Spring Boot 打包好的 jar 上傳到 Linux ,然后在 Linux 上分別啟動(dòng)兩個(gè) Spring Boot 實(shí)例:

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 表示當(dāng)終端關(guān)閉時(shí),Spring Boot 不要停止運(yùn)行

  • & 表示讓 Spring Boot 在后臺(tái)啟動(dòng)

配置完成后,重啟 Nginx:

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

Nginx 啟動(dòng)成功后,我們首先手動(dòng)清除 Redis 上的數(shù)據(jù),然后訪(fǎng)問(wèn) 192.168.66.128/set 表示向 session中保存數(shù)據(jù),這個(gè)請(qǐng)求首先會(huì)到達(dá) Nginx上,再由 Nginx 轉(zhuǎn)發(fā)給某一個(gè) SpringBoot 實(shí)例:

SpringBoot一招搞定session,這么簡(jiǎn)單你確定不看這篇文章

如上,表示端口為 8081 的 SpringBoot 處理了這個(gè) /set 請(qǐng)求,再訪(fǎng)問(wèn) /get 請(qǐng)求:

SpringBoot一招搞定session,這么簡(jiǎn)單你確定不看這篇文章

可以看到, /get 請(qǐng)求是被端口為 8080 的服務(wù)所處理的。

2 總結(jié)

本文主要向大家介紹了 Spring Session 的使用,另外也涉及到一些 Nginx 的使用 ,雖然本文較長(zhǎng),但是實(shí)際上 Spring Session 的配置沒(méi)啥。

我們寫(xiě)了一些代碼,也做了一些配置,但是全都和 Spring Session 無(wú)關(guān),配置是配置 Redis,代碼就是普通的 HttpSession,和 Spring Session 沒(méi)有任何關(guān)系!

唯一和 Spring Session 相關(guān)的,可能就是我在一開(kāi)始引入了 Spring Session 的依賴(lài)吧!

如果大家沒(méi)有在 SSM 架構(gòu)中用過(guò) Spring Session ,可能不太好理解我們?cè)?Spring Boot 中使用 Spring Session 有多么方便,因?yàn)樵?SSM 架構(gòu)中,Spring Session 的使用要配置三個(gè)地方 ,一個(gè)是 web.xml 配置代理過(guò)濾器,然后在 Spring 容器中配置 Redis,最后再配置 Spring Session,步驟還是有些繁瑣的,而 Spring Boot 中直接幫我們省去了這些繁瑣的步驟!不用再去配置 Spring Session。

最后記得給我點(diǎn)個(gè)關(guān)注哦,每天都會(huì)分享java有關(guān)的文章

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線(xiàn),公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性?xún)r(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專(zhuān)為企業(yè)上云打造定制,能夠滿(mǎn)足用戶(hù)豐富、多元化的應(yīng)用場(chǎng)景需求。

文章名稱(chēng):SpringBoot一招搞定session,這么簡(jiǎn)單你確定不看這篇文章-創(chuàng)新互聯(lián)
當(dāng)前網(wǎng)址:http://muchs.cn/article12/dchodc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供ChatGPT小程序開(kāi)發(fā)、移動(dòng)網(wǎng)站建設(shè)域名注冊(cè)、網(wǎng)站導(dǎo)航、網(wǎng)站排名

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁(yè)設(shè)計(jì)