1. 程式人生 > 程式設計 >SpringBoot中使用Session共享實現分散式部署的示例程式碼

SpringBoot中使用Session共享實現分散式部署的示例程式碼

前言:我們知道,在單體專案中,我們將使用者資訊存在 session 中,那麼在該 session 過期之前,我們都可以從 session 中獲取到使用者資訊,通過登入攔截,進行操作

但是分散式部署的時候,我們請求的伺服器可能不是同一臺伺服器,那麼我們就必須要面對 session 共享的問題,下面介紹的是在 SpringBoot 實現 session 共享的方式

一、建立專案

建立 SpringBoot 專案,選擇 Maven 依賴

SpringBoot中使用Session共享實現分散式部署的示例程式碼

SpringBoot中使用Session共享實現分散式部署的示例程式碼

最終 pom.xml 檔案如下:

<!-- redis的依賴 -->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- web的依賴 -->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- session共享的依賴 -->
<dependency>
  <groupId>org.springframework.session</groupId>
  <artifactId>spring-session-data-redis</artifactId>
</dependency>

二、配置 Redis

我們需要藉助 redis 實現 session 共享,所以我們需要在配置檔案中配置 redis 的資訊

server:
 port: 8080

spring:
 redis:
  host: 127.0.0.1
  port: 6379
  database: 0
  password:

我們配置了該專案的埠,以及 redis 的連線資訊

三、寫介面

package com.zyxx.session.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpSession;

@RestController
public class DemoController {

  /**
   * 獲取專案埠
   */
  @Value("${server.port}")
  private String port;

  /**
   * 將資訊存放在session中
   */
  @GetMapping("set")
  public String set(HttpSession session) {
    session.setAttribute("user","hello world~~~");
    return port;
  }

  /**
   * 從session中獲取資訊
   */
  @GetMapping("get")
  public String get(HttpSession session) {
    return session.getAttribute("user") + " : " + port;
  }
}

我們寫了一個 set,一個 get 方法,將資訊存放在 session 中,從 session 中取出資訊

四、打包測試

SpringBoot中使用Session共享實現分散式部署的示例程式碼

啟動專案,分別啟動在兩個埠:

java -jar .\session-0.0.1-SNAPSHOT.jar --server.port=8080
java -jar .\session-0.0.1-SNAPSHOT.jar --server.port=8081

分別啟動在 8080,8081埠

訪問:http://localhost:8080/set

SpringBoot中使用Session共享實現分散式部署的示例程式碼

我們從 8080 埠,將資訊儲存在 session 中

我們訪問:http://localhost:8081/get

SpringBoot中使用Session共享實現分散式部署的示例程式碼

我們在 8081 埠的專案中從 session 中取出了內容:hello world~~~

由此證明,我們的 session 共享已經成功

五、分散式部署

下面我們藉助 nginx 代理轉發訪問這兩個專案

1、配置轉發

nginx 配置檔案如下:

SpringBoot中使用Session共享實現分散式部署的示例程式碼

主要配置內容:

upstream helloworld{
	server 127.0.0.1:8080 weight=1;
	server 127.0.0.1:8081 weight=2;
}

這裡配置轉發到 8080,8081 埠,並配置了權重

location / {
	proxy_pass http://helloworld;
  #root  html;
  #index index.html index.htm;
}

攔截本地的所有請求,預設埠為 80

2、啟動 nginx

nginx -s reload

3、訪問測試

我們先刪除 redis 裡面剛剛測試儲存的資訊

SpringBoot中使用Session共享實現分散式部署的示例程式碼

然後我們訪問:

http://localhost/set

SpringBoot中使用Session共享實現分散式部署的示例程式碼

這裡我們可以看出,由 8080 埠的伺服器完成了 set 請求,多次訪問,nginx 將會根據什麼配置的權重引數分配伺服器來完成操作

下面我們訪問:

http://localhost/get

SpringBoot中使用Session共享實現分散式部署的示例程式碼

可以看出,由 8081 埠的伺服器完成了 get 請求,併成功取到了存在 session 中的資料,實現了 session 共享

六、總結

1、以前我們在 SSM 架構的專案中實現 session 共享,需要配置三個地方 ,一個是 web.xml 配置代理過濾器,然後在 Spring 容器中配置 Redis,最後再配置 Spring Session,相比 SpringBoot,稍有複雜
2、我們在 SpringBoot 中實現 session 共享還是非常簡單的,只需要引入依賴,簡單配置即可實現
3、實現 session 共享,幫助我們將專案分散式部署,提升服務效能有很大的意義

到此這篇關於SpringBoot中使用Session共享實現分散式部署的示例程式碼的文章就介紹到這了,更多相關SpringBoot Session分散式部署內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!