日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

詳解Java分布式系統中session一致性問題

瀏覽:158日期:2022-08-13 18:41:35
業務場景

在單機系統中,用戶登陸之后,服務端會保存用戶的會話信息,只要用戶不退出重新登陸,在一段時間內用戶可以一直訪問該網站,無需重復登陸。用戶的信息存在服務端的 session 中,session中可以存放服務端需要的一些用戶信息,例如用戶ID,所屬公司companyId,所屬部門deptId等等。

詳解Java分布式系統中session一致性問題

但是隨著業務的發展,技術架構需要調整,原來的單機系統逐漸被更換,架構由單機擴展到分布式,甚至當下流行的微服務。雖然在用戶端看來系統仍然是一個整體,但在技術端來說業務則被拆分成多個模塊,各個模塊之間相互獨立,甚至不在同一臺物理機器上,模塊之間通過 RPC 進行通信。

詳解Java分布式系統中session一致性問題

那么原來單機只需一份的 session, 如何滿足在多系統的運行下保證會話一致性呢?單獨保存在任何一個系統中都不合適,而且每個單獨模塊系統也可能是分布式形式的,是由集群組成。那么session的分配就更復雜了。

Redis 實現

針對以上問題,我們可能會從以下幾個方面想到解決的方法,每個服務端存儲一份,通過同步的方式保證一致性,但是這種方式有個很明顯的缺點:session的同步需要數據傳輸,占內網帶寬,有時延,網絡不穩定的時候會造成部分系統同步延遲,那么就不能保證 session 一致性。而且所有服務端都包含所有session數據,數據量受內存限制,無法水平擴展。

那么我們是否可以單獨將 session 信息存儲在某一個獨立的介質中,介質可以是DB也可以是緩存。

考慮到如下業務:登陸的時候我們經常會給用戶一個過期時間(一般移動端常設置為7天或者一個月甚至更久),到期后用戶需要輸入登陸信息重新登陸,即會話過期。這種到期的設置我們自然想到了Redis的 key expire功能,所以最終我們可以將Redis引入進來實現我們的這種需求。系統如下圖所示:

詳解Java分布式系統中session一致性問題

我們只需在用戶首次登陸的時候將用戶信息放到 Token并緩存到 Redis 中,同時設置一個過期時間,偽代碼如下:

