前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SpringBoot中使用Session共享实现分布式部署

SpringBoot中使用Session共享实现分布式部署

作者头像
崔笑颜
发布2020-06-15 10:55:12
4070
发布2020-06-15 10:55:12
举报
文章被收录于专栏:小小码农一个。

前言:我们知道,在单体项目中,我们将用户信息存在 session 中,那么在该 session 过期之前,我们都可以从 session 中获取到用户信息,通过登录拦截,进行操作 但是分布式部署的时候,我们请求的服务器可能不是同一台服务器,那么我们就必须要面对 session 共享的问题,下面介绍的是在 SpringBoot 实现 session 共享的方式

创建项目

创建 SpringBoot 项目,选择 Maven 依赖

最终 pom.xml 文件如下:

代码语言:javascript
复制
<!-- 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 的信息

代码语言:javascript
复制
server:
  port: 8080

spring:
  redis:
    host: 127.0.0.1
    port: 6379
    database: 0
    password:

我们配置了该项目的端口,以及 redis 的连接信息

写接口

代码语言:javascript
复制
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;
    }
}

打包测试

启动项目,分别启动在两个端口:

代码语言:javascript
复制
java -jar .\session-0.0.1-SNAPSHOT.jar --server.port=8080
java -jar .\session-0.0.1-SNAPSHOT.jar --server.port=8081

我们在 8081 端口的项目中从 session 中取出了内容:hello world~~~

由此证明,我们的 session 共享已经成功。

分布式部署

下面我们借助 nginx 代理转发访问这两个项目

配置转发

nginx 配置文件如下:

主要配置内容:

代码语言:javascript
复制
upstream helloworld{
	server 127.0.0.1:8080 weight=1;
	server 127.0.0.1:8081 weight=2;
}

这里配置转发到 8080,8081 端口,并配置了权重

代码语言:javascript
复制
location / {
	proxy_pass http://helloworld;
    #root   html;
    #index  index.html index.htm;
}

拦截本地的所有请求,默认端口为 80

访问测试

我们先删除 redis 里面刚刚测试保存的信息

然后我们访问: http://localhost/set 这里我们可以看出,由 8080 端口的服务器完成了 set 请求,多次访问,nginx 将会根据什么配置的权重参数分配服务器来完成操作

下面我们访问: 可以看出,由 8081 端口的服务器完成了 get 请求,并成功取到了存在 session 中的数据,实现了 session 共享

总结

1、以前我们在 SSM 架构的项目中实现 session 共享,需要配置三个地方 ,一个是 web.xml 配置代理过滤器,然后在 Spring 容器中配置 Redis,最后再配置 Spring Session,相比 SpringBoot,稍有复杂 2、我们在 SpringBoot 中实现 session 共享还是非常简单的,只需要引入依赖,简单配置即可实现 3、实现 session 共享,帮助我们将项目分布式部署,提升服务性能有很大的意义

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-06-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 创建项目
  • 配置 Redis
  • 写接口
  • 打包测试
  • 分布式部署
    • 配置转发
      • 访问测试
      • 总结
      相关产品与服务
      云数据库 Redis®
      腾讯云数据库 Redis®(TencentDB for Redis®)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档