搭建微服務集羣,常常會遇到分佈式環境Session跨域共享的問題,這類問題的解決對於開發經驗豐富的程序猿,思路很簡單--多個web服務器(如tomcat、jetty)訪問同一個數據庫,通過該數據庫來實現session同步。
常見的關係型數據庫中,我們甚至可以使用mysql,但考慮到效率問題、和持久化必要性,大多數開發者最終會採用redis、H2;
spring開源組織已經爲我們集成了這樣的解決方案,spring-session-redis 就是通過此思路來實現的;
1、首先創建一個springboot項目,我們需要引入的依賴jar包選擇如下;
依賴jar如下: 'org.springframework.boot:spring-boot-starter-cache' 'org.springframework.boot:spring-boot-starter-data-redis' 'org.springframework.session:spring-session-data-redis'
2、配置redis的訪問地址、賬戶、密碼(redis的安裝在此略過)
參數說明如下
spring: redis: host: 127.0.0.1 # redis地址 password: sc_admin # 密碼 port: 6379 # 端口號 database: 1 # 採用的redis數據庫號,由0-15 session: store-type: redis # 採用的數據庫類型
3、在Application啓動類上加上註解
@EnableCaching @EnableRedisHttpSession
;
4、到這一步,我們的spring-session-redis已經集成好,現在我們寫一個RestController來測試一下;
@RestController public class IndexController { @ResponseBody @RequestMapping(value = "/session") public Map<String, Object> getSession(HttpServletRequest request) { request.getSession().setAttribute("username", "admin"); Map<String, Object> map = new HashMap<String, Object>(); map.put("sessionId", request.getSession().getId()); return map; } @ResponseBody @RequestMapping(value = "/get") public String get(HttpServletRequest request) { String userName = (String) request.getSession().getAttribute("username"); return userName; } @ResponseBody @RequestMapping(value = "/clear") public String clear(HttpServletRequest request) { request.getSession().removeAttribute("username"); return "userName"; } }
5、複製該項目,並修改啓動端口號爲8094;
6、啓動兩個springboot服務,然後打開瀏覽器,分別鍵入 http://localhost:8093/complicated/session ,http://localhost:8094/complicated/session
可以觀察到,sessionId相同,
在訪問/get,/clear 方法測試同理!