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/