您好,登錄后才能下訂單哦!
這篇文章主要介紹Springboot Session共享的實(shí)現(xiàn)方法,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!
在傳統(tǒng)的單服務(wù)架構(gòu)中,一般來說,只有一個(gè)服務(wù)器,那么不存在 Session
共享問題,但是在分布式/集群項(xiàng)目中,Session 共享則是一個(gè)必須面對的問題,先看一個(gè)簡單的架構(gòu)圖:
在這樣的架構(gòu)中,會(huì)出現(xiàn)一些單服務(wù)中不存在的問題,例如客戶端發(fā)起一個(gè)請求,這個(gè)請求到達(dá) Nginx 上之后,被
Nginx 轉(zhuǎn)發(fā)到 Tomcat A 上,然后在 Tomcat A 上往 session 中保存了一份數(shù)據(jù),下次又來一個(gè)請求,這個(gè)請求被轉(zhuǎn)發(fā)到 Tomcat
B 上,此時(shí)再去 Session中獲取數(shù)據(jù),發(fā)現(xiàn)沒有之前的數(shù)據(jù)。對于這一類問題的解決,思路很簡單,就是將各個(gè)服務(wù)之間需要共享的數(shù)據(jù),保存到一個(gè)公共的地方(主流方案就是 Redis):
1 實(shí)戰(zhàn)
1.1 創(chuàng)建工程
首先 創(chuàng)建一個(gè) Spring Boot 工程,引入 Web、Spring Session 以及 Redis:
創(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的話,除了上面這些依賴之外,需要額外添加 Spring Security 依賴(其他操作不受影響,僅僅只是多了一個(gè)依賴,當(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
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è)請求到底是哪一個(gè) Spring Boot 提供的服務(wù),需要在每次請求時(shí)返回當(dāng)前服務(wù)的端口號,因此這里我注入了 server.port 。
接下來 ,項(xiàng)目打包:
打包之后,啟動(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
然后先訪問 localhost:8080/set 向 8080 這個(gè)服務(wù)的 Session 中保存一個(gè)變量,訪問完成后,數(shù)據(jù)就已經(jīng)自動(dòng)同步到 Redis 中 了 :
然后,再調(diào)用 localhost:8081/get 接口,就可以獲取到 8080 服務(wù)的 session 中的數(shù)據(jù):
此時(shí)關(guān)于 session 共享的配置就已經(jīng)全部完成了,session 共享的效果我們已經(jīng)看到了,但是每次訪問都是我自己手動(dòng)切換服務(wù)實(shí)例,因此,接下來我們來引入 Nginx ,實(shí)現(xiàn)服務(wù)實(shí)例自動(dòng)切換。
1.4 引入 Nginx
很簡單,進(jìn)入 Nginx 的安裝目錄的 conf 目錄下(默認(rèn)是在 /usr/local/nginx/conf),編輯 nginx.conf 文件:
在這段配置中:
配置完成后,將本地的 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 &
其中
配置完成后,重啟 Nginx:
/usr/local/nginx/sbin/nginx -s reload
Nginx 啟動(dòng)成功后,我們首先手動(dòng)清除 Redis 上的數(shù)據(jù),然后訪問 192.168.66.128/set 表示向 session 中保存數(shù)據(jù),這個(gè)請求首先會(huì)到達(dá) Nginx 上,再由 Nginx 轉(zhuǎn)發(fā)給某一個(gè) Spring Boot 實(shí)例:
如上,表示端口為 8081 的 Spring Boot 處理了這個(gè) /set 請求,再訪問 /get 請求:
可以看到,/get 請求是被端口為 8080 的服務(wù)所處理的。
以上是Springboot Session共享的實(shí)現(xiàn)方法的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。