最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Springboot Session共享實(shí)現(xiàn)原理及代碼實(shí)例

 更新時(shí)間:2020年08月17日 11:00:26   作者:柒丶月  
這篇文章主要介紹了Springboot Session共享實(shí)現(xiàn)原理及代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

在傳統(tǒng)的單服務(wù)架構(gòu)中,一般來(lái)說(shuō),只有一個(gè)服務(wù)器,那么不存在 Session

共享問(wèn)題,但是在分布式/集群項(xiàng)目中,Session 共享則是一個(gè)必須面對(duì)的問(wèn)題,先看一個(gè)簡(jiǎn)單的架構(gòu)圖:

在這樣的架構(gòu)中,會(huì)出現(xiàn)一些單服務(wù)中不存在的問(wèn)題,例如客戶端發(fā)起一個(gè)請(qǐng)求,這個(gè)請(qǐng)求到達(dá) Nginx 上之后,被
Nginx 轉(zhuǎn)發(fā)到 Tomcat A 上,然后在 Tomcat A 上往 session 中保存了一份數(shù)據(jù),下次又來(lái)一個(gè)請(qǐng)求,這個(gè)請(qǐng)求被轉(zhuǎn)發(fā)到 Tomcat
B 上,此時(shí)再去 Session中獲取數(shù)據(jù),發(fā)現(xiàn)沒(méi)有之前的數(shù)據(jù)。對(duì)于這一類(lèi)問(wèn)題的解決,思路很簡(jiǎn)單,就是將各個(gè)服務(wù)之間需要共享的數(shù)據(jù),保存到一個(gè)公共的地方(主流方案就是 Redis):

1 實(shí)戰(zhàn)

1.1 創(chuàng)建工程

首先 創(chuàng)建一個(gè) Spring Boot 工程,引入 Web、Spring Session 以及 Redis:

創(chuàng)建成功之后,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 ,如果使用當(dāng)前最新版 Spring Boot2.1.5的話,除了上面這些依賴之外,需要額外添加 Spring Security 依賴(其他操作不受影響,僅僅只是多了一個(gè)依賴,當(dāng)然也多了 Spring Security 的一些默認(rèn)認(rèn)證流程)。

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 了,其實(shí)就是使用普通的 HttpSession ,其他的 Session 同步到 Redis 等操作,框架已經(jīng)自動(dòng)幫你完成了:

@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;
  }
}

考慮到一會(huì) Spring Boot 將以集群的方式啟動(dòng) ,為了獲取每一個(gè)請(qǐng)求到底是哪一個(gè) Spring Boot 提供的服務(wù),需要在每次請(qǐng)求時(shí)返回當(dāng)前服務(wù)的端口號(hào),因此這里我注入了 server.port 。

接下來(lái) ,項(xiàng)目打包:

打包之后,啟動(dòng)項(xiàng)目的兩個(gè)實(shí)例:

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

然后先訪問(wèn) localhost:8080/set 向 8080 這個(gè)服務(wù)的 Session 中保存一個(gè)變量,訪問(wèn)完成后,數(shù)據(jù)就已經(jīng)自動(dòng)同步到 Redis 中 了 :

然后,再調(diào)用 localhost:8081/get 接口,就可以獲取到 8080 服務(wù)的 session 中的數(shù)據(jù):

此時(shí)關(guān)于 session 共享的配置就已經(jīng)全部完成了,session 共享的效果我們已經(jīng)看到了,但是每次訪問(wèn)都是我自己手動(dòng)切換服務(wù)實(shí)例,因此,接下來(lái)我們來(lái)引入 Nginx ,實(shí)現(xiàn)服務(wù)實(shí)例自動(dòng)切換。

1.4 引入 Nginx

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

在這段配置中:

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

配置完成后,將本地的 Spring Boot 打包好的 jar 上傳到 Linux ,然后在 Linux 上分別啟動(dòng)兩個(gè) Spring Boot 實(shí)例:

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 表示當(dāng)終端關(guān)閉時(shí),Spring Boot 不要停止運(yùn)行
  • & 表示讓 Spring Boot 在后臺(tái)啟動(dòng)

配置完成后,重啟 Nginx:

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

Nginx 啟動(dòng)成功后,我們首先手動(dòng)清除 Redis 上的數(shù)據(jù),然后訪問(wèn) 192.168.66.128/set 表示向 session 中保存數(shù)據(jù),這個(gè)請(qǐng)求首先會(huì)到達(dá) Nginx 上,再由 Nginx 轉(zhuǎn)發(fā)給某一個(gè) Spring Boot 實(shí)例:

如上,表示端口為 8081 的 Spring Boot 處理了這個(gè) /set 請(qǐng)求,再訪問(wèn) /get 請(qǐng)求:

