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

springboot集成springsession如何實現(xiàn)分布式session共享

 更新時間:2023年09月21日 09:15:30   作者:愛琴孩  
這篇文章主要介紹了springboot集成springsession如何實現(xiàn)分布式session共享問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

前言

現(xiàn)在隨著分布式,微服務(wù)架構(gòu)的日益成熟,越來越多的企業(yè)將傳統(tǒng)的單體服務(wù)改造成微服務(wù)或者分布式架構(gòu)。

當(dāng)然不是說單體服務(wù)現(xiàn)在是百無一用,只能說沒有最好的,只要適合就好。

在分布式服務(wù)改造中,大家都遇到過一個問題,那就是分布式session管理。

之前的單體服務(wù)session是保存在容器的內(nèi)存中的。

微服務(wù)架構(gòu)中一個服務(wù)為了實現(xiàn)高可用都是至少3個點部署,這樣就遇到一個問題,就是這個部署在不同服務(wù)器上的三個點如何實現(xiàn)共享session呢?

其實解決方案是很多的,原理也是差不多的。比如說我們現(xiàn)在項目就是將session保存在數(shù)據(jù)庫中,這樣三個點都去讀取數(shù)據(jù)庫來實現(xiàn)session共享。

還有的方案就是大家比較熟悉的將session存儲在redis中,而且redis支持key設(shè)置過期時間,這個和用戶會話的過期就不謀而合了。

只不過傳統(tǒng)的集成方案需要我們手動的將session存儲在redis中,然后再在redis中讀取,這種方式操作起來可能比較重復(fù)繁瑣。

所以spring已經(jīng)在spring全家桶中提供了分布式session共享集成方案,就是標(biāo)題中所說的springsession。

這里基于springboot來搭建個入門demo,以便大家快速了解springsession。

集成springsession之前

這里簡單搭建了兩個服務(wù)client1和cilent2,我們在這連個服務(wù)中提供兩個接口,如下

/**
 * @author 蔣墨風(fēng)
 * @title: SpringSessionController
 * @projectName client1
 * @description: 測試spring session功能
 * @date 2019/10/27 16:11
 */
@RequestMapping("/springSessionTest")
@RestController
public class SpringSessionController {
    @RequestMapping(value = "/test", method = RequestMethod.GET)
    public Map<String, Object> firstResp (HttpServletRequest request){
        Map<String, Object> map = new HashMap<>();
        request.getSession().setAttribute("request Url", request.getRequestURL());
        map.put("request Url", request.getRequestURL());
        return map;
    }
    @RequestMapping(value = "/sessions", method = RequestMethod.GET)
    public Object sessions (HttpServletRequest request){
        Map<String, Object> map = new HashMap<>();
        map.put("sessionId", request.getSession().getId());
        map.put("message", request.getSession().getAttribute("request Url"));
        return map;
    }
}

client2中的接口和client1代碼是一樣的,這里就不重復(fù)粘貼了。

兩個服務(wù)的端口分別是9002和9003。這里我們把兩個服務(wù)啟動成功之后,我們先訪問client1的test接口,然后在訪問client1中sessions接口來看下具體session打印。

client1中的sessions接口響應(yīng)如下

{
"sessionId":"6C3E8502E1DFA9FB5595D8EEE848A900",
"message":"http://localhost:9002/springSessionTest/test"
}

接下來我們依次訪問client2接口中的test接口和sessions接口,得到的響應(yīng)如下

{
"sessionId":"B6DEB7D49CCA3AA239FA593555605C4B",
"message":"http://localhost:9003/springSessionTest/test"
}

可以看到兩個session是相互獨立的。

集成springsession之后

首先我們在兩個服務(wù)中引入相關(guān)的依賴

<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>
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
 </dependency>

然后在配置文件中加上redis配置

spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.database=3
spring.redis.password=12345
spring.redis.timeout=5000

再在兩個服務(wù)的啟動類上加上@EnableRedisHttpSession注解,開啟spring session功能,兩個服務(wù)正常啟動之后,重復(fù)上面操作,先訪問client1的test和sessions接口,接口響應(yīng)如下

{
"sessionId":"5fdd9b56-70ab-4722-81f6-8c4af721a1e6",
"message":"http://localhost:9002/springSessionTest/test"
}

接下來我們再訪問client2服務(wù)中的test,sessions接口,接口響應(yīng)如下

{
"sessionId":"5fdd9b56-70ab-4722-81f6-8c4af721a1e6",
"message":"http://localhost:9003/springSessionTest/test"
}

可以看到兩個sessionId是一樣的,所以client1和client2的共享session是實現(xiàn)了的,網(wǎng)上好多小伙伴說,你這種實現(xiàn)方式是兩個服務(wù)部署在同一臺機器上,如果把兩個服務(wù)分別部署在兩臺機器上,上面的測試效果就不是這樣了,如果遇到這種情況的小伙伴可能需要確認下自己測試的兩臺機器上的時間是不是一致,如果不是的話,就可能會導(dǎo)致上面的測試失敗。

