首页 > 其他分享 >SpringbBoot如何实现Tomcat集群的会话管理

SpringbBoot如何实现Tomcat集群的会话管理

时间:2024-12-26 11:57:55浏览次数:5  
标签:session SpringbBoot Tomcat Spring Redis 会话 Session 集群

在使用 Tomcat 集群时,由于每个 Tomcat 实例的 Session 存储是独立的,导致无法实现 Session 的共享,这可能影响到用户跨节点的访问。为了实现跨 Tomcat 实例共享 Session,可以使用 Spring Session 配合 Redis 进行集中式会话管理。

架构设计

Nginx 反向代理:

- 通过 Nginx 作为反向代理,将客户端请求均衡地转发到 Tomcat 集群中的不同节点上。
- Nginx 会根据配置的负载均衡策略(例如轮询、IP 哈希等)将请求分发到各个 Tomcat 实例。

Tomcat 集群:

- 每个 Tomcat 实例接收并处理请求,但它们的 Session 信息不再存储在本地,而是通过 Spring Session 统一管理。
- Spring Session 会使用 Redis 存储会话信息,使得所有 Tomcat 实例可以访问到同一个会话数据。

Spring Session:

- Spring Session 提供了透明的会话管理,能够自动将 Session 数据存储到 Redis 中。
- 每次请求到达 Tomcat 时,Spring Session 会根据 Session ID 从 Redis 中读取会话数据,或者创建一个新的会话数据并存储到 Redis。

Redis:

- Redis 作为分布式缓存和会话存储介质,确保 Tomcat 集群中的所有实例可以共享 Session 信息。
- Redis 负责存储 Session 数据,包括会话过期时间、会话属性等,保证了会话的高可用性和一致性。

实现步骤

添加依赖: 在 Spring Boot 项目中,添加 Spring Session 和 Redis 的相关依赖

<dependency>
    <groupId>org.springframework.session</groupId>
    <artifactId>spring-session-data-redis</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

配置 Redis:application.ymlapplication.properties 中配置 Redis 连接信息:

spring:
  session:
    store-type: redis
  redis:
    host: 127.0.0.1
    port: 6379
    password: xxxxxxxxx

启用 Spring Session: 在 Spring Boot 启动类中添加 @EnableRedisHttpSession 注解,启用 Redis 会话存储:

package com.neo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;

@SpringBootApplication
@EnableRedisHttpSession
public class DockerApplication {

	public static void main(String[] args) {
		SpringApplication.run(DockerApplication.class, args);
	}
}

部署多台 Tomcat 实例

首先,你需要部署多个 Tomcat 实例。每个实例运行一个 Spring Boot 应用,并确保它们能通过负载均衡器(如 Nginx)进行访问。可以在不同的物理或虚拟机上部署 Tomcat,或者在同一台机器上使用不同的端口来运行多个实例。

例如,我们可以配置两个 Tomcat 实例,分别在 localhost:8080 和 localhost:8081 上运行。

请在此添加图片描述

请在此添加图片描述

配置负载均衡器(Nginx)

Nginx 可以作为负载均衡器,分发请求到多个 Tomcat 实例。首先,确保 Nginx 已安装,并进行如下配置:

