簡介:nginx
正常狀況下,HttpSession是經過Servlet 容器建立並進行管理的,建立成功以後都是保存在內
存中。若是開發者須要對項目進行橫向擴展搭建集羣,那麼能夠利用一些硬件或者軟件工具來作負
載均衡,此時,來自同一用戶的HTTP請求就有可能被分發到不一樣的實例上去,如何保證各個實例
之間Session的同步就成爲一個必 須解決的問題。web
Spring Boot 提供了自動化的 Session共享配置,它結合Redis能夠很是方便地解決這個問題。使用Redis 解決Session共享問題的原理很是簡單,就是把本來存儲在不一樣服務器上的Session拿出來放在一個獨立的服務器上。redis
當一個請求到達Nginx服務器後,首先進行請求分發,假設請求被real server 1處理了,real server 1在處理請求時,不管是存儲Session仍是讀取Session,都去操做Session服務器而不是操做自身內存中的Session,其餘real server在處理請求時也是如此,這樣就能夠實現Session共享了。spring
Demo:centos
首先添加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.propertiessession
#使用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:app
這裏提供了兩個方法,一個save接口用來向Session中存儲數據,還有一一個get 接口用來從Session中獲取數據。spring-boot
這裏注入了項目啓動的端口號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