亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Springboot Session共享的實現方法

發布時間:2020-08-19 10:51:25 來源:億速云 閱讀:255 作者:小新 欄目:開發技術

這篇文章主要介紹Springboot Session共享的實現方法,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

在傳統的單服務架構中,一般來說,只有一個服務器,那么不存在 Session

共享問題,但是在分布式/集群項目中,Session 共享則是一個必須面對的問題,先看一個簡單的架構圖:

Springboot Session共享的實現方法

在這樣的架構中,會出現一些單服務中不存在的問題,例如客戶端發起一個請求,這個請求到達 Nginx 上之后,被
Nginx 轉發到 Tomcat A 上,然后在 Tomcat A 上往 session 中保存了一份數據,下次又來一個請求,這個請求被轉發到 Tomcat
B 上,此時再去 Session中獲取數據,發現沒有之前的數據。對于這一類問題的解決,思路很簡單,就是將各個服務之間需要共享的數據,保存到一個公共的地方(主流方案就是 Redis):

Springboot Session共享的實現方法

1 實戰

1.1 創建工程

首先 創建一個 Spring Boot 工程,引入 Web、Spring Session 以及 Redis:

Springboot Session共享的實現方法

創建成功之后,pom.xml 文件如下:

<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
  </dependency>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
  </dependency>
  <dependency>
    <groupId>org.springframework.session</groupId>
    <artifactId>spring-session-data-redis</artifactId>
  </dependency>
</dependencies>

注意:

這里我使用的 Spring Boot 版本是 2.1.4 ,如果使用當前最新版 Spring Boot2.1.5的話,除了上面這些依賴之外,需要額外添加 Spring Security 依賴(其他操作不受影響,僅僅只是多了一個依賴,當然也多了 Spring Security 的一些默認認證流程)。

1.2 配置 Redis

spring.redis.host=192.168.66.128
spring.redis.port=6379
spring.redis.password=123
spring.redis.database=0

1.3 使用

配置完成后 ,就可以使用 Spring Session 了,其實就是使用普通的 HttpSession ,其他的 Session 同步到 Redis 等操作,框架已經自動幫你完成了:

@RestController
public class HelloController {
  @Value("${server.port}")
  Integer port;
  @GetMapping("/set")
  public String set(HttpSession session) {
    session.setAttribute("user", "javaboy");
    return String.valueOf(port);
  }
  @GetMapping("/get")
  public String get(HttpSession session) {
    return session.getAttribute("user") + ":" + port;
  }
}

考慮到一會 Spring Boot 將以集群的方式啟動 ,為了獲取每一個請求到底是哪一個 Spring Boot 提供的服務,需要在每次請求時返回當前服務的端口號,因此這里我注入了 server.port 。

接下來 ,項目打包:

Springboot Session共享的實現方法

打包之后,啟動項目的兩個實例:

java -jar sessionshare-0.0.1-SNAPSHOT.jar --server.port=8080
java -jar sessionshare-0.0.1-SNAPSHOT.jar --server.port=8081

然后先訪問 localhost:8080/set 向 8080 這個服務的 Session 中保存一個變量,訪問完成后,數據就已經自動同步到 Redis 中 了 :

Springboot Session共享的實現方法

然后,再調用 localhost:8081/get 接口,就可以獲取到 8080 服務的 session 中的數據:

Springboot Session共享的實現方法

此時關于 session 共享的配置就已經全部完成了,session 共享的效果我們已經看到了,但是每次訪問都是我自己手動切換服務實例,因此,接下來我們來引入 Nginx ,實現服務實例自動切換。

1.4 引入 Nginx

很簡單,進入 Nginx 的安裝目錄的 conf 目錄下(默認是在 /usr/local/nginx/conf),編輯 nginx.conf 文件:

Springboot Session共享的實現方法

在這段配置中:

  • upstream 表示配置上游服務器
  • javaboy.org 表示服務器集群的名字,這個可以隨意取名字
  • upstream 里邊配置的是一個個的單獨服務
  • weight 表示服務的權重,意味者將有多少比例的請求從 Nginx 上轉發到該服務上
  • location 中的 proxy_pass 表示請求轉發的地址,/ 表示攔截到所有的請求,轉發轉發到剛剛配置好的服務集群中
  • proxy_redirect 表示設置當發生重定向請求時,nginx 自動修正響應頭數據(默認是 Tomcat 返回重定向,此時重定向的地址是 Tomcat 的地址,我們需要將之修改使之成為 Nginx 的地址)。

配置完成后,將本地的 Spring Boot 打包好的 jar 上傳到 Linux ,然后在 Linux 上分別啟動兩個 Spring Boot 實例:

nohup java -jar sessionshare-0.0.1-SNAPSHOT.jar --server.port=8080 & nohup java -jar sessionshare-0.0.1-SNAPSHOT.jar --server.port=8081 &

其中

  • nohup 表示當終端關閉時,Spring Boot 不要停止運行
  • & 表示讓 Spring Boot 在后臺啟動

配置完成后,重啟 Nginx:

/usr/local/nginx/sbin/nginx -s reload

Nginx 啟動成功后,我們首先手動清除 Redis 上的數據,然后訪問 192.168.66.128/set 表示向 session 中保存數據,這個請求首先會到達 Nginx 上,再由 Nginx 轉發給某一個 Spring Boot 實例:

Springboot Session共享的實現方法

如上,表示端口為 8081 的 Spring Boot 處理了這個 /set 請求,再訪問 /get 請求:

Springboot Session共享的實現方法

可以看到,/get 請求是被端口為 8080 的服務所處理的。

以上是Springboot Session共享的實現方法的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

乳山市| 文水县| 阳江市| 揭东县| 老河口市| 谷城县| 武汉市| 尚志市| 高唐县| 怀柔区| 香格里拉县| 阳高县| 天等县| 图片| 呼和浩特市| 弥渡县| 吐鲁番市| 仁化县| 上思县| 比如县| 汉源县| 黔西县| 个旧市| 康乐县| 双柏县| 广丰县| 招远市| 繁峙县| 迁安市| 临潭县| 大竹县| 太仓市| 深州市| 江油市| 宝应县| 洛南县| 永春县| 敦煌市| 上虞市| 错那县| 蛟河市|