分布式集群環境下,如何實現session共享五(spring-session+redis 實現session共享)


  這是分布式集群環境下,如何實現session共享系列的第五篇。在上一篇:分布式集群環境下,如何實現session共享四(部署項目測試)中,針對nginx不同的負載均衡策略:輪詢、ip_hash方式,測試了session的不同使用情況,並且留下了一個問題:有沒有可能針對nginx負載均衡策略(輪詢)的基礎上,對session實現共享呢???

  本篇在nginx負載均衡策略(輪詢的基礎上),通過spring-session將session存儲到redis,實現session共享。

 

1.改造項目

  1.1.導入依賴

 <!--spring 版本-->
    <spring.version>5.0.2.RELEASE</spring.version>
    <spring.session.data.redis.version>1.3.1.RELEASE</spring.session.data.redis.version>
    <lettuce.version>3.5.0.Final</lettuce.version>


<!-- spring web包 -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
      <version>${spring.version}</version>
    </dependency>

    <dependency>
      <groupId>org.springframework.session</groupId>
      <artifactId>spring-session-data-redis</artifactId>
      <version>${spring.session.data.redis.version}</version>
    </dependency>
    <dependency>
      <groupId>biz.paluch.redis</groupId>
      <artifactId>lettuce</artifactId>
      <version>${lettuce.version}</version>
    </dependency>

 

  1.2.編寫redis配置文件

redis.host=192.168.80.22
redis.pass=myredis
redis.port=6379
redis.session.timeout=600

 

  1.3.編寫spring配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd">

    <context:annotation-config />

    <!-- 加載properties文件 -->
    <bean id="configProperties"
          class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <list>
                <value>classpath:session-redis.properties</value>
            </list>
        </property>
    </bean>

    <!-- RedisHttpSessionConfiguration -->
    <bean class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration">
        <!-- session過期時間,單位是秒 -->
        <property name="maxInactiveIntervalInSeconds" value="${redis.session.timeout}" />
    </bean>

    <!--LettuceConnectionFactory -->
    <bean class="org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory"
            p:host-name="${redis.host}" p:port="${redis.port}" />

</beans>

 

  1.4.配置web.xml

<!--加載spring配置文件-->
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath*:applicationContext-session.xml</param-value>
  </context-param>

  <!--配置監聽器-->
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>

  <!--配置過濾器(該過濾器要配置在第一的位置)-->
  <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>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>ERROR</dispatcher>
  </filter-mapping>

 

  1.5.啟動redis

#啟動redis服務端
[root@hadoop02 bin]# ./redis-server 

#客戶端連接操作
[root@hadoop02 bin]# ./redis-cli
#設置允許遠程訪問
127.0.0.1:6379> CONFIG SET protected-mode no
OK

 

 

2.nginx配置

#添加tomcat列表,真實應用服務器都放在這
upstream tomcat_pool{
        #server tomcat地址:端口號 weight表示權值,權值越大,被分配的幾率越大;
        server 192.168.80.22:8080 weight=4 max_fails=2 fail_timeout=30s;
        server 192.168.80.22:8081 weight=4 max_fails=2 fail_timeout=30s;

}

 

3.測試

http://192.168.80.22/session-redis-demo/

  3.1.谷歌瀏覽器測試

 

  3.2.火狐瀏覽器測試

 

  3.3.查看redis中存儲的session

 

[root@hadoop02 bin]# ./redis-cli
127.0.0.1:6379> keys *
1) "spring:session:expirations:1558614360000"
2) "spring:session:sessions:af12f7a7-3385-44dc-93b2-a3fa82026b25"
3) "spring:session:sessions:abc97363-8f1d-4d1c-a9df-e2a78628af05"
4) "site"
5) "spring:session:sessions:expires:abc97363-8f1d-4d1c-a9df-e2a78628af05"
127.0.0.1:6379>

 

總結:通過spring-session把session存儲到redis中,即便nginx負載均衡策略為輪詢方式,也一樣實現了session的共享,這才是我們的終極目標,真好!!!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM