SpringBoot學習筆記(13)----使用Spring Session+redis實現一個簡單的叢集
session叢集的解決方案:
1.擴充套件指定server
利用Servlet容器提供的外掛功能,自定義HttpSession的建立和管理策略,並通過配置的方式替換掉預設的策略。缺點:耦合Tomcat/Jetty等Servlet容器,不能隨意更換容器。
2.利用Filter
利用HttpServletRequestWrapper,實現自己的 getSession()方法,接管建立和管理Session資料的工作。spring-session就是通過這樣的思路實現的。
Spring Boot中spring session支援方式:
JDBC、MongoDB、Redis
由於redis現在市場使用較多,同時也是較為經典的一種是用方式,所以這裡直接使用redis來實現簡單的叢集
具體實現,首先引入依賴,pom.xml
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-data-redis</artifactId> </dependency>
然後配置檔案中的配置
# spring session使用儲存型別 #spring.session.store-type=redis # spring session重新整理模式:預設on-save #spring.session.redis.flush-mode=on-save #spring.session.redis.namespace= # session超時時間,單位秒 #server.session.timeout=30 #redis #spring.redis.host=localhost #spring.redis.port=6379 #spring.redis.password=123456 #spring.redis.database=0 #spring.redis.pool.max-active=8 #spring.redis.pool.max-idle=8 #spring.redis.pool.max-wait=-1 #spring.redis.pool.min-idle=0 #spring.redis.timeout=0
配置自己需要的配置即可,spring.session.store-type=redis表示Session儲存型別,這裡選擇的是redis,它有REDIS,MONGODB,JDBC,HAZELCAST,NONE;可供選擇。
測試程式碼:
我們這裡是開了兩個不同埠的服務,驗證兩個不同服務之間列印的sessonID是否相同來測試是否實現了資料的共享,兩個服務程式碼如下
package com.wangx.boot.controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpSession; @RestController @RequestMapping("/web") public class WebController { @RequestMapping("/index") @ResponseBody public String index(HttpSession session) { System.out.println(session.getId()); return "第一個應用:" + session.getId(); } }
package com.wangx.boot.controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpSession; @RestController @RequestMapping("/web") public class WebController { @RequestMapping("/index") @ResponseBody public String index(HttpSession session) { System.out.println(session.getId()); return "第二個應用:" + session.getId();
}
}
訪問分別訪問http://localhost:8080/web/index和http://localhost:8081/web/index,執行結果如下:
可以看到兩個不同服務直接輸出的sessionID都是一致的。兩個不同服務直接共享同一個session,這樣就實現了資料的同步和共享,它的實現原理就是將session儲存到redis中,兩個服務使用的時候都是在redis中取資料,從而共享了資料。