SpringBoot__使用 Spring Session实现Session共享
什么是Session共享?
在传单体架构中,只有一台服务端,所以它的session无需共享;但是在分布式/集群的项目中,客户端发送请求,代理服务器转发请求到上游服务器A上,上游服务器A保存了session,
而这时上游服务器B需要用到这个session,而这个session在上游A里保存的,所以这时就会需要Session共享这样的需求。
解决方案:
在途中,我们添加了一个缓存服务器,把各个上游服务器之间需要共享的信息保存到这个缓存服务器中去,需要的时候就去缓存服务器中取。
这里的客户端可以理解为类似浏览器等可以发送Http请求的终端,而代理服务器可以理解为类似Nginx等代理服务器,上游服务器也可以叫做real服务器,可以理解为我们常用的Tomcat、Jboss等服务器,缓存服务器常有的有Redis。
那我们使用SpringBoot使用 Spring Session实现Session共享小demo
依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</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>
</dependencies>
在配置文件中配置redis的一些设置
spring.redis.host=192.168.66.128
spring.redis.port=6379
spring.redis.password=123
spring.redis.database=0
Controller
/**
* @author ZSL
* @ClassName RedisController
* @description
* @date 2019/8/12
*/
@RestController
public class RedisController {
@Autowired
RedisService redisService;
@Value("${server.port}")
Integer port;
@GetMapping("/h")
public void helle(){
redisService.hello();
}
@GetMapping("/h2")
public void helle2(){
redisService.hello2();
}
@GetMapping("/ss")
public String setSession(HttpSession session){
session.setAttribute("zsl","zsltest");
return String.valueOf(port);
}
@GetMapping("/gs")
public String getSession(HttpSession session){
session.getAttribute("zsl");
return String.valueOf(port);
}
}
这里使用是HttpSession,而且其他的 Session 同步到 Redis 等操作,框架已经自动做了,很方便。
这里我们将项目打包,使用两个不同端口号的Tomcat来运行测试。
你可以通过Nginx的方式在集群中进行测试。