可以看到,/get 請(qǐng)求是被端口為 8080 的服務(wù)所處理的。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringCloud使用Kafka Streams實(shí)現(xiàn)實(shí)時(shí)數(shù)據(jù)處理

    SpringCloud使用Kafka Streams實(shí)現(xiàn)實(shí)時(shí)數(shù)據(jù)處理

    使用Kafka Streams在Spring Cloud中實(shí)現(xiàn)實(shí)時(shí)數(shù)據(jù)處理可以幫助我們構(gòu)建可擴(kuò)展、高性能的實(shí)時(shí)數(shù)據(jù)處理應(yīng)用,Kafka Streams是一個(gè)基于Kafka的流處理庫(kù),本文介紹了如何在SpringCloud中使用Kafka Streams實(shí)現(xiàn)實(shí)時(shí)數(shù)據(jù)處理,需要的朋友可以參考下
    2024-07-07
  • Java連接redis及基本操作示例

    Java連接redis及基本操作示例

    這篇文章主要介紹了Java連接redis及基本操作,結(jié)合實(shí)例形式較為詳細(xì)的分析了java針對(duì)redis數(shù)據(jù)庫(kù)的基本連接、配置及操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2019-04-04
  • Spring源碼解密之默認(rèn)標(biāo)簽的解析

    Spring源碼解密之默認(rèn)標(biāo)簽的解析

    這篇文章主要給大家介紹了關(guān)于Spring源碼解密之默認(rèn)標(biāo)簽的解析的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-01-01
  • Spring Boot 整合 TKMybatis 二次簡(jiǎn)化持久層代碼的實(shí)現(xiàn)

    Spring Boot 整合 TKMybatis 二次簡(jiǎn)化持久層代碼的實(shí)現(xiàn)

    這篇文章主要介紹了Spring Boot 整合 TKMybatis 二次簡(jiǎn)化持久層代碼的實(shí)現(xiàn),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • 淺談Mybatis獲取參數(shù)值的方式

    淺談Mybatis獲取參數(shù)值的方式

    本文主要介紹了Mybatis獲取參數(shù)值的方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • 關(guān)于pom.xml中maven無(wú)法下載springcloud包問(wèn)題

    關(guān)于pom.xml中maven無(wú)法下載springcloud包問(wèn)題

    小編遇到這樣一個(gè)問(wèn)題spring-cloud-starter-feign,spring-cloud-starter-eureka 一直無(wú)法下載,maven倉(cāng)庫(kù)中包路徑顯示為unknown,怎么解決呢?下面小編給大家?guī)?lái)了pom.xml中maven無(wú)法下載springcloud包問(wèn)題,需要的朋友可以參考下
    2022-08-08
  • spring boot配置MySQL數(shù)據(jù)庫(kù)連接、Hikari連接池和Mybatis的簡(jiǎn)單配置方法

    spring boot配置MySQL數(shù)據(jù)庫(kù)連接、Hikari連接池和Mybatis的簡(jiǎn)單配置方法

    這篇文章主要介紹了spring boot配置MySQL數(shù)據(jù)庫(kù)連接、Hikari連接池和Mybatis的簡(jiǎn)單配置方法,需要的朋友可以參考下
    2018-03-03
  • Java常用數(shù)字工具類(lèi) 數(shù)字轉(zhuǎn)漢字(1)

    Java常用數(shù)字工具類(lèi) 數(shù)字轉(zhuǎn)漢字(1)

    這篇文章主要為大家詳細(xì)介紹了Java常用數(shù)字工具類(lèi),數(shù)字轉(zhuǎn)漢字,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • 詳解@Autowired(required=false)注入注意的問(wèn)題

    詳解@Autowired(required=false)注入注意的問(wèn)題

    這篇文章主要介紹了@Autowired(required=false)注入注意的問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • 詳解Java內(nèi)存溢出的幾種情況

    詳解Java內(nèi)存溢出的幾種情況

    這篇文章主要介紹了詳解Java內(nèi)存溢出的幾種情況,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06

最新評(píng)論

浪卡子县| 鄂伦春自治旗| 梁山县| 崇州市| 阳信县| 南溪县| 余姚市| 勃利县| 岗巴县| 广东省| 休宁县| 陇川县| 胶州市| 丹阳市| 凤翔县| 江达县| 大丰市| 册亨县| 潼南县| 阳东县| 新建县| 河南省| 洪洞县| 达尔| 海宁市| 南岸区| 荆州市| 禄丰县| 白河县| 靖西县| 乐东| 乌兰察布市| 桃江县| 贵定县| 太仓市| 徐州市| 龙门县| 怀仁县| 宁化县| 水富县| 南涧|