SpringBoot中使用Session共享實(shí)現(xiàn)分布式部署的示例代碼
前言:我們知道,在單體項(xiàng)目中,我們將用戶信息存在 session 中,那么在該 session 過(guò)期之前,我們都可以從 session 中獲取到用戶信息,通過(guò)登錄攔截,進(jìn)行操作
但是分布式部署的時(shí)候,我們請(qǐng)求的服務(wù)器可能不是同一臺(tái)服務(wù)器,那么我們就必須要面對(duì) session 共享的問(wèn)題,下面介紹的是在 SpringBoot 實(shí)現(xiàn) session 共享的方式
一、創(chuàng)建項(xiàng)目
創(chuàng)建 SpringBoot 項(xiàng)目,選擇 Maven 依賴


最終 pom.xml 文件如下:
<!-- redis的依賴 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <!-- web的依賴 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- session共享的依賴 --> <dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-data-redis</artifactId> </dependency>
二、配置 Redis
我們需要借助 redis 實(shí)現(xiàn) session 共享,所以我們需要在配置文件中配置 redis 的信息
server: port: 8080 spring: redis: host: 127.0.0.1 port: 6379 database: 0 password:
我們配置了該項(xiàng)目的端口,以及 redis 的連接信息
三、寫(xiě)接口
package com.zyxx.session.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpSession;
@RestController
public class DemoController {
/**
* 獲取項(xiàng)目端口
*/
@Value("${server.port}")
private String port;
/**
* 將信息存放在session中
*/
@GetMapping("set")
public String set(HttpSession session) {
session.setAttribute("user", "hello world~~~");
return port;
}
/**
* 從session中獲取信息
*/
@GetMapping("get")
public String get(HttpSession session) {
return session.getAttribute("user") + " : " + port;
}
}
我們寫(xiě)了一個(gè) set,一個(gè) get 方法,將信息存放在 session 中,從 session 中取出信息
四、打包測(cè)試

啟動(dòng)項(xiàng)目,分別啟動(dòng)在兩個(gè)端口:
java -jar .\session-0.0.1-SNAPSHOT.jar --server.port=8080 java -jar .\session-0.0.1-SNAPSHOT.jar --server.port=8081
分別啟動(dòng)在 8080,8081端口
訪問(wèn):http://localhost:8080/set

我們從 8080 端口,將信息保存在 session 中
我們?cè)L問(wèn):http://localhost:8081/get

我們?cè)?8081 端口的項(xiàng)目中從 session 中取出了內(nèi)容:hello world~~~
由此證明,我們的 session 共享已經(jīng)成功
五、分布式部署
下面我們借助 nginx 代理轉(zhuǎn)發(fā)訪問(wèn)這兩個(gè)項(xiàng)目
1、配置轉(zhuǎn)發(fā)
nginx 配置文件如下:

主要配置內(nèi)容:
upstream helloworld{
server 127.0.0.1:8080 weight=1;
server 127.0.0.1:8081 weight=2;
}
這里配置轉(zhuǎn)發(fā)到 8080,8081 端口,并配置了權(quán)重
location / {
proxy_pass http://helloworld;
#root html;
#index index.html index.htm;
}
攔截本地的所有請(qǐng)求,默認(rèn)端口為 80
2、啟動(dòng) nginx
nginx -s reload
3、訪問(wèn)測(cè)試
我們先刪除 redis 里面剛剛測(cè)試保存的信息

然后我們?cè)L問(wèn):
http://localhost/set

這里我們可以看出,由 8080 端口的服務(wù)器完成了 set 請(qǐng)求,多次訪問(wèn),nginx 將會(huì)根據(jù)什么配置的權(quán)重參數(shù)分配服務(wù)器來(lái)完成操作
下面我們?cè)L問(wèn):
http://localhost/get

可以看出,由 8081 端口的服務(wù)器完成了 get 請(qǐng)求,并成功取到了存在 session 中的數(shù)據(jù),實(shí)現(xiàn)了 session 共享
六、總結(jié)
1、以前我們?cè)?SSM 架構(gòu)的項(xiàng)目中實(shí)現(xiàn) session 共享,需要配置三個(gè)地方 ,一個(gè)是 web.xml 配置代理過(guò)濾器,然后在 Spring 容器中配置 Redis,最后再配置 Spring Session,相比 SpringBoot,稍有復(fù)雜
2、我們?cè)?SpringBoot 中實(shí)現(xiàn) session 共享還是非常簡(jiǎn)單的,只需要引入依賴,簡(jiǎn)單配置即可實(shí)現(xiàn)
3、實(shí)現(xiàn) session 共享,幫助我們將項(xiàng)目分布式部署,提升服務(wù)性能有很大的意義
到此這篇關(guān)于SpringBoot中使用Session共享實(shí)現(xiàn)分布式部署的示例代碼的文章就介紹到這了,更多相關(guān)SpringBoot Session分布式部署內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Springboot Session共享實(shí)現(xiàn)原理及代碼實(shí)例
- SpringBoot中實(shí)現(xiàn)分布式的Session共享的詳細(xì)教程
- SpringBoot Session共享實(shí)現(xiàn)圖解
- 基于SpringBoot+Redis的Session共享與單點(diǎn)登錄詳解
- SpringBoot2.x 整合Spring-Session實(shí)現(xiàn)Session共享功能
- Springboot實(shí)現(xiàn)多服務(wù)器session共享
- 詳解springboot中redis的使用和分布式session共享問(wèn)題
- SpringBoot 如何實(shí)現(xiàn)Session共享
相關(guān)文章
基于JPA實(shí)體類監(jiān)聽(tīng)器@EntityListeners注解的使用實(shí)例
這篇文章主要介紹了JPA實(shí)體類監(jiān)聽(tīng)器@EntityListeners注解的使用實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
java調(diào)用未知類的指定方法簡(jiǎn)單實(shí)例
這篇文章介紹了java調(diào)用未知類的指定方法簡(jiǎn)單實(shí)例,有需要的朋友可以參考一下2013-09-09
Java文件分級(jí)目錄打包下載zip的實(shí)例代碼
這篇文章主要介紹了Java文件分級(jí)目錄打包下載zip的實(shí)例代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08
SpringBoot個(gè)性化啟動(dòng)Banner設(shè)置方法解析
這篇文章主要介紹了SpringBoot個(gè)性化啟動(dòng)Banner設(shè)置方法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03
SpringMVC上傳文件的三種實(shí)現(xiàn)方式
本篇文章主要介紹了SpringMVC上傳文件的三種實(shí)現(xiàn)方式,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-12-12
spring 或者spring boot 調(diào)整bean加載順序的方式
這篇文章主要介紹了spring 或者spring boot 調(diào)整bean加載順序的方式,本文通過(guò)實(shí)例代碼講解三種調(diào)整類加載順序的方式,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-03-03
java的springboot實(shí)現(xiàn)將base64編碼轉(zhuǎn)換pdf
在Spring Boot中,將Base64編碼的字符串轉(zhuǎn)換為PDF文件并導(dǎo)出到客戶端,通常涉及幾個(gè)步驟:首先將Base64字符串解碼為字節(jié)數(shù)組,然后使用這些字節(jié)數(shù)據(jù)來(lái)創(chuàng)建PDF文件,并最終通過(guò)HTTP響應(yīng)將其發(fā)送給客戶端2024-08-08

