1. 程式人生 > >SpringBoot學習筆記(13)----使用Spring Session+redis實現一個簡單的叢集

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

、Hazelcast

  由於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中取資料,從而共享了資料。