Spring笔记(12) Spring boot 整合 Redis,实现 Session 共享

Session共享

前面学习如何使用 Spring boot 整合 Redis ,在实际开发中 Redis 有一个非常重要的应用就是使用它来完成 Session 共享。

其实就是将 Session 保存在 redis 中,后面会提到

单体应用中 Session 由 Servlet 创建并保存在服务器内存中,但将程序做分布式负载均衡时,就要考虑 Session共享问题了。

因为在集群项目架构中,同一个客户端的不同请求有可能被分配到不同的服务终端。后面会有模拟举例。

Spring boot 通过 Redis 为 Session 共享提供了解决方案,特别好用。

我来通过简单代码展示,整个过程。

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>

存取 Session

创建如下一个 Controller ,然后写上两个方法,分别用来存、取 Session 。等会我会将一个程序运行在两个端口上,用来模拟负载。下面方法中使用当前程序的运行端口用来区分,获取 session 时显示当前程序的运行端口。

@RestController
public class SessionController {

    @Value("${server.port}")
    private int port;

    @PostMapping("/set/{name}")
    public String set(@PathVariable("name") String name, HttpSession session){
        session.setAttribute("name",this.port+":"+name);
        return (String) session.getAttribute("name");
    }

    @GetMapping("/gets")
    public String get(HttpSession session){
        return "port : "+port+" show "+(String) session.getAttribute("name");
    }

}

创建 application.yml 配置文件

spring:
  redis:
    database: 0
    host: localhost
    port: 6379
server:
  port: 8080

先在本地启动 redis ,不然程序会启动失败。

安装 redis 看它?Mac安装搭建 Redis,配置参数意义

程序启动后,通过 postman 使用接口向 Session 存入数据。

http://localhost:8080/set/wangwu

这样就将 wangwu在 8080 程序存入。接着不要关闭程序,修改配置文件中的端口,改成 8081 ,再次运行程序。

然后同样用 postman 获取获取 session 。

http://localhost:8081/gets

发现没,我们能在 8081 程序中获取 8080 存入的 session 数据。

其实,Redis 本来也能跨服务器存取数据,只不过这里结合 session 使用,数据具备 session 特征,即“过期”。

Nginx 负载均衡

Nginx安装看它? macOS 上安装 Nginx,基本命令使用

接着,我来结合 Nginx 实现两个程序的负载均衡。

如下是 Nginx 的配置

    #Tomcat 集群
    upstream  myapp {   #Tomcat 集群名称 
        server    localhost:8080;   #tomcat1 配置
        server    localhost:8081;   #tomcat2 配置
    } 
    #Nginx 的配置
    server {
        listen       9090;   #监听端口,默认 80
        server_name  localhost;   #当前 Nginx 域名

        location / {
            proxy_pass http://myapp;
            proxy_redirect default;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

Nginx 监听 9090 端口,当接收到 9090端口请求时,转发到运行的两个程序。

启动 Nginx 后,在来测试获取 session 接口。

http://localhost:9090/gets

不断请求,你会发现获取 session 的端口在 8080 和 8081 两个服务之间改变。可是,不管是哪个程序服务,输出的值还是当初保存的。

所以,就算负载均衡情况下,也可以实现 Session 共享。


本文有一定内容 Gitchat。

以上代码笔记内容来自付费专栏:案例上手 Spring 全家桶

PS:如果侵犯版权,请联系我。

本文由老郭种树原创,转载请注明:https://guozh.net/spring-boot-redis-session/

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注