您好,登錄后才能下訂單哦!
這篇文章主要介紹了Springboot如何實現(xiàn)多服務(wù)器session共享,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
具體內(nèi)容如下
環(huán)境:
springboot:2.0.4
redis:3.2.100
jdk:1.8
eclipse:4.9.0
1.原理
正常情況下,HTTPSession是通過servlet容器創(chuàng)建并管理的,創(chuàng)建成功后都保存在內(nèi)存中,如果開發(fā)者需要對項目進行橫向拓展搭建集群,那么可以用一些硬件和軟件工具來做負(fù)載均衡,此時,來自同一用戶的HTTP請求有可能會被發(fā)送到不同的實例上去,如何保證各個實例之間的Session同步就成為了一個必須解決的問題,Springboot提供了自動化session共享配置,它結(jié)合redis非常方便的解決了這個問題。使用Redis解決session共享的原理非常簡單,就是把原本儲存在不同服務(wù)器上的session拿出來放到一個獨立的服務(wù)器上,可以參考下圖來理解
當(dāng)一個請求到達(dá)Nginx服務(wù)器上時,首先請求分發(fā),假設(shè)請求被server2處理了,server2在處理請求時,無論存儲還是讀取session的操作,都是去操作session服務(wù)器而不是自身內(nèi)存中的session,其他server也是如此,這樣就實現(xiàn)了session共享!
2.如何實現(xiàn)
關(guān)于Nginx和Redis的配置,本文就不再詳細(xì)介紹,網(wǎng)上教程也有很多。這里使用手動直接訪問兩個端口模擬nginx反向代理。
2.1首先創(chuàng)建一個springboot項目,全部的pom.xml配置如下:
除了Redis依賴之外,這里還需要提供spring-session-data-redis依賴,Spring Session可以做到透明的替換掉應(yīng)用中的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中保存數(shù)據(jù),一個是get用來從session中獲取數(shù)據(jù),這里注入了項目端口server.prot主要是用來顯示是那個服務(wù)器提供的服務(wù)(Nginx下方便查看),雖然我們在這里操作的是Httpsession,但是其實Httpsession容器已經(jīng)被透明的替換掉了,真正的session此時存儲在redis服務(wù)器上。
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服務(wù)器并且設(shè)置name為張三
3.2.2 訪問82服務(wù)器獲取session中保存的name
springboot一種全新的編程規(guī)范,其設(shè)計目的是用來簡化新Spring應(yīng)用的初始搭建以及開發(fā)過程,SpringBoot也是一個服務(wù)于框架的框架,服務(wù)范圍是簡化配置文件。
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“Springboot如何實現(xiàn)多服務(wù)器session共享”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。