@Overridepublic Map login(UserDto dto) { Map<String, Object> restMap = new HashMap<>();// 校驗登陸信息 User user = checkLoginInfo(dto); //刪除舊的token String token = (String) redisUtils.get(CacheConstants.USER_TOKEN_KEY_COPY + user.getUserName());if (!ObjectUtils.isEmpty(token)) {redisUtils.delete(CacheConstants.USER_TOKEN_KEY_WEB + token); } // 唯一簽名信息 String signStr = user.getCompanyId() + user.getUserName() + dto.getPassword() + DateUtils.now().getTime(); token = MD5Utils.md5(signStr); // 設置用戶 token redisUtils.setExpiredAt(CacheConstants.USER_TOKEN_KEY_WEB + token, user.getId(), LOGIN_EXPIRED_TIME); //緩存新的token redisUtils.setExpiredAt(CacheConstants.USER_TOKEN_KEY_COPY + user.getUserName(), token, LOGIN_EXPIRED_TIME); dto.setCompanyId(user.getCompanyId()); dto.setId(user.getId()); restMap.put('token', token); restMap.put('userName', user.getUserName()); return restMap;}

那么在系統中如何使用呢,我們可以定義一個攔截器 SessionInterceptor,當訪問 web 接口的時候檢驗用戶的 token 信息,判斷用戶是否登陸,未登錄的情況下一些業務接口是無法訪問的,以及在登陸的情況下拿到我們需要的用戶信息,如 userId。

public class SessionInterceptor { @Autowired private RedisUtils redisUtils;@Autowired private UserService userService; @Pointcut('execution(* com.jajian.demo.web.*.controller.*.*(..)) && @annotation(org.springframework.web.bind.annotation.RequestMapping)') public void controllerMethodPointcut() { } @Around('controllerMethodPointcut()') public Object Interceptor(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {Signature signature = proceedingJoinPoint.getSignature();MethodSignature methodSignature = (MethodSignature) signature;Method targetMethod = methodSignature.getMethod();if (targetMethod.getDeclaringClass().isAnnotationPresent(NoLogin.class) || targetMethod.isAnnotationPresent(NoLogin.class)) { return proceedingJoinPoint.proceed();}// 從獲取RequestAttributes中獲取HttpServletRequest的信息RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();HttpServletRequest request = (HttpServletRequest) requestAttributes.resolveReference(RequestAttributes.REFERENCE_REQUEST);String token = request.getHeader('token');if(StringUtils.isEmpty(token)){ Log.debug('驗證token', 'token驗證失敗,{}', 'token不存在'); throw new FieldException(Constants.LOGIN_ERROR_CODE, 'login.session.timeout');}Integer userId= (Integer)redisUtils.get(CacheConstants.USER_TOKEN_KEY_WEB + token); if (null == userId) { Log.debug('驗證token', 'token驗證失敗,{}', 'token超時'); throw new FieldException(Constants.LOGIN_ERROR_CODE, 'login.session.timeout');}User user = userService.getById(userId.longValue());if (ObjectUtils.isEmpty(user)){ Log.debug('驗證token', 'token驗證失敗,{}', '用戶信息不存在'); throw new FieldException(Constants.LOGIN_ERROR_CODE, 'login.session.timeout');}if (user.getStatus() == UserStatusEnum.NO.getCode() || user.getDeleteFlag() == DeleteFlagEnum.YES.getCode()){ Log.debug('驗證token', 'token驗證失敗,用戶信息異常 userName : {}, status : {},deleteFlag : {}', user.getUserName(),user.getStatus(), user.getDeleteFlag()); throw new FieldException(Constants.LOGIN_ERROR_CODE, 'login.session.timeout');}return proceedingJoinPoint.proceed(); } }

以上實現方式簡單易用,而且Redis 在分布式系統中的使用率也很高,所以無需額外的技術引入。可以支持水平擴展,數據庫或緩存水平切分即可,服務端重啟或者擴容都不會有session丟失的情況發生。

以上就是詳解Java分布式系統中session一致性問題的詳細內容,更多關于Java分布式系統的資料請關注好吧啦網其它相關文章!

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久国产免费看| 久久国产精品免费一区二区三区| 国产+成+人+亚洲欧洲在线| 国产精品久久久久久久久久10秀 | 日韩一区二区三区精品视频第3页| 日韩国产在线不卡视频| 国产福利一区二区三区在线播放| 欧美二三四区| 视频一区欧美精品| 欧美日韩一区二区三区四区在线观看 | 国产美女精品| 亚洲久久视频| 精品亚洲精品| 香蕉国产精品| 日本午夜精品视频在线观看| 久久久久久色 | 精品视频高潮| 国产在线欧美| 欧美片第1页综合| 国产在线看片免费视频在线观看| 亚洲综合三区| 国产精品久久久久久av公交车| 日韩中文在线电影| 亚洲人亚洲人色久| 亚洲国产欧美日本视频| 美日韩精品视频| 麻豆成人91精品二区三区| 91精品99| 久久精品国内一区二区三区| 日韩一区二区久久| 国际精品欧美精品| 亚洲一区二区三区高清| 国产精品激情| 亚洲少妇在线| 日本久久综合| 视频在线观看一区二区三区| 国产一区二区三区久久久久久久久| 伊人精品在线| 国内一区二区三区| 亚洲91网站| 亚洲风情在线资源| 日韩黄色av| 国产一区视频在线观看免费| 欧美国产先锋| 亚洲一区欧美| 久久在线视频免费观看| 国产精品久久久久久久久久久久久久久 | 久久国产毛片| 免费在线欧美黄色| 美女国产一区| av在线最新| 国产剧情一区| 蜜桃视频一区二区| 国产99久久| 色欧美自拍视频| **爰片久久毛片| 免费精品视频| 香蕉久久99| 国产成人精品一区二区免费看京 | 欧美成人a交片免费看| 欧美另类中文字幕| 亚洲经典在线| 蜜桃av在线播放| 精品一区av| 久久国产三级| 亚洲乱码久久| 99国产精品私拍| 久久久久午夜电影| 国产精品成人a在线观看| 欧美日韩亚洲一区在线观看| 在线看片日韩| 视频一区欧美精品| 亚洲综合电影一区二区三区| 久久精品国产68国产精品亚洲| 国产一区二区三区四区| 狂野欧美性猛交xxxx| 日韩欧美三区| 蜜臀av亚洲一区中文字幕| 91高清一区| 欧美亚洲国产激情| 特黄毛片在线观看| 欧美激情另类| 精品少妇一区| 国产一区2区| 麻豆视频观看网址久久| 欧美日韩 国产精品| 日本综合精品一区| 亚洲精品乱码日韩| 亚洲日本欧美| 亚洲免费资源| 日韩av一二三| 亚洲精品女人| 一区二区三区午夜视频| 中国女人久久久| 亚洲成人三区| 黄色亚洲免费| 老牛国产精品一区的观看方式| 中文久久精品| 丝袜脚交一区二区| 丝袜脚交一区二区| 蜜臀va亚洲va欧美va天堂| 日韩中文字幕区一区有砖一区| 亚洲一区日本| 免费视频最近日韩| 日韩一区网站| 国产情侣一区在线| 国产伦一区二区三区| 国产精品观看| 国产在线不卡一区二区三区 | 日本三级亚洲精品| 国产日产精品_国产精品毛片 | jizzjizz中国精品麻豆| 成人午夜国产| 九九在线精品| 亚洲免费在线| 日本伊人午夜精品| 国产精品任我爽爆在线播放| 久久成人福利| 国产一二在线播放| 亚洲国产专区校园欧美| 一区久久精品| 日韩精品免费视频人成 | 99久久夜色精品国产亚洲狼 | 超碰99在线| japanese国产精品| 免费人成黄页网站在线一区二区| 亚洲图片久久| 国产精品丝袜在线播放| 成午夜精品一区二区三区软件| 久久毛片亚洲| 亚洲精品1区2区| 91欧美日韩在线| 精品欧美日韩精品| 日韩精品一区二区三区免费观看| 一区在线免费| 亚洲男人在线| 美女免费视频一区| 久久一区二区三区电影| 中文字幕av一区二区三区四区| 国产精品观看| 久久久久蜜桃| 日韩激情综合| www.九色在线| 丝袜诱惑制服诱惑色一区在线观看 | 国内自拍视频一区二区三区| 国产综合婷婷| 亚洲精品高潮| 精品国产中文字幕第一页| 久久精品国产大片免费观看| 亚洲毛片一区| 国产99在线| 亚洲综合小说| 国产美女高潮在线| 亚洲1区在线| 一区二区精品伦理...| 免费在线观看成人| 精品三级av| 国产偷自视频区视频一区二区| **爰片久久毛片| 91精品一区二区三区综合| 少妇精品在线| 成人国产综合| 亚洲久久一区| 丝袜美腿诱惑一区二区三区| 日韩精品免费观看视频| 亚洲精品一区三区三区在线观看| 日韩中文字幕一区二区高清99| 视频在线不卡免费观看| 一区二区三区网站| 日韩在线观看| 欧美日本不卡| 一区在线观看| 国产一区二区三区天码| 亚洲精品自拍| 久久精品国产大片免费观看| 国产精品视频一区二区三区综合 | 日韩av免费大片| 亚洲精品乱码| 久久蜜桃av| 国产精品久久久久9999高清| 日韩午夜免费| 欧美亚洲日本精品| 欧美日韩伊人| 免费人成在线不卡| 精品免费av在线| 国产精品日韩精品在线播放| 伊人影院久久| 亚洲午夜天堂| 国产情侣久久| 日韩精品一卡二卡三卡四卡无卡| 国产资源在线观看入口av| 青草国产精品久久久久久| 亚洲国产综合在线看不卡| 精品视频91| 日韩av影院| 丝袜美腿高跟呻吟高潮一区| 国产综合婷婷| 国产精品xx| 欧美国产日本| 日韩精品a在线观看91|