当前位置:首页 > 技术文章 > 正文内容

SpringBoot如何用Session共享实现分布式部署?

arlanguage3个月前 (01-31)技术文章30

推荐学习

在单体项目中,我们将用户信息存在 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 共享,帮助我们将项目分布式部署,提升服务性能有很大的意义

作者: Asurplus、

原文链接:https://lizhou.blog.csdn.net/article/details/106676823

扫描二维码推送至手机访问。

版权声明:本文由AR编程网发布,如需转载请注明出处。

本文链接:http://www.arlanguage.com/post/1951.html

标签: nginx mvc
分享给朋友:

“SpringBoot如何用Session共享实现分布式部署?” 的相关文章

Docker安装Nginx教程使用实战教程

课件视频教程地址:Docker安装NginxDocker最新全部教程:Docker最新全系列教程Docker安装基本安装(不带数据卷)拉取Nginx镜像docker pull nginx:latest查看本地镜像列表(即可看到nginx)docker images运行容器docker run --n...

Nginx重写规则(2) nginx中地址重写有哪些选项

需求:研发提出了一些路由跳跃的要求。解决问题:在特殊情况下,如果业务和研发无法快速处理,则需要运维快速跳转来解决临时问题并避免出现较大的漏洞。Nginx重写规则案例一:临时将请求路径/colorv1/getcolorv1 的请求转发到 v2,且带着问号后面的参数 :location ~ ^/(.)/...

彻底搞懂 Nginx 的五大应用场景 彻底搞懂 nginx 的五大应用场景是什么

— 1 —HPPTNginx本身也是一个静态资源的服务器,当只有静态资源的时候,就可以使用Nginx来做服务器,如果一个网站只是静态页面的话,那么就可以通过这种方式来实现部署。1、首先在文档根目录Docroot(/usr/local/var/www)下创建html目录,然后在html中放一个test...

使用Keepalived实现Nginx的自动重启及双主热备高可用

推荐阅读:20年清华架构师耗时整整一百天打造1000+道Java高频面试手册1、概述之前我们使用Keepalived实现了Nginx服务的双机主备高可用,但是有几个问题没有解决,今天一起探讨一下。1)在双机主备机制中,Keepalived服务如果宕了,会自动启用备机进行服务,但Nginx服务如果负载...

Nginx 的日志 nginx的日志能否保存到日志审计里面?

Nginx 的日志主要有 2 个,一个是 access.log, 一个是 error.log。如果你不进行任何配置的话,这 2 个日志将会使用默认的日志配置,这个日志将会位于/var/log/nginx 目录中。针对虚拟主机的配置如果你使用了 Nginx 为虚拟主机的话。那么你可以在你的虚拟主机的配...

平稳运行半年的系统宕机了,记录一次排错调优的全过程

(一)前言最近发生了一件很让人头疼的事情,已经上线半年且平稳运行半年系统在年后早高峰的使用时发生了濒临宕机的情况。访问速度特别慢,后台查到大量time_wait的连接,从代码层面到架构层面到网络层面排查了几天几夜,总算是有了结果。(二)架构、问题描述先简单描述一下这个系统的架构,公网域名对应的公网I...