(轉)tomcat+nginx+redis實現均衡負載、session共享(二)

 

1.redis簡介及下載安裝java

做爲此次的主角,相信你們對redis應該都必定印象,redis是一款開源的高性能key-value數據庫,擁有豐富的鍵值儲存類型,並提供多種語言的API。nginx

與通常數據庫不一樣,redis是使用內存做爲主存,而使用硬盤來實現數據持久化,並且redis是週期性的將數據寫到硬盤上。這就意味着一旦咱們服務器出現斷電、重啓之類的狀況,咱們極可能會出現數據丟失的狀況,因此不建議使用redis來存放關鍵的數據。固然,也正由於redis讀寫數據都使用內存,因此它的速度是很是快的,很適合咱們來存放一些臨時性的數據。git

此外,redis能實現的做用不少,諸如隊列、緩存之類的,但我也還沒使用過,沒法在這裏爲你們說明,但不影響咱們今天的session共享功能。github

 

首先咱們先下載redis,這是windows版本的下載地址  https://github.com/ServiceStack/redis-windowsweb

能夠點擊右邊下載所有文件,但感受不必,並且下載速度偏慢,建議進入downloads裏面下載咱們所需的redis包便可。ajax

 

 

redis在windows下是免安裝的,下載完成後,解壓,將文件夾複製到本身某個盤中就行了。解壓後是這個樣子的。redis

一開始redis是默認不須要密碼,若是想要設置密碼,能夠進入redis.windows.conf文件下找到requirepass,刪除前面的#號,在其後面即可以設置密碼,我這裏設成了123456。spring

下面咱們打開redis。首先打開cmd,進入咱們redis目錄下,輸入redis-server.exe redis.windows.conf。出現下面界面,則打開成功。(不可偷懶想雙擊redis-server.exe完事,這樣雖然也能打開,但不會加載配置文件)。數據庫

 

另外和別的數據庫同樣,咱們須要安裝一個輔助的可視化工具Redis Desktop Manager,這是下載地址:http://redisdesktop.com/download
json

咱們下載windows版本,安裝完成後,尚未任何鏈接對象,那就讓咱們給它添加一個。點擊下方的connect to redis server,出現個彈出框。而後Name咱們能夠隨便輸,Host添咱們redis服務器的ip地址,本地能夠直接填寫localhost,端口默認爲6379,Auth就是密碼,不是必填項,若是沒設置密碼可不填,點擊OK,創建完成。

至此,咱們的準備工做都已經完成,下面開始咱們的spring與redis的整合之旅。

 

2.Spring與Redis的整合之旅

這是上篇文章結束時個人項目目錄。

其實Spring自己就有提供對redis的支持,就是spring-session,咱們只需將這個在pom.xml添加以下代碼,maven便會本身下載所需的jar包及依賴包。

 

複製代碼
1 <dependency> 2 <groupId>org.springframework.session</groupId> 3 <artifactId>spring-session-data-redis</artifactId> 4 <version>1.1.1.RELEASE</version> 5 <type>pom</type> 6 </dependency>
複製代碼

隨後咱們在resources文件夾中新建一個redis.properties,往裏面添加以下內容。

 

 

再新建一個spring-redis.xml,往裏面添加咱們redis相關的配置。其中maxInactiveIntervalInSeconds是設置session有效時間,以秒爲單位,但實際上不管怎麼設,session真實有效時間仍是會比咱們設置的稍微長一些。

複製代碼
 1 <?xml version="1.0" encoding="UTF-8"?>  2 <beans xmlns="http://www.springframework.org/schema/beans"  3  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  4  xsi:schemaLocation="http://www.springframework.org/schema/beans  5  http://www.springframework.org/schema/beans/spring-beans.xsd">  6  7 <!-- session設置 -->  8 <bean class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration">  9 <property name="maxInactiveIntervalInSeconds" value="3600"></property> 10 </bean> 11 <!-- redis鏈接池 --> 12 <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig"/> 13 14 <!-- redis鏈接工廠 --> 15 <bean id="connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"> 16 <property name="hostName" value="${redis_hostName}"/> 17 <property name="port" value="${redis_port}"/> 18 <property name="password" value="${redis_password}"/> 19 <property name="timeout" value="${redis_timeout}"/> 20 <property name="poolConfig" ref="poolConfig"></property> 21 </bean> 22 23 24 25 </beans>
