Spring-session-redis實現web服務器集羣session共享

搭建微服務集羣,常常會遇到分佈式環境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 方法測試同理!

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