聊聊集羣中會出現的問題

前言

一個項目最開始可能都是通過一個war包開始萌芽,把這個war包放到tomcat裏面運行起來,整個項目就ok了;

But,隨着併發量,用戶量達到一定數目,一個tomcat就搞不定了,這個時候會用到Nginx,使用Nginx來做分流;

如果是一些查詢頁面沒什麼問題,可一旦項目要用到登陸,這就捅婁子了,用戶登陸的Session是存放在服務器上,而當用戶訪問另外一個服務器就會出現沒有登陸的情況;

不過在解決這問題之前,先講下Nginx的基本使用

1. Nginx多tomcat負載配置

Nginx可以提供當有多個服務器的時候可以提供負載均衡的功能,如果有某個服務器宕機可以提供故障轉移,當出現網絡波動的時候可以提供失敗重試機制,不管是什麼樣的機制,首先需要配置多個服務,這裏的服務使用Upstream進行配置

1.1. Upstream Server配置

upstream 主要配置如下:

IP地址和端口號:配置上游服務器的IP地址和端口

1.2. 負載均衡算法

1、輪詢(默認)

每個請求按時間順序逐一分配到不同的後端服務,如果後端某臺服務器死機,自動剔除故障系統,使用戶訪問不受影響。

2、weight(輪詢權值)

weight的值越大分配到的訪問概率越高,主要用於後端每臺服務器性能不均衡的情況下。或者僅僅爲在主從的情況下設置不同的權值,達到合理有效的地利用主機資源。

3、ip_hash

每個請求按客戶端P的哈希結果分配,使來自同一個IP的訪客固定訪問一臺後端服務器,並且可以有效解決動態網頁存在的session共享問題。俗稱IP綁定。

2. Session一致性解決方案

可以看到前面講負載均衡算法的時候可以使用ip_hash來實現session一致性的問題,因爲當有多個tomcat的時候,對於某個客戶端的登陸請求,由於其ip是固定的,所以最終一

還是會路由的固定的tomcat上;

實際除開上面的這種解決方案以外,還有另外一種SESSION一致性的解決方案,使用Redis來存放SESSION的內容,使用Spring Session框架,其底層其實就是重寫了HttpSession的獲取方式

2.1. pom文件修改


1.  `<dependency>`

2.  `<groupId>org.springframework.boot</groupId>`

3.  `<artifactId>spring-boot-starter-data-redis</artifactId>`

4.  `</dependency>`

5.  `<dependency>`

6.  `<groupId>org.springframework.session</groupId>`

7.  `<artifactId>spring-session-data-redis</artifactId>`

8.  `</dependency>`

2.2. 新增properties文件

application.properties文件內容如下,增加redis相關配置


1.  `# Redis服務器地址`

2.  `spring.redis.host=127.0.0.1`

3.  `spring.redis.port=6379`

2.3. 新增啓動類


1.  `package cn.enjoy.mt;`

2.  `import org.springframework.boot.SpringApplication;`

3.  `import org.springframework.boot.autoconfigure.SpringBootApplication;`

4.  `import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;`

5.  `@SpringBootApplication`

6.  `@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 1800)`

7.  `publicclassApp{`

8.  `publicstaticvoid main(String[] args) {`

9.  `SpringApplication.run(App.class, args);`

10.  `}`

11.  `}`

2.4. 啓動Redis

啓動 /redis-serve redis.conf

2.5. 測試

用戶登陸後

這樣相應的登陸的session信息就存放到了Redis中

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章