背景
实现session共享的方案如下图所示,当tomcat想要往session写数据时都往redis中去写,相应的如果想要读取session中的数据时也都从redis中读取,这样就可以实现不同的服务器共享session中的数据了。
工程创建
- 引入依赖web、session、redis、如果spring boot版本在2.0.15以上还需要引入security。
对应的依赖为:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
- application.properties中加入redis相关配置
spring.redis.database=0
spring.redis.host=127.0.0.1
# 在redis5.0以上版本远程连接必须要设置密码
spring.redis.password=123456
spring.redis.port=6379
- 编写一个测试类
@RestController
public class HelloController {
@Value("${server.port}")
Integer port;
@GetMapping("/set")
public Integer set(HttpSession session) {
session.setAttribute("name","zl");
return port;
}
@GetMapping("/get")
public String get(HttpSession session) {
return ((String)session.getAttribute("name"))+" "+port;
}
}
- 使用maven打包成一个jar包
准备环境
- redis已安装并可以正常启动
- nginx已安装并可以正常启动
- jdk环境
- jar包上传到服务器
启动服务
[root@bogon server-web]# nohup java -jar sessionshare-0.0.1-SNAPSHOT.jar --server.port=8080 > 8080.log &
[1] 4249
nohup: ignoring input and redirecting stderr to stdout
[root@bogon server-web]# nohup java -jar sessionshare-0.0.1-SNAPSHOT.jar --server.port=9090 > 9090.log &
[2] 4276
nohup: ignoring input and redirecting stderr to stdout
[root@bogon server-web]# ps -ef|grep java
root 4249 3688 29 07:50 pts/1 00:00:12 java -jar sessionshare-0.0.1-SNAPSHOT.jar --server.port=8080
root 4276 3688 96 07:51 pts/1 00:00:06 java -jar sessionshare-0.0.1-SNAPSHOT.jar --server.port=9090
root 4295 3688 0 07:51 pts/1 00:00:00 grep --color=auto java
- nohup 表示当终端关闭时,服务不要停止运行
- & 表示让 服务在后台启动
查看服务是否正常
注意:启动服务后,要保证服务器8080和9090端口是开放的包括后面nginx使用的80端口。具体开放端口的方法可以参考:https://blog.csdn.net/weixin_43398820/article/details/102692584
nginx配置
nginx.conf添加配置
#gzip on;
#upstream 表示配置上游服务器集群
upstream example.session.com{
#配置每个单独服务,weight表示权重,下面每个权重1/2
server 127.0.0.1:8080 weight=1;
server 127.0.0.1:9090 weight=1;
}
server {
listen 80;
server_name localhost;
location / {
#proxy_pass 表示请求转发的地址
proxy_pass http://example.session.com;
proxy_redirect default;
}
}
测试
通过测试可发现,多次访问set或者get接口都会轮流的去访问不同端口的两个服务