亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Springboot實現多服務器session共享

 更新時間:2019年05月17日 11:35:15   作者:New_Yao  
這篇文章主要為大家詳細介紹了Springboot實現多服務器session共享,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了springboot實現多服務器session共享的具體代碼,供大家參考,具體內容如下

環(huán)境:

springboot:2.0.4
redis:3.2.100
jdk:1.8
eclipse:4.9.0

1.原理

正常情況下,HTTPSession是通過servlet容器創(chuàng)建并管理的,創(chuàng)建成功后都保存在內存中,如果開發(fā)者需要對項目進行橫向拓展搭建集群,那么可以用一些硬件和軟件工具來做負載均衡,此時,來自同一用戶的HTTP請求有可能會被發(fā)送到不同的實例上去,如何保證各個實例之間的Session同步就成為了一個必須解決的問題,Springboot提供了自動化session共享配置,它結合redis非常方便的解決了這個問題。使用Redis解決session共享的原理非常簡單,就是把原本儲存在不同服務器上的session拿出來放到一個獨立的服務器上,可以參考下圖來理解

當一個請求到達Nginx服務器上時,首先請求分發(fā),假設請求被server2處理了,server2在處理請求時,無論存儲還是讀取session的操作,都是去操作session服務器而不是自身內存中的session,其他server也是如此,這樣就實現了session共享!

2.如何實現

關于Nginx和Redis的配置,本文就不再詳細介紹,網上教程也有很多。這里使用手動直接訪問兩個端口模擬nginx反向代理。

2.1首先創(chuàng)建一個springboot項目,全部的pom.xml配置如下:

除了Redis依賴之外,這里還需要提供spring-session-data-redis依賴,Spring Session可以做到透明的替換掉應用中的Session容器。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 <modelVersion>4.0.0</modelVersion>

 <groupId>cn</groupId>
 <artifactId>session-two</artifactId>
 <version>0.0.1-SNAPSHOT</version>
 <packaging>jar</packaging>

 <name>session-two</name>
 <url>http://maven.apache.org</url>

 <properties>
  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 </properties>

 <parent>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-parent</artifactId>
 <version>2.0.4.RELEASE</version>
 <relativePath /> <!-- lookup parent from repository -->
 </parent>
 <dependencies>
 <dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-redis</artifactId>
  <exclusions>
  <exclusion>
   <groupId>io.lettuce</groupId>
   <artifactId>lettuce-code</artifactId>
  </exclusion>
  </exclusions>
 </dependency>
 <dependency>
  <groupId>redis.clients</groupId>
  <artifactId>jedis</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>
 <dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.12</version>
  <scope>test</scope>
 </dependency>
 </dependencies>
 <build>
  <plugins>
  <plugin>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-maven-plugin</artifactId>
  </plugin>
 </plugins>
 </build>
</project>

2.2 application.properties中進行redis配置

spring.redis.database=0
spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.password=
spring.redis.jedis.pool.max-active=8
spring.redis.jedis.pool.max-idle=8
spring.redis.jedis.pool.max-wait=-1ms
spring.redis.jedis.pool.min-idle=0

2.3 創(chuàng)建controller測試

import javax.servlet.http.HttpSession;

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

@RestController
public class HelloController {
 
 @Value("${server.port}")
 String port;
 @PostMapping("save")
 public String saveName(String name,HttpSession session ) {
 session.setAttribute("name", name);
 return port;
 }
 
 @GetMapping("get")
 public String saveName(HttpSession session ) {
 return port+":"+session.getAttribute("name").toString();
 }
}

這里提供了兩個接口,一個是save用來向session中保存數據,一個是get用來從session中獲取數據,這里注入了項目端口server.prot主要是用來顯示是那個服務器提供的服務(Nginx下方便查看),雖然我們在這里操作的是Httpsession,但是其實Httpsession容器已經被透明的替換掉了,真正的session此時存儲在redis服務器上。

3.進行測試

3.1將項目打成jar包,然后打開兩個命令提示框,分別執(zhí)行如下兩個命令啟動項目

java -jar session-two-0.0.1-SNAPSHOT.jar --server.port=81
java -jar session-two-0.0.1-SNAPSHOT.jar --server.port=82

3.2使用Postman測試

3.2.1 訪問81服務器并且設置name為張三

3.2.2 訪問82服務器獲取session中保存的name

至此,一個簡單的demo就完成了

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • SpringBoot SpringEL表達式的使用

    SpringBoot SpringEL表達式的使用

    本文主要介紹了SpringEL表達式的使用,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • 詳解SpringBoot中的統一異常處理

    詳解SpringBoot中的統一異常處理

    這篇文章主要介紹了詳解SpringBoot中的統一異常處理,在獨立的某個地方,比如單獨一個類,定義一套對各種異常的處理機制,需要的朋友可以參考下
    2023-05-05
  • Java消息隊列RabbitMQ入門詳解

    Java消息隊列RabbitMQ入門詳解

    這篇文章主要介紹了Java消息隊列RabbitMQ入門詳解,RabbitMQ是使用Erlang語言開發(fā)的開源消息隊列系統,基于AMQP協議 來實現,AMQP的主要特征是面向消息、隊列、路由(包括點對點和發(fā)布 /訂閱)、可靠性、安全,需要的朋友可以參考下
    2023-07-07
  • 源碼解析springbatch的job運行機制

    源碼解析springbatch的job運行機制

    這篇文章主要介紹了springbatch的job是如何運行的,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-08-08
  • mybatis foreach標簽的使用詳解

    mybatis foreach標簽的使用詳解

    這篇文章主要介紹了mybatis foreach標簽的使用詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-06-06
  • Spring mvc Controller和RestFul原理解析

    Spring mvc Controller和RestFul原理解析

    這篇文章主要介紹了Spring mvc Controller和RestFul原理解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-03-03
  • elk之實現在kibana高效精準查詢日志

    elk之實現在kibana高效精準查詢日志

    這篇文章主要介紹了elk之實現在kibana高效精準查詢日志方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • Java Hibernate對象(瞬時態(tài),持久態(tài),脫管態(tài))詳解

    Java Hibernate對象(瞬時態(tài),持久態(tài),脫管態(tài))詳解

    這篇文章主要介紹了Java Hibernate對象(瞬時態(tài),持久態(tài),脫管態(tài))詳解的相關資料,這里對Java Hibernate對象進行了介紹及總結,需要的朋友可以參考下
    2016-11-11
  • Netty分布式高性能工具類recycler的使用及創(chuàng)建

    Netty分布式高性能工具類recycler的使用及創(chuàng)建

    這篇文章主要為大家介紹了Netty分布式高性能工具類recycler的使用和創(chuàng)建,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2022-03-03
  • Java中的泛型

    Java中的泛型

    這篇文章主要介紹為何要泛型,如何使用泛型,自定義泛型的方法,泛型類的子類等多方面介紹了JAVA中的泛型,需要的小伙伴請看下文
    2021-08-08

最新評論