簡介: 正常情況下,HttpSession是通過Servlet 容器創建併進行管理的,創建成功之後都是保存在記憶體中。如果開發者需要對項目進行橫向擴展搭建集群,那麼可以利用一些硬體或者軟體工具來做負載均衡,此時,來自同一用戶的HTTP請求就有可能被分發到不同的實例上去,如何保證各個實例之間Sessio ...
簡介:
正常情況下,HttpSession是通過Servlet 容器創建併進行管理的,創建成功之後都是保存在內
存中。如果開發者需要對項目進行橫向擴展搭建集群,那麼可以利用一些硬體或者軟體工具來做負
載均衡,此時,來自同一用戶的HTTP請求就有可能被分發到不同的實例上去,如何保證各個實例
之間Session的同步就成為一個必 須解決的問題。
Spring Boot 提供了自動化的 Session共用配置,它結合Redis可以非常方便地解決這個問題。使用Redis 解決Session共用問題的原理非常簡單,就是把原本存儲在不同伺服器上的Session拿出來放在一個獨立的伺服器上。
當一個請求到達Nginx伺服器後,首先進行請求分發,假設請求被real server 1處理了,real server 1在處理請求時,無論是存儲Session還是讀取Session,都去操作Session伺服器而不是操作自身記憶體中的Session,其他real server在處理請求時也是如此,這樣就可以實現Session共用了。
Demo:
首先添加Redis和Session依賴,
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-data-redis</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency>
application.properties
#使用0號庫,redis預設0-15,16個庫 spring.redis.database=0 spring.redis.host=192.168.205.100 spring.redis.port=6379 spring.redis.password=123456 spring.redis.jedis.pool.max-active=8 spring.redis.jedis.pool.max-idle=8 spring.redis.jedis.pool.max-wait=-1ms spring.redis.jedis.pool.min-idle=0
Controller:
這裡提供了兩個方法,一個save介面用來向Session中存儲數據,還有一一個get 介面用來從Session中獲取數據。
這裡註入了項目啟動的埠號server.port, 主要是為了區分到底是哪個伺服器提供的服務。另外,雖然還是操作的HttpSession,但是實際上HttpSession容器已經被透明替換,真正的Session此時存儲在Redis伺服器上。
@RestController public class HelloController { @Value("${server.port}") String port; @PostMapping("/save") public String saveName(String name, HttpSession session) { session.setAttribute("name", name); return port; } @GetMapping("/get") public String getName(HttpSession session) { return port + ":" + session.getAttribute("name").toString(); } }
將項目打成jar上傳到centos,
2.Nginx
下載--配置
啟動:nginx預設80埠
[root@localhost sbin]# /usr/local/nginx/sbin/nginx
配置:
[root@localhost sbin]# vi /usr/local/nginx/conf/nginx.conf
重啟nginx
[root@localhost sbin]# /usr/local/nginx/sbin/nginx -s reload
輸入:
http://192.168.205.100:80/save?name=eeeee
調用80埠,實際上使用8080
http://192.168.205.100:80/get
調用80實際上是8081