我在分佈式session上的一些實踐

這篇文章大致講解了用Nginx+Tomcat+Spring+Redis實現分佈式session。

Spring項目地址:https://github.com/hshenCode/spring_redis_exercise


1. 系統拓撲


  • 1臺Redis服務器,用來存儲session。
  • 2臺Tomcat服務器,訪問Redis進行session存儲。
  • 1臺Nginx服務器,作爲反向代理以及負載均衡器,把請求轉發到Tomcat服務器上
  • 用戶直接訪問Nginx服務器


2. Nginx作爲反向代理


由於Nginx的多進程模式以及事件驅動, 它作爲一個web服務器的性能是相當好的。 至於怎麼用它來做反向代理,只需要很簡單的配置nginx.conf文件的以下部分並且重啓Nginx即可:
    upstream web_app{
        server      ip1:port;
        server      ip2:port;
    }

    server {
        listen       80;
        server_name  localhost;

     
        location / {
            proxy_pass      http://web_app;
            proxy_set_header        X-Real-IP       $remote_addr;
        }
    }

這裏的ip1, ip2以及port就是你的兩臺tomcat的地址。


3.使用Redis存儲Session


Tomcat默認會把session存儲在內存中,一方面限制了最大session數量,另一方面又阻礙了做分佈式拓展。 一個解決方案就是用Redis或者別的數據庫來持久化session。
在SpringMVC中的實現就很簡單了,只要在spring配置文件中配置以下的bean即可:

    <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
        <property name="maxTotal" value="${redis.maxTotal}"/>
        <property name="maxIdle" value="${redis.maxIdle}"/>
        <property name="maxWaitMillis" value="${redis.maxWaitMillis}"/>
        <property name="testOnBorrow" value="${redis.testOnBorrow}"/>
    </bean>

    <bean id="jedisConnectionFactory"
          class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
        <property name="hostName" value="${redis.host}"/>
        <property name="port" value="${redis.port}"/>
        <property name="timeout" value="${redis.timeout}"/>
        <property name="poolConfig" ref="jedisPoolConfig"/>
    </bean>

    <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
        <property name="connectionFactory" ref="jedisConnectionFactory"/>
    </bean>
    <bean id="redisHttpSessionConfiguration"
          class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration">
        <property name="maxInactiveIntervalInSeconds" value="1800"/>
    </bean>

這個配置是什麼意思呢?

首先前3個bean配置了對redis的連接和訪問,我們可以在代碼中直接用redisTemplate去操作Redis。
最後一個bean的作用是配置web 容器(在這裏是tomcat)對Session的管理方法。

至於Tomcat是如何管理Session的,可以參考這篇文章: http://www.cnblogs.com/interdrp/p/4935614.html




發佈了123 篇原創文章 · 獲贊 334 · 訪問量 52萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章