溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Springboot如何實現(xiàn)多服務(wù)器session共享

發(fā)布時間:2021-05-24 11:43:00 來源:億速云 閱讀:389 作者:小新 欄目:編程語言

這篇文章主要介紹了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ù)器上,可以參考下圖來理解

Springboot如何實現(xiàn)多服務(wù)器session共享

當(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為張三

Springboot如何實現(xiàn)多服務(wù)器session共享

3.2.2 訪問82服務(wù)器獲取session中保存的name

Springboot如何實現(xiàn)多服務(wù)器session共享

springboot是什么

springboot一種全新的編程規(guī)范,其設(shè)計目的是用來簡化新Spring應(yīng)用的初始搭建以及開發(fā)過程,SpringBoot也是一個服務(wù)于框架的框架,服務(wù)范圍是簡化配置文件。

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“Springboot如何實現(xiàn)多服務(wù)器session共享”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(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)容。

AI