溫馨提示×

溫馨提示×

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

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

Springboot如何實現多服務器session共享

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

這篇文章主要介紹了Springboot如何實現多服務器session共享,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

具體內容如下

環境:

springboot:2.0.4
redis:3.2.100
jdk:1.8
eclipse:4.9.0

1.原理

正常情況下,HTTPSession是通過servlet容器創建并管理的,創建成功后都保存在內存中,如果開發者需要對項目進行橫向拓展搭建集群,那么可以用一些硬件和軟件工具來做負載均衡,此時,來自同一用戶的HTTP請求有可能會被發送到不同的實例上去,如何保證各個實例之間的Session同步就成為了一個必須解決的問題,Springboot提供了自動化session共享配置,它結合redis非常方便的解決了這個問題。使用Redis解決session共享的原理非常簡單,就是把原本儲存在不同服務器上的session拿出來放到一個獨立的服務器上,可以參考下圖來理解

Springboot如何實現多服務器session共享

當一個請求到達Nginx服務器上時,首先請求分發,假設請求被server2處理了,server2在處理請求時,無論存儲還是讀取session的操作,都是去操作session服務器而不是自身內存中的session,其他server也是如此,這樣就實現了session共享!

2.如何實現

關于Nginx和Redis的配置,本文就不再詳細介紹,網上教程也有很多。這里使用手動直接訪問兩個端口模擬nginx反向代理。

2.1首先創建一個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 創建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包,然后打開兩個命令提示框,分別執行如下兩個命令啟動項目

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

Springboot如何實現多服務器session共享

3.2.2 訪問82服務器獲取session中保存的name

Springboot如何實現多服務器session共享

springboot是什么

springboot一種全新的編程規范,其設計目的是用來簡化新Spring應用的初始搭建以及開發過程,SpringBoot也是一個服務于框架的框架,服務范圍是簡化配置文件。

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女