Spring Session與Nginx負(fù)載均衡

一伸蚯、Spring Session

在使用Nginx負(fù)載均衡功能的時候妹沙,總會碰到session同步問題处铛。一般Nginx配置的時候會將用戶的請求IP進(jìn)行綁定,對于同一個IP的請求都會轉(zhuǎn)發(fā)到同一臺服務(wù)器幽邓,這樣就會避免session丟失。如果請求來自于同一個局域網(wǎng)火脉,那么他們的出口IP可能是一樣的牵舵,這樣會導(dǎo)致某一臺服務(wù)器處于繁忙狀態(tài)柒啤,而其它服務(wù)器卻處于空閑狀態(tài),這就導(dǎo)致負(fù)載均衡的實際效率不高畸颅。
Spring Session是一個集群會話解決方案担巩,它通過redis、mysql等數(shù)據(jù)庫來實現(xiàn)集群間Session的共享没炒。另外Spring Session并不需要你修改任何業(yè)務(wù)代碼就能無縫集成到Spring框架中涛癌。

二、需要準(zhǔn)備的內(nèi)容

  • 一臺Nginx服務(wù)器
    我這邊直接使用工作電腦作為Nginx服務(wù)器送火,設(shè)置IP地址為192.168.0.102拳话。
  • 兩臺linux服務(wù)器
    設(shè)置IP地址,我這邊分別設(shè)置為192.168.0.107192.168.0.109种吸。
  • Redis服務(wù)
    我這邊安裝在192.168.0.107這臺服務(wù)器中弃衍。由于之前沒有使用過Redis,所以在安裝坚俗、使用的時候遇到了不少問題镜盯。
    1、啟動配置文件路徑問題
    根據(jù)官方文檔猖败,Redis啟動時最好設(shè)置自己的配置文件速缆,所以我使用了
    ./redis-server ../../path/to/redis.conf這條命令,結(jié)果設(shè)置的配置莫名丟失恩闻。最后發(fā)現(xiàn)是路徑問題激涤,因為我使用了相對路徑結(jié)果導(dǎo)致配置文件沒有找到,所以啟動服務(wù)的時候最好使用全路徑判呕。
    2倦踢、Redis連接問題
    Redis默認(rèn)只綁定了127.0.0.1,所以只有本機(jī)可以訪問Redis侠草。我們需要在redis.conf文件中或者通過redis-cli命令config set bind 192.168.0.107進(jìn)行配置辱挥。然后還需要設(shè)置連接密碼,同樣可以通過redis.conf文件或者通過redis-cli命令config set requirepass 123456進(jìn)行配置边涕。完成以上配置后晤碘,我們就可以在局域網(wǎng)內(nèi)連接到192.168.0.107這臺服務(wù)器上的Redis服務(wù)了。
    需要注意的是redis.conf文件配置的內(nèi)容重啟服務(wù)后依然有效功蜓,而redis-cli配置的內(nèi)容重啟服務(wù)后失效园爷。另外,以上方式只適合開發(fā)環(huán)境式撼。

三童社、Spring Boot配置

根據(jù)Spring的官方教程,我直接在pom.xml導(dǎo)入以下依賴:

   <dependency>
      <groupId>org.springframework.session</groupId>
      <artifactId>spring-session-data-redis</artifactId>
    </dependency>

結(jié)果啟動時發(fā)生了以下異常:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.boot.autoconfigure.session.SessionAutoConfiguration$ServletSessionRepositoryValidator': Invocation of init method failed; nested exception is org.springframework.boot.autoconfigure.session.SessionRepositoryUnavailableException: No session repository could be auto-configured, check your configuration (session store type is 'redis')
...
...
Caused by: org.springframework.boot.autoconfigure.session.SessionRepositoryUnavailableException: No session repository could be auto-configured, check your configuration (session store type is 'redis')

