分布式session解決方案

? ? ? ? 在實際項目中,前臺代碼部署在nginx中,后臺服務內嵌了tomcat運行在不同的節點中,常見的架構如下:

? ? ? ? 在上述架構中,nginx轉發前臺請求,第一次登錄后,將用戶登錄信息寫入到一臺服務session中(假設為A節點),再次請求后,假設nginx轉發到了B節點,B服務節點中沒有session用戶登錄信息,此時還需要登錄,session在服務集群內不可用,不符合預期,示例代碼如下:

package com.gingko.session.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpSession;@RestController
@RequestMapping("/login")
public class LoginController {@GetMapping("/toLogin")public String toLogin(@RequestParam String userName, @RequestParam String password,HttpSession httpSession) {//校驗用戶名密碼...//用戶名加入sessionhttpSession.setAttribute("userName",userName);return "登錄成功";}@GetMapping("/getLoginUser")public String getLoginUser(HttpSession httpSession) {return "session獲取的值是:" + httpSession.getAttribute("userName") ;}
}

? ? ? ? 基于上述的代碼測試效果如下(后臺啟動了2個服務,端口分別是8081和8082),從下圖中可以看出8081登錄后,訪問8082時獲取不到登錄信息。

?

????????分布式session解決方案有很多,本文闡述【Session集中存儲】的解決方案,即將session集中存儲到某個地方,本文演示存儲到redis中,架構示意圖如下:

? ? ? ? 代碼架構引入redis和spring session,示例代碼如下:

? ? ? ? 1、引入?redis和spring session依賴

<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.gingko</groupId><artifactId>distributed-session</artifactId><version>0.0.1-SNAPSHOT</version><name>distributed-session</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><spring-boot.version>2.7.6</spring-boot.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>org.springframework.session</groupId><artifactId>spring-session-data-redis</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring-boot.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>1.8</source><target>1.8</target><encoding>UTF-8</encoding></configuration></plugin><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>${spring-boot.version}</version><configuration><mainClass>com.gingko.session.DistributedSessionApplication</mainClass><skip>true</skip></configuration><executions><execution><id>repackage</id><goals><goal>repackage</goal></goals></execution></executions></plugin></plugins></build></project>

? ? ? ? 2、修改配置,增加對redis和session的支持

# 應用服務 WEB 訪問端口
server:port: 8081
spring:redis:host: 192.168.136.130 #redisport: 6379database: 0session:store-type: redis #session 存儲方式timeout: 1800 #session 過期時間 30分鐘

? ? ? ? 3、啟動2個應用測試(端口8081和8082),從下圖中可以看出8081登錄后,redis緩存中增加了session信息,8082也可以獲取到登錄信息,符合預期。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/86428.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/86428.shtml
英文地址,請注明出處:http://en.pswp.cn/web/86428.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

UDP 緩沖區

UDP 有接收緩沖區&#xff0c;沒有發送緩沖區 引申問題 1、為什么沒有發送緩沖區&#xff1f; 直接引用原文 “因為 UDP 是不可靠的&#xff0c;它不必保存應用進程的數據拷貝&#xff0c;因此無需一個真正的發送緩沖區” 2、沒有發送緩沖區的情況下&#xff0c;sendto 的數…

解密 C++ 中的左值(lvalue)與右值(rvalue)的核心內容

在 C 中&#xff0c;表達式&#xff08;expression&#xff09; 可以被歸類為左值或右值。最簡單的理解方式是&#xff1a; 左值&#xff08;lvalue&#xff09;&#xff1a; 能放在賦值號 左邊的表達式&#xff0c;通常表示一個有名字、有內存地址、可以持續存在的對象。你可…

MATLAB(2)選擇結構

選擇結構又可以叫做分支結構&#xff0c;它根據給定的條件是否成立&#xff0c;決定程序運行的方向。在不同的條件下執行不同的操作。 MATLAB可以用來實現選擇結構的語句有三種&#xff1a;if語句、switch語句、try語句。 一.if語句 1.if語句 1.1條件為矩陣的情況 if語句的…

Ehcache、Caffeine、Spring Cache、Redis、J2Cache、Memcached 和 Guava Cache 的主要區別

主流緩存技術 Ehcache、Caffeine、Spring Cache、Redis、J2Cache、Memcached 和 Guava Cache 的主要區別&#xff0c;涵蓋其架構、功能、適用場景和優缺點等方面&#xff1a; Ehcache 類型: 本地緩存&#xff08;JVM 內存緩存&#xff09; 特點: 輕量級&#xff0c;運行在 JV…

谷歌瀏覽器截圖全屏擴展程序

以下是一些支持跟隨鼠標滾輪滾動截圖的谷歌全屏截圖擴展程序插件&#xff1a; GoFullPage&#xff1a;這是一款專門截取整個網頁的截圖插件。安裝后&#xff0c;點擊瀏覽器右上角的圖標或使用快捷鍵AltShiftP&#xff0c;插件就會自動開始滾動并捕獲當前訪問的網站&#xff0c…

專線服務器具體是指什么?

專線服務器主要是指在互聯網或者是局域網中&#xff0c;為特定用戶或者是應用程序所提供的專用服務器設備&#xff0c;專線服務器與傳統的共享服務器相比較來說&#xff0c;有著更高的安全性和更為穩定的網絡連接&#xff0c;下面我們就來共同了解一下專線服務器的具體內容吧&a…

Jenkins JNLP與SSH節點連接方式對比及連接斷開問題解決方案

一、JNLP vs SSH 連接方式優缺點對比 對比維度JNLP&#xff08;Java Web Start&#xff09;SSH&#xff08;Secure Shell&#xff09;核心原理代理節點主動連接Jenkins主節點&#xff0c;通過加密通道通信&#xff0c;支持動態資源分配。Jenkins通過SSH協議遠程登錄代理節點執…

Git - Commit命令

git commit 是 Git 版本控制系統中核心的提交命令&#xff0c;用于將暫存區&#xff08;Stage/Index&#xff09;中的修改&#xff08;或新增/刪除的文件&#xff09;永久記錄到本地倉庫&#xff08;Repository&#xff09;&#xff0c;生成一個新的提交記錄&#xff08;Commit…

Android System WebView Canary:探索前沿,體驗最新功能

在移動互聯網時代&#xff0c;WebView作為Android系統的核心組件之一&#xff0c;承擔著在原生應用中顯示Web內容的重要任務。它不僅為用戶提供了便捷的網頁瀏覽體驗&#xff0c;還為開發者提供了強大的混合式開發能力。Android System WebView Canary&#xff08;金絲雀版本&a…

kubernetes架構原理

目錄 一. 為什么需要 Kubernetes 1. 對于開發人員 2. 對于運維人員 3. Kubernetes 帶來的挑戰 二. Kubernetes 架構解析 1. master 節點的組件 2. Node 節點包含的組件 3. kubernetes網絡插件 三. kubeadm塊速安裝kubernetes集群 1. 基礎環境準備(此步驟在三個節點都執…

服務器的安裝與安全設置 域環境的搭建和管理 Windows基本配置 網絡服務常用網絡命令的應用 安全管理Windows Server 2019

高等職業教育計算機網絡技術專業實訓指導書 2025年目 錄 實訓的目的和意義 實訓的具體目標及主要內容 實訓完成后需要提交的內容 項目一 服務器的安裝與安全設置 項目二 域環境的搭建和管理 項目三 Windows基本配置 項目四 網絡服務 項目五 常用網絡命令的應用 項目六…

Springcloud解決jar包運行時無法拉取nacos遠程配置文件

問題描述 springcloud微服務&#xff0c;在idea中運行代碼&#xff0c;能夠正常拉去nacos上的配置文件&#xff0c;打包后&#xff0c;通過jar包啟動 java -jar xxx.jar&#xff0c;出現錯誤&#xff1a;java.nio.charset.MalformedlnputException: Input length 1 問題原因…

【Leetcode刷題隨筆】01. 兩數之和

1. 題目描述 給定一個整數數組 nums 和一個目標值 target&#xff0c;請你在該數組中找出和為目標值的那 兩個 整數&#xff0c;并返回他們的數組下標。 你可以假設每種輸入只會對應一個答案。但是&#xff0c;數組中同一個元素不能使用兩遍。 示例: 給定 nums [2, 7, 11,…

【機器學習深度學習】多層神經網絡的構成

目錄 一、神經網絡模型的結構化組成方式 1. 最底層&#xff1a;神經網絡模型 (Model) 2. 中間層&#xff1a;單個神經網絡層 (Layer) 3. 最頂層&#xff1a;訓練參數的細節 (Parameters & Variables) 二、關鍵理解要點 三、類比理解 場景一&#xff1a;工廠運作 場…

設計模式:揭秘Java原型模式——讓復雜對象的創建不再復雜

原型模式 原型模式介紹 定義: 原型模式(Prototype Design Pattern)用一個已經創建的實例作為原型&#xff0c;通過復制該原型對象來創建一個和原型對象相同的新對象。 西游記中的孫悟空&#xff0c;拔毛變小猴&#xff0c;孫悟空這種根據自己的形狀復制出多個身外化身的技巧&…

Go語言-文件操作

基本介紹 文件是數據源&#xff0c;數據庫也是一種特殊的文件。 Go語言中os.File結構體封裝了文件的相關操作。 打開和關閉文件 -----打開文件----- file, err : os.Open("D:/111.txt") if err ! nil{fmt.Println("err ", err) }此時file就是一個指針&…

【電力物聯網】云–邊協同介紹

(??? )&#xff0c;Hello&#xff0c;我是祐言QAQ我的博客主頁&#xff1a;C/C語言&#xff0c;數據結構&#xff0c;Linux基礎&#xff0c;ARM開發板&#xff0c;網絡編程等領域UP&#x1f30d;快上&#x1f698;&#xff0c;一起學習&#xff0c;讓我們成為一個強大的技術…

《深入解析 C#(第 4 版)》推薦

《深入解析 C#&#xff08;第 4 版&#xff09;》推薦 在 C# 語言不斷演進的技術浪潮中&#xff0c;《深入解析 C#&#xff08;第 4 版&#xff09;》猶如一座燈塔&#xff0c;為開發者照亮探索的道路。無論是經驗豐富的老程序員&#xff0c;還是初入 C# 領域的新手&#xff0c…

【網絡】Linux 內核優化實戰 - net.core.netdev_max_backlog

目錄 Linux 內核參數 net.core.netdev_max_backlog 詳解一、參數概述二、參數功能與作用2.1 核心功能2.2 網絡數據包處理流程 三、查看當前參數值3.1 通過 sysctl 命令3.2 直接讀取 /proc/sys 文件 四、修改參數值4.1 臨時修改&#xff08;立即生效&#xff0c;重啟后失效&…

Nuitka 打包Python程序

文章目錄 Nuitka 打包Python程序&#x1f680; **一、Nuitka 核心優勢**?? **二、環境準備&#xff08;Windows 示例&#xff09;**&#x1f4e6; **三、基礎打包命令****單文件腳本打包****帶第三方庫的項目** &#x1f6e0;? **四、高級配置選項****示例&#xff1a;完整命…