分布式系统Session共享(一)SpringBoot+Redis实现方式

一、Session共享介绍

1.什么是Session

对Tomcat而言,Session是一块在服务器开辟的内存空间,其存储结构为ConcurrentHashMap;

2.什么是Session共享

部署多台服务, 确保每个服务都能共享到同一份Session数据.就是Session共享

3.为什么要实现Session共享

在单机环境中,Session的创建和存储都是由同一个应用服务器实例来完成,而存储也仅是内存中,最多会在正常的停止服务器的时候,把当前活动的Session钝化到本地,再次启动时重新加载。
而分布式系统中多个应用之间,Session数据是完全隔离的。而为了实现Session的高可用,多实例间数据共享是必然的,所以我们需要用到Session共享。

二、Session共享的简单实现

要在SpringBoot中实现Redis共享只需要下面前三步即可

1 配置pom.xml文件

       <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>

2 配置Redis数据源

spring.redis.host=123.207.231.159
spring.redis.port=6379
spring.redis.password=root
spring.redis.database=1

3 启动类添加注解

消费者和提供者在启动类分别添加注解@EnableRedisHttpSession这里maxInactiveIntervalInSeconds是设置的超时时间单位秒,默认30分钟

@SpringBootApplication
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 10*60)
public class ConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class, args);
    }
}

4 测试

1)提供者控制器

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;

@RestController
public class ShareSession {


    @RequestMapping("/session/set")
    public String setSession(HttpServletRequest servletRequest){
        servletRequest.getSession().setAttribute("zzx","qq");
        return "success";
    }
}

2)消费者控制器

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;

@RestController
public class ShareSession {


    @RequestMapping("/session/get")
    public String setSession(HttpServletRequest servletRequest){
        return String.valueOf(servletRequest.getSession().getAttribute("zzx"));
    }
}

3)浏览器分别访问提供者和消费者接口

在这里插入图片描述
在这里插入图片描述
这里,提供者应用的端口是8762,消费者应用的端口是8763。这样我们就简单的实现了基于Redis的Session共享。

发布了55 篇原创文章 · 获赞 23 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Z_Vivian/article/details/102488495
今日推荐