SpringBoot中使用Session共享实现分布式部署的示例代码
作者:Asurplus、 发布时间:2022-10-17 04:27:54
前言:我们知道,在单体项目中,我们将用户信息存在 session 中,那么在该 session 过期之前,我们都可以从 session 中获取到用户信息,通过登录拦截,进行操作
但是分布式部署的时候,我们请求的服务器可能不是同一台服务器,那么我们就必须要面对 session 共享的问题,下面介绍的是在 SpringBoot 实现 session 共享的方式
一、创建项目
创建 SpringBoot 项目,选择 Maven 依赖
最终 pom.xml 文件如下:
<!-- redis的依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- web的依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- session共享的依赖 -->
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
二、配置 Redis
我们需要借助 redis 实现 session 共享,所以我们需要在配置文件中配置 redis 的信息
server:
port: 8080
spring:
redis:
host: 127.0.0.1
port: 6379
database: 0
password:
我们配置了该项目的端口,以及 redis 的连接信息
三、写接口
package com.zyxx.session.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpSession;
@RestController
public class DemoController {
/**
* 获取项目端口
*/
@Value("${server.port}")
private String port;
/**
* 将信息存放在session中
*/
@GetMapping("set")
public String set(HttpSession session) {
session.setAttribute("user", "hello world~~~");
return port;
}
/**
* 从session中获取信息
*/
@GetMapping("get")
public String get(HttpSession session) {
return session.getAttribute("user") + " : " + port;
}
}
我们写了一个 set,一个 get 方法,将信息存放在 session 中,从 session 中取出信息
四、打包测试
启动项目,分别启动在两个端口:
java -jar .\session-0.0.1-SNAPSHOT.jar --server.port=8080
java -jar .\session-0.0.1-SNAPSHOT.jar --server.port=8081
分别启动在 8080,8081端口
访问:http://localhost:8080/set
我们从 8080 端口,将信息保存在 session 中
我们访问:http://localhost:8081/get
我们在 8081 端口的项目中从 session 中取出了内容:hello world~~~
由此证明,我们的 session 共享已经成功
五、分布式部署
下面我们借助 nginx 代理转发访问这两个项目
1、配置转发
nginx 配置文件如下:
主要配置内容:
upstream helloworld{
server 127.0.0.1:8080 weight=1;
server 127.0.0.1:8081 weight=2;
}
这里配置转发到 8080,8081 端口,并配置了权重
location / {
proxy_pass http://helloworld;
#root html;
#index index.html index.htm;
}
拦截本地的所有请求,默认端口为 80
2、启动 nginx
nginx -s reload
3、访问测试
我们先删除 redis 里面刚刚测试保存的信息
然后我们访问:
http://localhost/set
这里我们可以看出,由 8080 端口的服务器完成了 set 请求,多次访问,nginx 将会根据什么配置的权重参数分配服务器来完成操作
下面我们访问:
http://localhost/get
可以看出,由 8081 端口的服务器完成了 get 请求,并成功取到了存在 session 中的数据,实现了 session 共享
六、总结
1、以前我们在 SSM 架构的项目中实现 session 共享,需要配置三个地方 ,一个是 web.xml 配置代理过滤器,然后在 Spring 容器中配置 Redis,最后再配置 Spring Session,相比 SpringBoot,稍有复杂
2、我们在 SpringBoot 中实现 session 共享还是非常简单的,只需要引入依赖,简单配置即可实现
3、实现 session 共享,帮助我们将项目分布式部署,提升服务性能有很大的意义
来源:https://blog.csdn.net/qq_40065776/article/details/106676823
猜你喜欢
- 分页问题是一个非常普遍的问题,开发者几乎都会遇到,这里不讨论具体如何分页,说明一下Web方式下分页的原理。首先是查询获得一个结果集(表现为查
- 本文实例讲述了Spring实战之属性覆盖占位符配置器用法。分享给大家供大家参考,具体如下:一 配置文件<?xml version=&q
- ##创建测试类 新建Java工程创建测试类如下代码:(创建文件验证定时器是否执行)package makeFile;import java.
- 通过zookeeper实现分布式锁1、创建zookeeper的client首先通过CuratorFrameworkFactory创建一个连接
- Filter简介Filter也称之为过滤器,它是Servlet技术中最实用的技术,WEB开发人员通过Filter技术,对web服务器管理的所
- Java在1.5开始引入了注解,目前流行的框架都在用注解,可想而知注解的强大之处。以下通过自定义注解来深入了解java注解。一、创建自定义注
- java 配置MyEclipse Maven环境虽然我的大部分项目已经迁到Idea上去了,但是在写部分小的测试程序的时候还是习惯
- @RequestBody的作用@RequestBody主要用来接收前端传递给后端的json字符串中的数据的(请求体中的数据的),所以只能发送
- 1 pom.xml文件注:热部署功能spring-boot-1.3开始有的<!--添加依赖--><dependency&g
- webservice的POST和GET请求调用POST请求1.发送请求import java.io.DataOutputStream;imp
- 做快递面单打印模板,快递要求纸张大小100 x 150mm。PageSize.A4=595 x 842A4尺寸=210mm×297mm故设置
- 1 环境部署1.1 jdk-8u111-windows-x64环境变量 JAVA_HOME:C:\Program Files\Java\jd
- 前言先简单介绍下我们的使用场景,线上5台Broker节点的kafka承接了所有binlog订阅的数据,用于Flink组件接收数据做数据中台的
- Java注解是在JDK5时引入的新特性,鉴于目前大部分框架(如spring)都使用了注解简化代码并提高编码的效率,因此掌握并深入理解注解对于
- java多态性多态分两种:(1) 编译时多态(设计时多态):方法重载。(2) 运行时多态:J
- Spring中有很多继承于aware中的接口,这些接口到底是做什么用到的。aware,翻译过来是知道的,已感知的,意识到的,所以这些接口从字
- Java Tess4J实现图像识别最近需要用Java做一个图像识别的东西,查了一些资料,在此写一个基于Tess4J的教程,方便其他人参考和使
- 去年就已经学了这个技术了,一直没去写,现在抽个时间写了个俄罗斯方块游戏。只有简单的新游戏,暂停,继续,积分功能。简单的实现了俄罗斯的经典功能
- 概述ConcurrentHashMap(CHM)是日常开发中使用频率非常高的一种数据结构,想对于普通的HashMap,CHM提供了线程安全的
- 已知字符串“aabbbcddddeeffffghijklmnopqrst”编程找出出现最多的字符和次数,要求时间复杂度小于O(n^2)/**