大概意思是Bean創(chuàng)建失敗著隆,主要是因為session repository不存在扰楼,如果使用過Spring Data的人都會知道repository代表的就是數(shù)據(jù)庫呀癣。經(jīng)過查詢最終發(fā)現(xiàn)少導(dǎo)入了包,完整的包依賴應(yīng)該是如下:

   <dependency>
      <groupId>org.springframework.session</groupId>
      <artifactId>spring-session-data-redis</artifactId>
   </dependency>
   <dependency>
      <groupId>io.lettuce</groupId>
      <artifactId>lettuce-core</artifactId>
   </dependency>

lettuce-core用來連接Redis服務(wù)弦赖,如果沒有它就無法創(chuàng)建相應(yīng)的repository项栏。雖然Spring的官方案例中導(dǎo)入了該包,但是它的教程中并沒有任何提示蹬竖,這對于新手來說有點不太友好沼沈。
除了導(dǎo)入依賴包外還需要在application.properties進(jìn)行一些配置:

spring.session.store-type=redis

server.servlet.session.timeout=600
spring.session.redis.flush-mode=on_save
spring.session.redis.namespace=spring:session

spring.redis.host=192.168.0.107
spring.redis.password=123456
spring.redis.port=6379

四、Nginx負(fù)載均衡設(shè)置

Nginx服務(wù)部署在工作電腦上币厕。

# spring session測試
    upstream springsession {
        server 192.168.0.107:8080 weight=1;
        server 192.168.0.109:8080 weight=1;
    }

    server {
        listen       8001;
        server_name  springsession;
        location /session/ {
            proxy_pass http://springsession;
            proxy_set_header Host $host:$server_port;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header REMOTE-HOST $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }

我這邊將兩臺服務(wù)器的權(quán)重設(shè)置一樣列另,這樣方便測試。

五劈榨、測試結(jié)果

將Spring Session項目分別放到在192.168.0.107192.168.0.109這兩臺服務(wù)器上運(yùn)行访递,然后在工作電腦上通過瀏覽器訪問localhost:8001/session/

服務(wù)器107.png

服務(wù)器109.png

從上可以看出,雖然兩次請求分配到了兩臺服務(wù)器同辣,但是它們通過Spring Session共享了一個session拷姿。

六、參考資源

https://redis.io/
https://docs.spring.io/spring-session/docs/2.4.3/reference/html5/guides/boot-redis.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末旱函,一起剝皮案震驚了整個濱河市响巢,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌棒妨,老刑警劉巖踪古,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異券腔,居然都是意外死亡伏穆,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進(jìn)店門纷纫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來枕扫,“玉大人,你說我怎么就攤上這事辱魁⊙糖疲” “怎么了?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵染簇,是天一觀的道長参滴。 經(jīng)常有香客問我,道長锻弓,這世上最難降的妖魔是什么砾赔? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上过蹂,老公的妹妹穿的比我還像新娘十绑。我一直安慰自己聚至,他們只是感情好酷勺,可當(dāng)我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著扳躬,像睡著了一般脆诉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上贷币,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天击胜,我揣著相機(jī)與錄音,去河邊找鬼役纹。 笑死偶摔,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的促脉。 我是一名探鬼主播辰斋,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼瘸味!你這毒婦竟也來了宫仗?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤旁仿,失蹤者是張志新(化名)和其女友劉穎藕夫,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體枯冈,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡毅贮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了尘奏。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片滩褥。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖罪既,靈堂內(nèi)的尸體忽然破棺而出铸题,到底是詐尸還是另有隱情,我是刑警寧澤琢感,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布丢间,位于F島的核電站,受9級特大地震影響驹针,放射性物質(zhì)發(fā)生泄漏烘挫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望饮六。 院中可真熱鬧其垄,春花似錦、人聲如沸卤橄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽窟扑。三九已至喇颁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間嚎货,已是汗流浹背橘霎。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留殖属,地道東北人姐叁。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像洗显,于是被迫代替她去往敵國和親外潜。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,675評論 2 359

推薦閱讀更多精彩內(nèi)容