http {
    upstream tomcat_cluster {
        server 127.0.0.1:8080;  # Tomcat 实例 1
        server 127.0.0.1:8081;  # Tomcat 实例 2
    }
	
    server {
        listen 80;

        location / {
            proxy_pass http://tomcat_cluster;  # 将请求转发到 Tomcat 集群
			
			proxy_set_header Host $host;
			proxy_set_header X-Real-IP $remote_addr;
			proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }
}

配置完 Nginx 后,重新启动 Nginx 服务:

systemctl restart nginx

展示了如何在 Spring Boot 中编写一个使用 Spring Session 的简单 Controller,并进行会话数据的存储和读取。我们将创建一个用于存储和读取用户信息的会话控制器,并提供一些基本的测试方法来验证会话是否能够在集群中共享。

创建 SessionController 控制器

package com.neo.controller;

import org.springframework.session.Session;
import org.springframework.session.SessionRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

@RestController
@RequestMapping("/session")
public class SessionController {

    // 自动注入 Spring Session 的 SessionRepository
    @Autowired
    private SessionRepository<? extends Session> sessionRepository;

    @GetMapping("/set")
    public String setSession(HttpServletRequest request) {
        // 使用 HttpSession 来设置会话数据
        HttpSession session = request.getSession();
        // 设置会话属性
        session.setAttribute("user", "ZhangSan");
        return "Session attribute 'user' is set to 'ZhangSan' using Spring Session";
    }

    @GetMapping("/get")
    public String getSession(HttpServletRequest request) {

        // 获取当前节点的 Tomcat 服务器信息
        String tomcatVersion = System.getProperty("catalina.base");
        String nodeName = System.getProperty("user.name");
        System.out.println("tomcatVersion:" + tomcatVersion);
        System.out.println("nodeName:" + nodeName);
        // 使用 HttpSession 获取会话数据
        HttpSession session = request.getSession(false);
        // 获取会话属性
        Object user = session.getAttribute("user");
        return user != null ? "Session attribute 'user' is: " + user : "No session attribute found!";
    }
}

测试用例

测试场景

  • 设置会话数据: 使用 /session/set 设置一个用户名到 Session 中。
  • 获取会话数据: 使用 /session/get 读取存储在 Session 中的 user,并返回该值。

测试步骤

  • 步骤 1:访问 http://localhost/session/set 设置会话中的用户名。

请在此添加图片描述

  • 步骤 2:访问 http://localhost/session/get 获取并显示存储的用户名。

请在此添加图片描述

验证跨节点共享

在 Tomcat 集群环境中,使用上述的测试方法分别在不同的 Tomcat 实例上进行测试。由于 Spring Session 会将会话信息存储在 Redis 中,因此无论请求被转发到哪个 Tomcat 实例,都会共享相同的会话数据。

期望的结果:

  • 在集群中的任一节点上设置的会话数据,都会在其他节点上生效。
  • 使用 Nginx 的负载均衡特性,用户可以跨多个 Tomcat 实例访问相同的会话数据,确保会话的一致性和持久性。

Redis 配置

确保 Redis 正常运行,并配置了正确的连接信息,Spring Session 会自动管理会话数据。可以使用 Redis 的客户端工具(例如 redis-cli 或其他工具)查看会话数据是否正确存储:

请在此添加图片描述

总结

本文详细阐述了如何利用 Nginx 作为负载均衡器,将请求均匀分发到多个 Tomcat 实例,并通过 Spring Session 将会话数据存储到 Redis 中,确保所有 Tomcat 实例共享相同的会话数据。文章还包括了具体的实现步骤,如依赖配置、Redis 配置、Spring Session 启用、负载均衡器配置以及会话控制器的编写。最后,文章通过具体的测试步骤,验证了跨节点会话共享的实现。

标签:session,SpringbBoot,Tomcat,Spring,Redis,会话,Session,集群
From: https://blog.csdn.net/u012263509/article/details/144352006

相关文章

  • KingbaeES V9集群运维案例之---透明加密表空间切换测试
    案例说明:在主备复制集群环境,配置透明加密后,集群switchover和failover切换测试。测试数据库版本:prod=#selectversion();version-------------------------------------------------------------------------------......
  • docker-compose 搭建nacos集群
    1、第一步安装docker和docker-compose(略过,可参考其他教程)2、第二步创建对应的文件夹mkdir/my_nacosmkdir-p/my_nacos/nacos/logs/nacos1/my_nacos/nacos/logs/nacos2/my_nacos/nacos/logs/nacos3mkdir-p/my_nacos/nacos/data/nacos1/my_nacos/nacos/data/nacos2......
  • redis 数据迁移到集群
    关闭protected-mode/usr/local/redis/bin/redis-cli-p26379-a123456--no-auth-warning-h192.168.174.108configsetprotected-modeno/usr/local/redis/bin/redis-cli-p26379-a123456--no-auth-warning-h192.168.174.112configsetprotected-modeno/us......
  • hadoop集群部署
    1.前置条件及准备工作SSH免密登录JDK1.8上传tar包远程调用脚本及远程同步脚本远程调用脚本#!/bin/bashp_cnt=$#if((p_cnt<1));then echonoargs; exit;ficuser=`whoami`forhostinnode1node2node3do echo---------$host----------- ssh-p6......
  • redis7.4 集群配置
    集群规划节点规划redis-01192.168.174.108redis-02192.168.174.112redis-03192.168.174.117redis-04192.168.174.114redis-05192.168.174.115redis-06192.168.174.116redis-07192.168.174.118redis-08192.168.174.119redis服务配置redis.conf配置sed-i-e......
  • #渗透测试#漏洞挖掘#红蓝攻防#漏洞挖掘#信息泄露漏洞-Apache Tomcat页面泄露漏洞
    免责声明本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停止本文章读。目录一、ApacheTomcat是什么二、Tomcat存在的漏洞三、Tomc......
  • 安装K8s集群
    原文链接:https://blog.liuzijian.com/post/9aa6d426-a01c-05b0-6f7a-5da4343f0f9e.html因阿里云加速服务调整,镜像加速服务自2024年7月起不再支持,拉取镜像,下载网络插件等操作,需要科学上网访问DockerHub。安装全过程均使用ROOT权限。1.安装前准备工作这里采用3台CentO......
  • Alluxio 单机和集群部署教程
    目录Alluxio单机和集群部署教程第一部分:Alluxio概述Alluxio的关键特点:第二部分:Alluxio单机部署教程1.安装Alluxio1.1下载并解压Alluxio1.2配置Alluxio1.3启动Alluxio1.4测试功能2.单机案例代码实现(Python)2.1Python示例代码3.常见问题及解决方法3.1A......
  • Logstash 单机与集群部署教程
    目录Logstash单机与集群部署教程第一部分:Logstash概述第二部分:Logstash单机部署教程1.安装Logstash1.1安装依赖1.2配置Logstash1.3启动Logstash2.单机案例代码实现(Python)3.常见问题及解决方法3.1Logstash启动失败3.2无法连接到Elasticsearch第三部分:L......
  • Tomcat安装和使用
    Tomcat【1】、Tomcat基本介绍环境准备JVM介绍Java业务都是运行在java虚拟机上,java虚拟机简称JVM(javavirtualmachine)虚拟机是通过软件模拟出具有完整硬件系统的功能为什么Java需要JVM虚拟机早期C语言不支持跨平台,如果C语言想要在WindowsLinuxMac上运行,需要进行分别编......