nginx 解決session一致性

  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服務器請求發現不存在。

二、session 複製html

  • 能夠經過tomcat的server.xml文件進行配置,這樣每一個tomcat都會同步對應的session,那麼此時即便某個tomcat被宕機了,也不影響服務。
  • 具體的tomcat能夠參見以下 ,tomcat 官網對應的tomcat集羣配置
  • <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
                     channelSendOptions="8">
    
              <Manager className="org.apache.catalina.ha.session.DeltaManager"
                       expireSessionsOnShutdown="false"
                       notifyListenersOnReplication="true"/>
    
              <Channel className="org.apache.catalina.tribes.group.GroupChannel">
                <Membership className="org.apache.catalina.tribes.membership.McastService"
                            address="228.0.0.4"
                            port="45564"
                            frequency="500"
                            dropTime="3000"/>
                <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                          address="auto"
                          port="4000"
                          autoBind="100"
                          selectorTimeout="5000"
                          maxThreads="6"/>
    
                <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
                  <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
                </Sender>
                <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
                <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatchInterceptor"/>
              </Channel>
    
              <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
                     filter=""/>
              <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
    
              <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
                        tempDir="/tmp/war-temp/"
                        deployDir="/tmp/war-deploy/"
                        watchDir="/tmp/war-listen/"
                        watchEnabled="false"/>
    
              <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
            </Cluster>

三、session 共享(springboot)java

  •   對應的項目中pom文件添加
  • <dependency>  
            <groupId>org.springframework.boot</groupId>  
            <artifactId>spring-boot-starter-redis</artifactId>  
    </dependency>  
    <dependency>  
            <groupId>org.springframework.session</groupId>  
            <artifactId>spring-session-data-redis</artifactId>  
    </dependency>
  • 在對應的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<String, Object> map = new HashMap<String, Object>();
            map.put("SessionId", request.getSession().getId());
            map.put("ServerPort", "服務端口號爲 "+port);
            return map;
        }
  • 訪問 http://localhost:8080/session
  • 咱們看下redis緩存的數據
  • 能夠發現sessionId已經緩存在redis數據庫中
  • 下面咱們換個端口再訪問一次看看
  • 此次我把端口換成了8888 訪問:http://localhost:8888/session
  • 刷新了redis數據庫,緩存的數據也沒變
  • 結果中的SessionId是一致的,倒是由兩個不一樣項目工程來提供服務。這樣子,SpringSession 利用攔截器 Filter 幫咱們在每一個請求前進行了同步設置,達到了分佈式系統中 session 共享。

四、session 共享(springmvc 版本)nginx

首先在pom.xml文件中添加對應的jarweb

<dependency>
    <groupId>org.springframework.session</groupId>
    <artifactId>spring-session-data-redis</artifactId>
    <version>1.2.1.RELEASE</version>
  </dependency>
  <dependency>
     <groupId>redis.clients</groupId>
     <artifactId>jedis</artifactId>
      <version>2.8.1</version>
  </dependency>

在對應springmvc-context.xml文件中配置redis

<bean id="redisHttpSessionConfiguration"
          class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration">
        <property name="maxInactiveIntervalInSeconds" value="600"/>
    </bean>

    <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
        <property name="maxTotal" value="100" />
        <property name="maxIdle" value="10" />
        <property name="testOnBorrow" value="true" />
    </bean>

    <bean id="connectionFactory"  class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" >
        <property name="poolConfig" ref="jedisPoolConfig" />
        <property name="port" value="6379" />
        <property name="hostName" value="192.168.1.11" />
        <property name="password" value="xxx" />
        <property name="timeout" value="30000" ></property>
    </bean >

    <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate" >
        <property name="connectionFactory" ref="connectionFactory" />
        <property name="keySerializer">
            <bean  class="org.springframework.data.redis.serializer.StringRedisSerializer" />
        </property>
        <property name="valueSerializer">
            <bean class="org.springframework.data.redis.serializer.StringRedisSerializer" />
        </property>
    </bean >

    <bean id="redisUtil" class="com.isea533.mybatis.service.RedisUtil" >
        <property name="redisTemplate" ref="redisTemplate" />
    </bean >

其次在web.xml中配置(很是重要,filter的名字必須是springSessionRepositoryFilter)spring

<filter>
    <filter-name>springSessionRepositoryFilter</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>springSessionRepositoryFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

訪問項目路徑呈現結果數據庫

相關文章
相關標籤/搜索