複製代碼

添加完成後,別忘了還要在spring.xml和web.xml引入咱們新添加的文件,引入代碼這裏就不給出了。
最後咱們還須要在web.xml中加入spring的session過濾器,我我的理解這個過濾器的做用是告訴spring來接管對session管理與建立工做。

複製代碼
1 <!--session過濾器--> 2 <filter> 3 <filter-name>springSessionRepositoryFilter</filter-name> 4 <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 5 </filter> 6 <filter-mapping> 7 <filter-name>springSessionRepositoryFilter</filter-name> 8 <url-pattern>/*</url-pattern> 9 </filter-mapping>
複製代碼

 完成這一步之後,咱們對redis的集成就完成了,接下來咱們測試一下。

3.Session共享測試

爲了完成測試,我先在IndexController中添加了兩個簡單方法,一個是登陸方法,一個是進入用戶中心方法。須要注意的是若是要往redis中存入對象,則須要改對象序列化才能存入。我這裏爲了方便,就用fastjson將對象轉爲字符串存入了,查看起來也方便點。

 

 另外我的中心頁面很簡單。

如今已經完成測試前的所有工做了,開始測試吧。

啓動tomcat1,在瀏覽器中輸入localhost:8080,進入咱們的登陸頁面,登陸頁面代碼就不貼出了,就是ajax提交而已。輸入咱們的用戶名和密碼。登陸。看到咱們登陸成功了,用戶我的中心能成功顯示咱們的用戶名。

 再看看咱們redis服務器,能夠看到裏面已經添加了一些數據,有些session是spring本身添加的,具體什麼意思我也不是很清楚,但咱們找一下,就能夠找到咱們剛剛添加的session。其中右上角的TIL是咱們session剩餘有效時間。

那麼這session是否能被共享呢? 讓咱們老規矩,複製tomcat1的項目,到tomcat2中去,修改個別字以區分頁面。

啓動項目,直接在瀏覽器中輸入我的中心的路徑,localhost:8081/userCenter。能夠看到沒報任何空指針錯誤,直接就進入了我的中心頁面(固然要在同個瀏覽器中哦)。共享成功。

 

 隨後打開咱們上次配置好的nginx,進入登陸界面,進行登陸步驟,咱們就能夠看到咱們可能在tomcat1登陸,進入tomcat2的我的中心,固然可能反之,刷新時我的中心頁面,會看見兩個tomcat的頁面在間隔得顯示,測試成功。

再補充個上次漏掉的,這時咱們能夠關閉其中一個服務器,我關了tomcat1,再屢次刷新頁面,會發現接下來出現的都是tomcat2的頁面,這時必然的,可是時而快時而慢。這其中緣由是當nginx將請求轉發到tomcat2時,服務器固然能作出當即性響應,但要是轉到了tomcat1,就會出現一段長達1分多鐘的等待響應過程,這顯然咱們是不能接受的。對此咱們須要對ngin配置進行寫修改。在這裏先介紹幾個標籤。

  • proxy_connect_timeout:與服務器鏈接的超時時間,默認60s
  • fail_timeout:當該時間內服務器沒響應,則認爲服務器失效,默認10s
  • max_fails:容許鏈接失敗次數,默認爲1

這裏咱們所需等待時間 = proxy_connect_timeout + fail_timeout*max_fails,因此我以下配置只需等待3秒,nginx便會將請求轉給tomcat2,仍是在能接受範圍內的。

 

 

 

 4.小結

該說的在前文也說了,總而言之,spring已經爲咱們的session共享提供了很好的支持,咱們只需好好利用它就行了。

在此demo源碼奉上:http://download.csdn.net/detail/zhrxidian/9520968

 

5.後記

前些天遇到一個問題,有個功能能設置調度任務,但不能設置同一個時間點,這樣就須要將前邊設置的時間保存下來。當時的想法是新建一張表來儲存設置的時間,但總有殺雞用牛刀的感受。後來工頭提醒項目已經有了redis,那就物盡其用,就被叫去作redis實現數據緩存功能。

好在redis提供了java客戶端開發包,名曰jedis,下星期會比較忙,等過段時間再分享下使用jedis緩存數據的過程。

相關文章
相關標籤/搜索