Springboot:Session共享

1、概述

传统单机web应用中,一般使用tomcat/jetty等web容器时,用户的session都是由容器管理。浏览器使用cookie中记录sessionId,容器根据sessionId判断用户是否存在会话session。这里的限制是,session存储在web容器中,被单台服务器容器管理。

2、Session复制

原生tomcat/jetty等web-server容器已支持,只需要修改配置即可。
缺点:session同步会占用大量的带宽,每台服务器要保留其他服务器数据。会受服务器内存限制影响。在集群环境,该方案不可取。
Springboot:Session共享_第1张图片

3、浏览器存储

将大量的session信息存储在浏览器cookie上,减少服务器内存。
缺点:每次http请求浪费网络带宽,而且如果有关键信息存储在cookie上,也会造成泄漏,引发安全性问题。cookie是有长度限制,所以不适合存储大量的session。
Springboot:Session共享_第2张图片

4、Nginx Hash一致性

通过Nginx中的ip_hash技术能够将某个ip 的请求定向到同一台后端web机器中,这样一来这个ip 下的客户端和某个后端 web机器就能建立起稳固的session,实现hash负载均衡。
缺点:session还是存储在web-server中,重启会造成session丢失。
session水平扩展时,rehash也会造成session丢失。
Springboot:Session共享_第3张图片

5、SpringSession

官网地址:https://spring.io/projects/spring-session
随着网站主键演变,分布式应用和集群是趋势(提高性能)。SpringSession孕育而生。简单描述原理:
当Web服务器接收到http请求后,当请求进入对应的Filter进行过滤,将原本需要由web服务器创建会话的过程转交给Spring-Session进行创建,本来创建的会话保存在Web服务器内存中,通过Spring-Session创建的会话信息可以保存第三方的服务中,如:redis,mysql等。Web服务器之间通过连接第三方服务来共享数据,实现Session共享!
Springboot:Session共享_第4张图片
以Redis session缓存为例,引入pom.xml


    org.springframework.session
    spring-session-data-redis

Springboot:Session共享_第5张图片
在application.properties指定Redis为session缓存容器。

spring.session.store-type=redis
server.servlet.session.timeout=30m

添加启动器session注解@EnableRedisHttpSession

@EnableRedisHttpSession
@MapperScan("com.lm.shop.product.dao")
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients(basePackages = "com.lm.shop.product.feign")
public class ShopProductApplication {
    public static void main(String[] args) {
        SpringApplication.run(ShopProductApplication.class, args);
    }
}
A.多域名,子域名session共享问题
@Configuration
public class MySessionConfig {
   
   @Bean
   public CookieSerializer cookieSerializer(){
       DefaultCookieSerializer defaultCookieSerializer = new DefaultCookieSerializer();
       defaultCookieSerializer.setCookieName("LSKSESSION");
       defaultCookieSerializer.setDomainName("lsk-ww.cn");
       return  defaultCookieSerializer;
   }
}
B.Redis session 存储Json格式转储

在MySessionConfig中添加转储Serializer

@Bean
public RedisSerializer redisSerializer(){
    return new GenericFastJsonRedisSerializer();
}
 
  

备注:以上图集都是网络上提取。

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