nginx 解决session一致性

开发十年,就只剩下这套架构体系了! >>>   hot3.png

  1. session 粘滞性
  • 每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。 
  • upstream backserver {
    ip_hash;
    server 192.168.0.14:88;
    server 192.168.0.15:80;
    }
  • 但是有缺点,这存在单点风险,倘若我已经在192.168.0.14:88端口登录后,过段时间发现14服务器挂了(session时间未过期),那么这时候会访问到15服务器,那这时候需要重新登录,因为在拿14服务器上的JsessionId去15服务器请求发现不存在。

2、session 复制

  • 可以通过tomcat的server.xml文件进行配置,这样每个tomcat都会同步对应的session,那么此时即使某个tomcat被宕机了,也不影响服务。
  • 具体的tomcat可以参见如下 ,tomcat 官网对应的tomcat集群配置
  • 
    
              
    
              
                
                
    
                
                  
                
                
                
              
    
              
              
    
              
    
              
            

3、session 共享(springboot)

  •   对应的项目中pom文件添加
  •   
            org.springframework.boot  
            spring-boot-starter-redis  
      
      
            org.springframework.session  
            spring-session-data-redis  
      
  • 在对应的application.properties中配置redis信息
  • spring.redis.host=localhost  
    spring.redis.port=6379  
  • 添加开启spring session支持的注解@EnableRedisHttpSession
  • @Configuration  
    @EnableRedisHttpSession  
    public class RedisSessionConfig {  
    } 
  • 添加验证的接口
  • @Value("${server.port}")
        String port;
    
        @GetMapping("/session")
        public Object getSession(HttpServletRequest request){
            Map map = new HashMap();
            map.put("SessionId", request.getSession().getId());
            map.put("ServerPort", "服务端口号为 "+port);
            return map;
        }
    
  • 访问 http://localhost:8080/session
  • 我们看下redis缓存的数据
  • nginx 解决session一致性_第1张图片
  • 可以发现sessionId已经缓存在redis数据库中
  • 下面我们换个端口再访问一次看看
  • 这次我把端口换成了8888 访问:http://localhost:8888/session
  • 刷新了redis数据库,缓存的数据也没变
  • nginx 解决session一致性_第2张图片
  • 结果中的SessionId是一致的,却是由两个不同项目工程来提供服务。这样子,SpringSession 利用拦截器 Filter 帮我们在每个请求前进行了同步设置,达到了分布式系统中 session 共享。

4、session 共享(springmvc 版本)

首先在pom.xml文件中添加对应的jar

 
    org.springframework.session
    spring-session-data-redis
    1.2.1.RELEASE
  
  
     redis.clients
     jedis
      2.8.1
  

在对应springmvc-context.xml文件中配置


        
    

    
        
        
        
    

    
        
        
        
        
        
    

    
        
        
            
        
        
            
        
    

    
        
    

其次在web.xml中配置(非常重要,filter的名字必须是springSessionRepositoryFilter)

  
    springSessionRepositoryFilter
    org.springframework.web.filter.DelegatingFilterProxy
  
  
    springSessionRepositoryFilter
    /*
  

访问项目路径呈现结果

nginx 解决session一致性_第3张图片

nginx 解决session一致性_第4张图片

223916_bL9y_2663968.jpg

你可能感兴趣的:(nginx 解决session一致性)