Springboot如何实现多服务器session共享

这篇文章主要介绍了Springboot如何实现多服务器session共享,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

我们提供的服务有:网站制作、成都网站建设、微信公众号开发、网站优化、网站认证、铜陵ssl等。为近千家企事业单位解决了网站和推广的问题。提供周到的售前咨询和贴心的售后服务,是有科学管理、有技术的铜陵网站制作公司

具体内容如下

环境:

springboot:2.0.4
redis:3.2.100
jdk:1.8
eclipse:4.9.0

1.原理

正常情况下,HTTPSession是通过servlet容器创建并管理的,创建成功后都保存在内存中,如果开发者需要对项目进行横向拓展搭建集群,那么可以用一些硬件和软件工具来做负载均衡,此时,来自同一用户的HTTP请求有可能会被发送到不同的实例上去,如何保证各个实例之间的Session同步就成为了一个必须解决的问题,Springboot提供了自动化session共享配置,它结合redis非常方便的解决了这个问题。使用Redis解决session共享的原理非常简单,就是把原本储存在不同服务器上的session拿出来放到一个独立的服务器上,可以参考下图来理解

Springboot如何实现多服务器session共享

当一个请求到达Nginx服务器上时,首先请求分发,假设请求被server2处理了,server2在处理请求时,无论存储还是读取session的操作,都是去操作session服务器而不是自身内存中的session,其他server也是如此,这样就实现了session共享!

2.如何实现

关于Nginx和Redis的配置,本文就不再详细介绍,网上教程也有很多。这里使用手动直接访问两个端口模拟nginx反向代理。

2.1首先创建一个springboot项目,全部的pom.xml配置如下:

除了Redis依赖之外,这里还需要提供spring-session-data-redis依赖,Spring Session可以做到透明的替换掉应用中的Session容器。


 4.0.0

 cn
 session-two
 0.0.1-SNAPSHOT
 jar

 session-two
 http://maven.apache.org

 
  UTF-8
 

 
 org.springframework.boot
 spring-boot-starter-parent
 2.0.4.RELEASE
  
 
 
 
  org.springframework.boot
  spring-boot-starter-data-redis
  
  
   io.lettuce
   lettuce-code
  
  
 
 
  redis.clients
  jedis
 
 
 
  org.springframework.boot
  spring-boot-starter-web
 
 
 
  org.springframework.session
  spring-session-data-redis
 
 
  junit
  junit
  4.12
  test
 
 
 
  
  
  org.springframework.boot
  spring-boot-maven-plugin
  
 
 

2.2 application.properties中进行redis配置

spring.redis.database=0
spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.password=
spring.redis.jedis.pool.max-active=8
spring.redis.jedis.pool.max-idle=8
spring.redis.jedis.pool.max-wait=-1ms
spring.redis.jedis.pool.min-idle=0

2.3 创建controller测试

import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {
 
 @Value("${server.port}")
 String port;
 @PostMapping("save")
 public String saveName(String name,HttpSession session ) {
 session.setAttribute("name", name);
 return port;
 }
 
 @GetMapping("get")
 public String saveName(HttpSession session ) {
 return port+":"+session.getAttribute("name").toString();
 }
}

这里提供了两个接口,一个是save用来向session中保存数据,一个是get用来从session中获取数据,这里注入了项目端口server.prot主要是用来显示是那个服务器提供的服务(Nginx下方便查看),虽然我们在这里操作的是Httpsession,但是其实Httpsession容器已经被透明的替换掉了,真正的session此时存储在redis服务器上。

3.进行测试

3.1将项目打成jar包,然后打开两个命令提示框,分别执行如下两个命令启动项目

java -jar session-two-0.0.1-SNAPSHOT.jar --server.port=81
java -jar session-two-0.0.1-SNAPSHOT.jar --server.port=82

3.2使用Postman测试

3.2.1 访问81服务器并且设置name为张三

Springboot如何实现多服务器session共享

3.2.2 访问82服务器获取session中保存的name

Springboot如何实现多服务器session共享

springboot是什么

springboot一种全新的编程规范,其设计目的是用来简化新Spring应用的初始搭建以及开发过程,SpringBoot也是一个服务于框架的框架,服务范围是简化配置文件。

感谢你能够认真阅读完这篇文章,希望小编分享的“Springboot如何实现多服务器session共享”这篇文章对大家有帮助,同时也希望大家多多支持创新互联,关注创新互联行业资讯频道,更多相关知识等着你来学习!


当前标题:Springboot如何实现多服务器session共享
分享地址:http://myzitong.com/article/pjhpig.html