SpringBoot实现分布式session

实现分布式session

为什么要实现分布式session

session 我们都知道它是保存在服务器的,当我们的项目做了负载均衡,如果在session中存了数据(用户登录的信息等等数据),那么就有可能有有些项目取不到session中的数据,导致需要重新登录。

实现分布式session的方法

方法一:使用粘性session解决session不同步问题

什么是粘性session?

当我们登录的时候Nginx负载均衡会将这个ip地址分配到一个服务器上,我们可以把这个session单纯的放在被分配到的这个服务器上。所谓粘性session可以将Nginx配置一下,让这个ip再次访问的时候依旧被分配到这个服务器上,每次访问都是访问的是同一个服务器,这样就实现粘性session的方法。

nginx配置方法
upstream tomcatServer{ 
		#同一个ip访问同一个服务器
		ip_hash;
		server 127.0.0.1:8080;
		server 127.0.0.1:8082;
	}
	server {
        listen       80;
        server_name  localhost;
 
        location / {
			proxy_pass  http://tomcatServer/;
        }
 
       
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

最重要的就是 ip_hash 这个配置,这是nginx自带的,可以实现同一个ip分配到同一个代理服务器

缺点

容易造成单点故障

(被分配的这台服务器宕机了,以至于每次访问都是访问的这个宕机的服务器!所以容易造成单点故障的问题)

方法二:使用SpringSession解决分布式session问题

spring全家桶中提供了分布式session共享集成方案,它其实就是把你本来需要手动存储redis的操作给做了,让开发者不需要自己手动去存储session。

配置maven
<dependencies>
    <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-data-redisartifactId>
        dependency>
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-webartifactId>
        dependency>
        <dependency>
            <groupId>org.springframework.sessiongroupId>
            <artifactId>spring-session-data-redisartifactId>
        dependency>
dependencies>
配置application,yml
spring:
  session:
    store-type: redis
    timeout: 3600s
    redis:
      flush-mode: on_save
      namespace: spring:session
  redis:
    host: 127.0.0.1
    port: 6379
    timeout: 5000ms
主类首先开启EnableRedisHttpSession注解
//主类首先开启EnableRedisHttpSession注解
@SpringBootApplication
@EnableRedisHttpSession
public class DistributeSessionApplication {

    public static void main(String[] args) {
        SpringApplication.run(DistributeSessionApplication.class, args);
    }
}

本质上利用Tomcat的Filter的实现类SpringSessionRepositoryFilter实现了对每一次请求的拦截,拦截之后把Session放到Redis里面

方法三:tomcat+redis方案

就是使用Tomcat RedisSessionManager,让所有我们部署的tomcat都将session数据存储到redis。

tomcat中server.xml配置
<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />

<Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
         host="{redis.host}"
         port="{redis.port}"
         database="{redis.dbnum}"
         maxInactiveInterval="60"/>

可以用基于redis哨兵支持的redis高可用集群来保存session数据

<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />
<Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
	 sentinelMaster="mymaster"
	 sentinels=":26379,:26379,:26379"
	 maxInactiveInterval="60"/>

你可能感兴趣的:(spring,boot,spring,session,分布式)