總結(jié)

上面只是簡單的演示了下兩個服務(wù)集成springsession之前和之后的效果,具體springsession的原理,后面結(jié)合springsession源碼來和大家一起學(xué)習(xí),這里springsession集成了redis,用redis做session存儲,當(dāng)然我們也可以使用其他的存儲,不局限于redis。

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 一文詳解Elasticsearch和MySQL之間的數(shù)據(jù)同步問題

    一文詳解Elasticsearch和MySQL之間的數(shù)據(jù)同步問題

    Elasticsearch中的數(shù)據(jù)是來自于Mysql數(shù)據(jù)庫的,因此當(dāng)數(shù)據(jù)庫中的數(shù)據(jù)進行增刪改后,Elasticsearch中的數(shù)據(jù),索引也必須跟著做出改變。本文主要來和大家探討一下Elasticsearch和MySQL之間的數(shù)據(jù)同步問題,感興趣的可以了解一下
    2023-04-04
  • Java 實戰(zhàn)范例之員工管理系統(tǒng)的實現(xiàn)

    Java 實戰(zhàn)范例之員工管理系統(tǒng)的實現(xiàn)

    讀萬卷書不如行萬里路,只學(xué)書上的理論是遠遠不夠的,只有在實戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+vue+Springboot+ssm+mysql+maven+redis實現(xiàn)一個前后端分離的員工管理系統(tǒng),大家可以在過程中查缺補漏,提升水平
    2021-11-11
  • SpringBoot4.0新特性Resilience之并發(fā)限制詳解

    SpringBoot4.0新特性Resilience之并發(fā)限制詳解

    本文給大家介紹SpringBoot4.0新特性Resilience之并發(fā)限制的相關(guān)知識,本文結(jié)合實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2026-01-01
  • Java生態(tài)中的NLP框架詳解

    Java生態(tài)中的NLP框架詳解

    Java生態(tài)系統(tǒng)中提供了多個強大的自然語言處理(NLP)框架,今天通過本文給大家介紹Java生態(tài)中的NLP框架,感興趣的朋友一起看看吧
    2025-06-06
  • JavaWeb中的路徑問題解讀

    JavaWeb中的路徑問題解讀

    這篇文章主要介紹了JavaWeb中的路徑問題解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • Spring實戰(zhàn)之方法級別緩存用法示例

    Spring實戰(zhàn)之方法級別緩存用法示例

    這篇文章主要介紹了Spring實戰(zhàn)之方法級別緩存用法,結(jié)合實例形式分析了spring方法級別緩存配置、屬性文件、領(lǐng)域模型及相關(guān)使用技巧,需要的朋友可以參考下
    2020-01-01
  • 解決MyEclipse6.5無法啟動,一直停留剛開始啟動界面的詳解

    解決MyEclipse6.5無法啟動,一直停留剛開始啟動界面的詳解

    本篇文章是對解決MyEclipse6.5無法啟動,一直停留剛開始啟動界面的方法進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • springboot運行jar生成的日志到指定文件進行管理方式

    springboot運行jar生成的日志到指定文件進行管理方式

    這篇文章主要介紹了springboot運行jar生成的日志到指定文件進行管理方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • SpringBoot中MVC的自動配置詳解

    SpringBoot中MVC的自動配置詳解

    這篇文章主要介紹了SpringBoot中MVC的自動配置詳解,在實際開發(fā)過程中,還有一些老的系統(tǒng)在使用xml格式來傳輸數(shù)據(jù),SpringBoot也提供了xml格式數(shù)據(jù)的返回,只需要小小的改動,就可以實現(xiàn),需要的朋友可以參考下
    2023-09-09
  • 解決若依pageHelper在動態(tài)切換數(shù)據(jù)源問題

    解決若依pageHelper在動態(tài)切換數(shù)據(jù)源問題

    這篇文章主要介紹了解決pageHelper在動態(tài)切換數(shù)據(jù)源問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01

最新評論

黎平县| 白山市| 安溪县| 收藏| 沐川县| 望谟县| 叙永县| 吕梁市| 马鞍山市| 怀安县| 于田县| 湘乡市| 崇左市| 兴和县| 金沙县| 勐海县| 日照市| 汝阳县| 乌拉特后旗| 博湖县| 西城区| 蒙阴县| 南陵县| 阿图什市| 汉源县| 康马县| 南靖县| 永丰县| 谢通门县| 吉隆县| 图们市| 新建县| 广汉市| 莲花县| 梁平县| 清苑县| 抚顺县| 阳朔县| 济宁市| 玉溪市| 尚志市|