Springboot實現多服務器session共享
本文實例為大家分享了springboot實現多服務器session共享的具體代碼,供大家參考,具體內容如下
環(huán)境:
springboot:2.0.4
redis:3.2.100
jdk:1.8
eclipse:4.9.0
1.原理
正常情況下,HTTPSession是通過servlet容器創(chuàng)建并管理的,創(chuàng)建成功后都保存在內存中,如果開發(fā)者需要對項目進行橫向拓展搭建集群,那么可以用一些硬件和軟件工具來做負載均衡,此時,來自同一用戶的HTTP請求有可能會被發(fā)送到不同的實例上去,如何保證各個實例之間的Session同步就成為了一個必須解決的問題,Springboot提供了自動化session共享配置,它結合redis非常方便的解決了這個問題。使用Redis解決session共享的原理非常簡單,就是把原本儲存在不同服務器上的session拿出來放到一個獨立的服務器上,可以參考下圖來理解
當一個請求到達Nginx服務器上時,首先請求分發(fā),假設請求被server2處理了,server2在處理請求時,無論存儲還是讀取session的操作,都是去操作session服務器而不是自身內存中的session,其他server也是如此,這樣就實現了session共享!
2.如何實現
關于Nginx和Redis的配置,本文就不再詳細介紹,網上教程也有很多。這里使用手動直接訪問兩個端口模擬nginx反向代理。
2.1首先創(chuàng)建一個springboot項目,全部的pom.xml配置如下:
除了Redis依賴之外,這里還需要提供spring-session-data-redis依賴,Spring Session可以做到透明的替換掉應用中的Session容器。
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>cn</groupId> <artifactId>session-two</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>session-two</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.4.RELEASE</version> <relativePath /> <!-- lookup parent from repository --> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> <exclusions> <exclusion> <groupId>io.lettuce</groupId> <artifactId>lettuce-code</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</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> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
2.2 application.properties中進行redis配置
spring.redis.database=0 spring.redis.host=127.0.0.1 spring.redis.port=6379 spring.redis.password= spring.redis.jedis.pool.max-active=8 spring.redis.jedis.pool.max-idle=8 spring.redis.jedis.pool.max-wait=-1ms spring.redis.jedis.pool.min-idle=0
2.3 創(chuàng)建controller測試
import javax.servlet.http.HttpSession; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class HelloController { @Value("${server.port}") String port; @PostMapping("save") public String saveName(String name,HttpSession session ) { session.setAttribute("name", name); return port; } @GetMapping("get") public String saveName(HttpSession session ) { return port+":"+session.getAttribute("name").toString(); } }
這里提供了兩個接口,一個是save用來向session中保存數據,一個是get用來從session中獲取數據,這里注入了項目端口server.prot主要是用來顯示是那個服務器提供的服務(Nginx下方便查看),雖然我們在這里操作的是Httpsession,但是其實Httpsession容器已經被透明的替換掉了,真正的session此時存儲在redis服務器上。
3.進行測試
3.1將項目打成jar包,然后打開兩個命令提示框,分別執(zhí)行如下兩個命令啟動項目
java -jar session-two-0.0.1-SNAPSHOT.jar --server.port=81 java -jar session-two-0.0.1-SNAPSHOT.jar --server.port=82
3.2使用Postman測試
3.2.1 訪問81服務器并且設置name為張三
3.2.2 訪問82服務器獲取session中保存的name
至此,一個簡單的demo就完成了
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
- springboot中的springSession的存儲和獲取實現
- Springboot中登錄后關于cookie和session攔截問題的案例分析
- spring-redis-session 自定義 key 和過期時間
- SpringBoot2.x 整合Spring-Session實現Session共享功能
- 解決前后端分離 vue+springboot 跨域 session+cookie失效問題
- 詳解SpringBoot2 使用Spring Session集群
- SpringCloud實現Redis在各個微服務的Session共享問題
- spring boot整合redis實現shiro的分布式session共享的方法
- spring-session簡介及實現原理源碼分析
- 淺談Spring Session工作原理
相關文章
Spring mvc Controller和RestFul原理解析
這篇文章主要介紹了Spring mvc Controller和RestFul原理解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-03-03Java Hibernate對象(瞬時態(tài),持久態(tài),脫管態(tài))詳解
這篇文章主要介紹了Java Hibernate對象(瞬時態(tài),持久態(tài),脫管態(tài))詳解的相關資料,這里對Java Hibernate對象進行了介紹及總結,需要的朋友可以參考下2016-11-11Netty分布式高性能工具類recycler的使用及創(chuàng)建
這篇文章主要為大家介紹了Netty分布式高性能工具類recycler的使用和創(chuàng)建,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步2022-03-03