<del id="nnjnj"></del><track id="nnjnj"></track>

<p id="nnjnj"></p>

<address id="nnjnj"></address>

    <pre id="nnjnj"><pre id="nnjnj"></pre></pre>

      <noframes id="nnjnj"><ruby id="nnjnj"><ruby id="nnjnj"></ruby></ruby>

      • 自動秒收錄
      • 軟件:1973
      • 資訊:57811|
      • 收錄網站:279872|

      IT精英團

      你還不明白分布式會話怎么解決?就看這個吧!

      你還不明白分布式會話怎么解決?就看這個吧!

      瀏覽次數:
      評論次數:
      編輯: 景同
      信息來源: ITPUB
      更新日期: 2022-06-17 21:00:59
      摘要

      平常做的項目都是在一臺應用系統,并且所有的操作都在一臺Tomcat服務器上,并不會引發Session共享的問題,所以并不會對我們的系統產生影響,但是當我們部署多個微服務的時候,再搭配Nginx進行負載

      • 正文開始
      • 相關閱讀
      • 推薦作品

      平時的項目都在一個應用系統里,所有操作都在一個Tomcat服務器上,不會造成會話共享的問題,所以不會影響我們的系統。但是,當我們部署多個微服務,使用Nginx進行負載均衡時,如果不處理分布式會話問題,當我們訪問系統中的不同功能時,用戶會頻繁登錄。

      圖形分析原因:

      前提:圖中的用戶登錄功能、商品訂購模塊、搶購模塊屬于獨立的微服務模塊。

      當用戶成功登錄后想要訪問圖中另外兩個模塊的功能時,由于Nginx使用了默認的負載均衡策略(輪詢),請求會按照時間順序一個一個的分發到后端應用。也就是說,用戶在Tomcat1上登錄成功后,用戶的信息放在Tomcat1的Session中。過了一會兒,用戶想進行秒殺活動的功能操作。Nginx將請求分發到Tomcat2,但是此時Tomcat2的會話中沒有用戶信息,因此要求用戶重新登錄。在微服務分布式項目中,不同的功能模塊將被劃分到各自的微服務中。如果您需要再次登錄才能訪問某個功能,用戶的體驗將會大打折扣!

      如何解決分布式會話問題?

      一、解決方案列舉

      1. Session復制

      優點:

      不需要修改代碼,只需修改Tomcat配置缺點:.

      會話同步傳輸占用內網寬帶

      多個Tomcat的同步性能呈指數級下降。

      會話占用內存,不能有效地水平擴展。

      2. 前端存儲

      優點:

      不占用服務器內存的缺點:

      存在安全隱患。

      數據大小受cookie限制。

      占用外網寬帶

      3. Session粘滯

      優點:

      不需要修改代碼。

      服務器可以水平擴展。

      缺點:

      添加新機器將重新散列,導致重新登錄。

      應用程序重啟后,您需要再次登錄。

      4. 后端集中存儲

      優點:

      安全的

      易于水平擴展

      優點:

      增加復雜性

      代碼需要修改。

      二、Java代碼實現解決分布式Session

      1. SpringSession - Redis解決分布式Session

      添加依賴關系

      !-雷迪斯-

      屬國

      groupIdorg.springframework.boot/groupId

      artifactId spring-boot-starter-data-redis/artifactId

      /依賴關系

      !- commons-pools2對象池依賴項-

      屬國

      groupId org . Apache.commons/groupId

      artifactId commons-pool 2/artifactId

      /依賴關系

      !-春季會話依賴,微信官方賬號:精選Java-

      屬國

      groupIdorg.springframework.session/groupId

      artifactIdspring-

      session-data-redis</artifactId>
      </dependency>

      添加Redis配置

      ## Redis配置
      spring:
        redis:
          # 服務器地址
          host: localhost
          # 端口
          port: 6379
          # 數據庫
          database: 
          # 超時時間
          connect-timeout: 10000ms
          lettuce:
            pool:
              # 最大連接數
              max-active: 8
              # 最大連接阻塞等待時間 默認 -1
              max-wait: 10000ms
              # 最大空閑時間 默認8
              max-idle: 200
              # 最小空閑連接 默認8
              min-idle: 5

      業務邏輯實現

      /**
       * 登錄功能
       * @param loginVo
       * @return
       */
      @Override
      public RespBean doLogin(LoginVo loginVo, HttpServletRequest request, HttpServletResponse response) {

          String username = loginVo.getUserName();
          String password = loginVo.getPassword();

          User user = userMapper.selectByUserName(username);
          if (user == null){
              throw new GlobalException(RespBeanEnum.LOGIN_ERROR);
          }
          //判斷密碼是否正確
          if (!MDUtils.formPassToDBPass(password,user.getSalt()).equals(user.getPassword())){
              throw new GlobalException(RespBeanEnum.LOGIN_ERROR);
          }
          //使用UUID生成字符串代替Cookie
          String ticket = UUIDUtil.uuid();
          request.getSession().setAttribute(ticket,user);
          CookieUtil.setCookie(request,response,"userTicket",ticket);
          return RespBean.success();
      }

      視圖控制層

      /**
       * 跳轉商品列表
       * @param session
       * @param model
       * @return
       */
      @RequestMapping("/toList")
      public String toList(HttpSession session, Model model,@CookieValue("userTicket")String ticket){
          if (StringUtils.isEmpty(ticket)){
              return "login";
          }
          User user = (User) session.getAttribute(ticket);
          if (user == null){
              return "login";
          }
          model.addAttribute("user",user);
          return "goodsList";
      }

      登錄測試

      打開Redis管理軟件發現Session信息已經添加到Redis中了

      2. Redis解決分布式Session

      導入依賴

      <!--Redis-->
      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
      </dependency>
      <!--commons-pools2 對象池依賴-->
      <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-pool2</artifactId>
      </dependency>

      Redis配置參考 【SpringSession - Redis解決分布式Session】

      業務邏輯層

      @Override
      public RespBean doLogin(LoginVo loginVo, HttpServletRequest request, HttpServletResponse response) {

          String username = loginVo.getUserName();
          String password = loginVo.getPassword();

          User user = userMapper.selectByUserName(username);
          if (user == null){
              throw new GlobalException(RespBeanEnum.LOGIN_ERROR);
          }
          //判斷密碼是否正確
          if (!MDUtils.formPassToDBPass(password,user.getSalt()).equals(user.getPassword())){
              throw new GlobalException(RespBeanEnum.LOGIN_ERROR);
          }
          //成功Cookie
          String ticket = UUIDUtil.uuid();
          //將用戶信息存入到redis中
          redisTemplate.opsForValue().set("userTicket",ticket);
          redisTemplate.opsForValue().set("user:"+ticket,user);
          //request.getSession().setAttribute(ticket,user);
          CookieUtil.setCookie(request,response,"userTicket",ticket);
          return RespBean.success();
      }

      /**
       * 根據cookie獲取cookie
       * @param ticket
       * @return
       */
      @Override
      public User getUserByByCookie(String ticket,HttpServletRequest request,HttpServletResponse response) {
          if (StringUtils.isEmpty(ticket)){
              return null;
          }
          User user = (User) redisTemplate.opsForValue().get("user:" + ticket);
          if (user == null){
              CookieUtil.setCookie(request,response,"userTicket",ticket);
          }
          return user;
      }

      視圖控制層

      /**
       * 跳轉商品列表
       * @param session
       * @param model
       * @return
       */
      @RequestMapping("/toList")
      public String toList(HttpSession session, Model model,HttpServletRequest request,HttpServletResponse response){
          String ticket = (String) redisTemplate.opsForValue().get("userTicket");
          if (StringUtils.isEmpty(ticket)){
              return "login";
          }
          //User user = (User) session.getAttribute(ticket);
          User user = userService.getUserByByCookie(ticket, request, response);
          if (user == null){
              return "login";
          }
          model.addAttribute("user",user);
          return "goodsList";
      }

      測試成功

      查看Redis管理工具

      vivo集裝箱集群監控系統的架構與實踐
      ? 上一篇 2022-06-17
      Arch Linux超越Ubuntu成功登頂
      下一篇 ? 2022-06-17
      • 如何在Ubuntu中保留文件系統并備份當前開發板鏡像
        0閱讀 0條評論 個贊
        在Ubuntu保留文件系統或者說備份當前開發板鏡像的需求在不斷增加。比如Ubuntu文件系統需要安裝庫文件的話直接使用apt-get工具就可以下載,但由于需要下載的核心板較多,比較費時間,這時需要將安……
      • 國產核心板全志T507助力消防系統升級
        0閱讀 0條評論 個贊
        9月16日下午,位于湖南長沙市區內的中國電信大樓發生火災,建筑高度218米,現場濃煙滾滾,數十層樓體燃燒劇烈。消防救援人員趕到現場后很快將火勢控制住,目前大樓火勢已被撲滅,所幸未發現人員傷亡。湖南電信……
      • 教大家如何處理Spring Boot易流中的用戶和群體!
        0閱讀 0條評論 個贊
        1.準備工作2.用戶操作2.1添加用戶2.2修改用戶2.3刪除用戶2.4查詢用戶3.組操作3.1添加組3.2修改組3.3刪除組3.4查詢組4.查看表詳情雖然說我們在實際開發中,……
      • 從PG15開始WAL壓縮優化
        0閱讀 0條評論 個贊
        PG15傳聞中的超級令人激動的功能大多數跳票了,年初我也寫過一個關于PG15新功能跳票的文章。PG15BETA已經發出幾個月了,似乎PG15里令人激動人心的功能不多,不過從長長的新功能列表里,……
      • 深入了解美團葉子發射器開源方案
        0閱讀 0條評論 個贊
        大家好,我是樹哥。之前我們有聊過「如何設計一個分布式ID發號器」,其中有講過4種解決方案,分別是:UUID類雪花算法數據庫自增主鍵Redis原子自增美團以第2、3種解決方案為基礎,開發出……
      發表評論 共有條評論
      用戶名: 密碼:
      驗證碼: 匿名發表
      • 關于Redis在windows上運行的問題和fork函數
        0閱讀 0條評論 個贊
        Redis在將數據庫進行持久化操作時,需要fork一個進程,但是windows并不支持fork,導致在持久化操作期間,Redis必須阻塞所有的客戶端直至持久化操作完成。微軟的一些工程師花費時間在解決在……
      • Java內存區(運行時數據區)簡介
        0閱讀 0條評論 個贊
        Java虛擬機在執行Java程序的過程中會把它管理的內存劃分成若干個不同的數據區域。JDK1.8和之前的版本略有不同。下圖是JDK1.8對JVM做的改動,把方法區的具體實現----元空……
      • 網純原生實現時間單位定時任務執行,未依賴第三方組件
        0閱讀 0條評論 個贊
        常用的定時任務組件有Quartz.Net和Hangfire兩種,這兩種是使用人數比較多的定時任務組件,個人以前也是使用的Hangfire,慢慢的發現自己想要的其實只是一個能夠根據Cron……
      • [PostgreSql]生產級數據庫安裝需要考慮哪些問題?
        0閱讀 0條評論 個贊
        大家好,我是字母哥(coder)!我讓公司的小伙伴寫一個生產級別的PostgreSQL的安裝文檔,結果他和我說:“不是用一個命令就能安裝好么?還用寫文檔么?”。我知道他想說的是這個命令:yumins……
      • Hadoop(簡介)大數據技術概述 運行環境構建 運行模式
        0閱讀 0條評論 個贊
        文章目錄1Hadoop概述1.1Hadoop是什么1.2Hadoop優勢1.3Hadoop組成(面試重點)1.3.1HDFS架構概述1.3.2YARN架構概述1.3.3Map……
      • 淺談SQL Server中統計對查詢的影響
        4閱讀 0條評論 個贊
        簡介SQLServer查詢分析器是基于開銷的。通常來講,查詢分析器會根據謂詞來確定該如何選擇高效的查詢路線,比如該選擇哪個索引。而每次查詢分析器尋找路徑時,并不會每一次都去統計索引中包含的行數,值……
      • k8s網絡持久存儲的StorageClass(如何一步步實現動態持久存儲)
        0閱讀 0條評論 個贊
        StorageClass的作用:創建pv時,先要創建各種固定大小的PV,而這些PV都是手動創建的,當業務量上來時,需要創建很多的PV,過程非常麻煩。而且開發人員在申請PVC資源時,還不一定有匹配條件的……
      • 2022數字技能職業教育生態研討會
        9閱讀 0條評論 個贊
        職業教育是國民教育體系和人力資源開發的重要組成部分。發展職業教育,已經成為世界各國應對經濟、社會、人口、環境、就業等方面挑戰,實現可持續發展的重要戰略選擇。中國職業教育源遠流長,師徒制教學有著悠久的……
      • SQLServer自動化運維系列監控磁盤剩余空間和SQLServer錯誤日志(PowerShell)
        0閱讀 0條評論 個贊
        需求描述在我們的生產環境中,大部分情況下需要有自己的運維體制,包括自己健康狀態的檢測等。如果發生異常,需要提前預警的,通知形式一般為發郵件告知。在所有的自檢流程中最基礎的一個就是磁盤剩余空間檢測。作為……
      • 二戰MySQL數據庫【升華】
        0閱讀 0條評論 個贊
        MYSQL入門系列——第二篇1.篩選條件:(1)比較運算符:(2)邏輯運算符:(3)其他操作:1.排序:2.限制:拓展:3.去重:4.模糊查詢:(like'%')5.范圍查詢:2.聚合與分組(重點……
      • 與docker卷一起安裝的注意事項
        0閱讀 0條評論 個贊
        目錄Content使用數據卷(volume)使用掛載點(共享宿主目錄,bindmount)目錄兼容性可移植性目錄替代相關指定位置--volume與--mount區別鏡像保存docker-compos……
      • spring接口有多個實現類 應該給哪個注入這個依賴?
        0閱讀 0條評論 個贊
        一、問題的描述在實際的系統應用開發中我經常會遇到這樣的一類需求,相信大家在工作中也會經常遇到:同一個系統在多個省份部署。一個業務在北京是一種實現方式,是基于北京用戶的需求。同樣的業務在上海是另外一種實……
      • 公司排班系統遇到瓶頸?我自己造一個!
        10閱讀 0條評論 個贊
        本期名人堂我們有幸邀請到了白鯨開源的聯合創始人代立冬先生。代立冬先生與我們分享了自己社區開源的經歷,詳細介紹了一個開源項目是如何加入Apache孵化器,如何在導師的輔導下慢慢孵化、成長的過程,以及自己……
      • 三萬字肝爆《數據倉庫體系》
        0閱讀 0條評論 個贊
        文章很長,前言一定要看擁有本篇文章,意味著你擁有一本完善的書籍,本篇文章整理了數據倉庫領域,幾乎所有的知識點,文章內容主要來源于以下幾個方面:源于「數據倉庫交流群」資深數據倉庫工程師的交流討論,如《s……
      • 關于這個能見度的例子 網上95%的文章都是錯的!
        0閱讀 0條評論 個贊
        你好,我是坤哥上周我在查閱資料時無意中搜到一篇解釋volatile用法的博文,這篇博文排得很靠前,不過很遺憾,雖然結論是對的,但分析過程完全錯誤,而且我發現網上很多文章都用這個例子來解釋vola……
      • 在一本書中閱讀所有的Hive Sql(20 000字的最完整解釋)
        0閱讀 0條評論 個贊
        HiveSql大全本文基本涵蓋了Hive日常使用的所有SQL,因為SQL太多,所以將SQL進行了如下分類:一、DDL語句(數據定義語句):對數據庫的操作:包含創建、修改數據庫對數據表的操作:分……
      • 在頭腦中扎根泛型的思想3354深刻理解泛型
        0閱讀 0條評論 個贊
        1.前言往往一些剛接觸C#編程的初學者,對于泛型的認識就是直接跳到對泛型集合的使用上,雖然微軟為我們提供了很多內置的泛型類型,但是如果我們只是片面的了解調用方式,這會導致我們對泛型盲目的使用。至于為什……
      • 從PG15開始WAL壓縮優化
        0閱讀 0條評論 個贊
        PG15傳聞中的超級令人激動的功能大多數跳票了,年初我也寫過一個關于PG15新功能跳票的文章。PG15BETA已經發出幾個月了,似乎PG15里令人激動人心的功能不多,不過從長長的新功能列表里,……
      • Oracle服務器遷移的一些經驗
        3閱讀 0條評論 個贊
        前言通過此文章來分享一下Oracle服務器遷移過程中的一些經驗,希望對大家有些許幫助。本文旨在幫助更多的同學,會提及一些基本命令或技巧,但不贅述,后續有機會再進一步分享各個細節。背景之前因機房遷移……
      • 【MySQL】DDL因正在等待表元數據鎖定卡住
        0閱讀 0條評論 個贊
        在數據庫空閑時間,對表做碎片整理:1altertablemy_abcengine=innodb;發現會話被阻塞,顯示狀態是:1Waitingfortablemetadatalock手動斷開alte……
      • Linux環境程序如何運行?
        0閱讀 0條評論 個贊
        .css-1yuhvjn{margin-top:16px;}.css-3jt6os.FileLinkCard{-webkit-align-items:center;-webkit-box-align……
      • 五家金融子公司上半年業績公布:招行凈利潤20.66億元 平安賺錢能力不及南銀和尹航
        0閱讀 0條評論 個贊
        從幾家數據來看,招銀理財賺錢能力最強,上半年凈賺20.66億元。值得關注的是,杭銀理財上半年凈利潤實現大幅增長,凈利潤超中郵理財、南銀理財、平安理財。而平安理財在幾家理財子公司中業績墊底,上半年凈利潤下滑超50%。平安理財凈利同比下滑超50%?!?/div>
      • 唐山燒烤店打人案最新進展:28人被起訴 8把傘被保留
        0閱讀 0條評論 個贊
        河北省紀委監委組織協調唐山、廊坊、衡水等地紀委監委對15名相關人員立案審查調查,其中對唐山市路北區政府黨組成員、副區長,市公安局路北分局黨委書記、局長馬愛軍及唐山市公安局路北分局機場路派出所所長胡斌、長虹道警務站副站長韓志勇、機場路派出所民警陳志偉、光明里派出所原所長范立峰、光明里派出所副所長王洪偉、喬屯派出所副所長王志鵬、唐山市公安局交警支隊四級警長安迪等8名公職人員采取留置措施,初步查出了違紀違法及涉嫌濫用職權、徇私枉法、行賄、受賄等職務犯罪問題。紀檢監察機關將深挖徹查,依紀依法嚴肅處理?!?/div>
      • 糾結任《寒冬論》本身 都是精神內耗
        0閱讀 0條評論 個贊
        這幾天,任正非的講話在持續地刷屏,不少企業家非常關心未來的經濟形勢。有人覺得未來太悲觀了,任正非說未來十年都是非常痛苦的歷史時期,全球經濟會持續……
      • 先買后付的虧損背后:收入放緩 支出增加 即使拋開不良貸款相關的費用
        1閱讀 0條評論 個贊
        總部位于斯德哥爾摩的金融科技公司Klarna Holdings本周早些時候公布的業績讓人們得以一窺“先買后付”這一行業的內幕。一個主要的結論是:成本的增長速度一直高于收入的增長速度,即使不包括與不良貸款相關的費用?!?/div>
      • 銀監會:進一步加強消費金融公司投訴整治
        0閱讀 0條評論 個贊
        銀保監會官網發布《中國銀保監會辦公廳關于進一步加強消費金融公司和汽車金融公司投訴問題整治的通知》?!?/div>
      • 拼多多在疫情中成為股市大贏家:過去一個月股價暴漲超40%
        0閱讀 0條評論 個贊
        隨著中國消費者在受疫情影響的經濟中抑制支出,一家折扣電子商務公司正在成為股市的明顯贏家?!?/div>
      • 凱姬曉金上半年凈利潤5800萬元;累計貸款353.7億元 客戶數超過200萬
        1閱讀 0條評論 個贊
        江蘇銀行發布2022年半年報披露了蘇銀凱基消費金融有限公司和蘇銀理財有限責任公司的經營情況。半年報顯示,報告期末,蘇銀凱基消金貸款余額182.01億元,當年累計放款353.70億元,凈利潤0.58億元?!?/div>
      • 14天賺2500萬 一只羊做了一個測試人性的營銷實驗
        0閱讀 0條評論 個贊
        很難想象,一款籍籍無名,甚至連個版號都沒有的微信小游戲,竟然能在一夜之間成為全國人民討論關注的對象?!?/div>
      • 記錄在線超時的分析和故障排除過程
        0閱讀 0條評論 個贊
        .css-1yuhvjn{margin-top:16px;}.css-3jt6os.FileLinkCard{-webkit-align-items:center;-webkit-box-align……
      • 南京銀行“雷爆”傳聞穩定 管理有方
        0閱讀 0條評論 個贊
        南京銀行9月4日晚間發布澄清公告稱,經了解,此次在該行杭州分行轄內個別網點門前出現的聚集人員為有關村鎮銀行大額資金客戶,相關聚集圖片在社交網絡流傳,引發社會關注。該行前期已就代理村鎮銀行資金清算業務發布說明,現就有關事項進一步作出聲明?!?/div>
      • c#異步高級————通道[1]
        0閱讀 0條評論 個贊
        前言該系列為異步編程的進階篇,其實也不能這么講。世界上本沒有進階篇,只能說是高級篇(高級篇不能說多高級,是對底層的封裝的意思),只要是加深理解都是進階。本章先介紹一下channel。正文下面沒什么好說……
      • 卡夫卡數據丟失問題優化總結及重復消費原因分析(二)
        0閱讀 0條評論 個贊
        .css-1yuhvjn{margin-top:16px;}.css-3jt6os.FileLinkCard{-webkit-align-items:center;-webkit-box-align……
      • 保險備份 100億美元出售 海洋上半年虧損
        0閱讀 0條評論 個贊
        躲過了“違約”,卻沒能躲過“虧損”。作者 | 盧泳志編輯丨高巖來源 | 野馬財經背靠兩大“國姓”險資股東,遠洋集團(3377.HK)上半年保持了……
      • 攜程戰略發展部副總裁周世偉因個人原因辭去途牛董事職務
        0閱讀 0條評論 個贊
        途牛(NASDAQ:TOUR)宣布,公司董事周世偉因個人原因從公司董事會辭職,于2022年8月31日生效,他的辭職并不是因為與公司有任何分歧?!?/div>
      • 杭州銀行董事長陳振山因組織調動辭職
        0閱讀 0條評論 個贊
        杭州銀行發布公告,公司董事會于2022年9月9日收到陳震山先生的辭職信,陳震山先生因組織調動原因,提出辭去公司董事長、執行董事和董事會戰略發展委員會委員及公司其他職務。辭任后,陳震山先生將不再擔任公司任何職務。陳震山先生確認,其與公司董事會無不同意見,也沒有就其辭職需要知會公司股東及債權人的任何事項?!?/div>
      • SQL Server備份和還原攻略
        0閱讀 0條評論 個贊
        一、知識點完全備份:備份全部選中的文件夾,并不依賴文件的存檔屬性來確定備份那些文件。(在備份過程中,任何現有的標記都被清除,每個文件都被標記為已備份,換言之,清除存檔屬性)。完全備份也叫完整備份。差異……
      • 百度SEO和SEM的區別?
        0閱讀 0條評論 個贊
        對于試圖吸引客戶,提高網站流量并在市場發展業務的品牌來說,百度搜索優化是一項至關重要的營銷策略。但是,如果您不知道如何區分百度SEM和百度SEO,搜索優化無法帶來轉化。要在百度營銷中取得真正的成功……
      • 目前的網站排名可以從哪些方面提高?
        0閱讀 0條評論 個贊
        百度是中國領先的搜索引擎,市場份額為80%。它每天估計收到33億次查詢,僅次于Google,每天估計有35億次查詢。毫無疑問,在百度搜索引擎上排名靠前可以對您公司的網絡流量和收入產生影響?!?/div>
      • Godivan中秋禮盒標價超500元 聲稱不是月餅 引發爭議 抽檢不合格
        0閱讀 0條評論 個贊
        出品:創業最前線8月26日消息,據《中國消費者報》報道,國外巧克力品牌歌帝梵近期在中國市場推出了中秋系列禮盒,他們禮盒中的產品與月餅形狀十分類似……
      最近發布資訊
      更多
      警花高潮嗷嗷叫
      <del id="nnjnj"></del><track id="nnjnj"></track>

      <p id="nnjnj"></p>

      <address id="nnjnj"></address>

        <pre id="nnjnj"><pre id="nnjnj"></pre></pre>

          <noframes id="nnjnj"><ruby id="nnjnj"><ruby id="nnjnj"></ruby></ruby>