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

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

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

瀏覽:167日期: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久久,三上悠亚国产精品一区二区三区
日韩精品91亚洲二区在线观看| 青青草伊人久久| 国产一区二区精品| 国产精品久久久久久久久久白浆| 国产盗摄——sm在线视频| 青青草伊人久久| 91精品韩国| 免费亚洲婷婷| 国产美女亚洲精品7777| 午夜精品影视国产一区在线麻豆| 蜜桃视频一区二区三区在线观看 | 日韩中文欧美在线| 日韩欧美三级| 激情久久婷婷| 欧美日韩精品一区二区视频| 久久亚洲人体| 欧美好骚综合网| 国产精品久久久久久久久久白浆 | 日韩一区二区三区四区五区| 亚洲精品2区| 成人免费网站www网站高清| 卡一精品卡二卡三网站乱码| 青青草国产成人99久久| 欧美另类中文字幕| 91视频久久| 99久久亚洲精品蜜臀| 国精品一区二区| 亚洲在线电影| 婷婷综合成人| 亚洲欧美网站在线观看| 亚洲欧美日韩综合国产aⅴ| 欧美freesex黑人又粗又大| 欧美黄色网页| 久久亚洲视频| 国产日韩一区二区三区在线| 黄色亚洲大片免费在线观看| 日本亚洲欧美天堂免费| 日韩国产高清在线| 精品三级av| 欧美肉体xxxx裸体137大胆| 丝袜诱惑一区二区| 免费久久99精品国产| 国产精品九九| 久久亚洲二区| 激情综合自拍| 日韩成人精品一区二区三区 | 三级在线看中文字幕完整版| 精品国产精品国产偷麻豆| yellow在线观看网址| 精品在线99| 免费在线亚洲| 国产午夜精品一区二区三区欧美| 一区二区国产精品| 国产欧美另类| 亚洲天堂久久| 精品亚洲a∨| 在线观看一区| 欧美日韩视频网站| 日韩三级一区| 中文字幕av一区二区三区人| 国产高潮在线| 亚洲精品精选| 老司机精品久久| 日韩一区自拍| 欧美日韩色图| 亚洲va中文在线播放免费| 日本一区二区中文字幕| 视频一区二区三区入口| 九九在线精品| 亚洲精品网址| 久久亚洲不卡| 国产精品婷婷| 伊人成人在线视频| 香蕉视频亚洲一级| 性欧美xxxx免费岛国不卡电影| 另类小说一区二区三区| 亚洲午夜久久| 国产欧美一区二区三区国产幕精品| 激情久久五月| 亚洲婷婷丁香| 91日韩在线| 91成人精品| 久久福利精品| 日韩高清在线不卡| 国产精品porn| 99在线精品免费视频九九视| 午夜日韩av| 亚洲一区黄色| 蜜臀久久99精品久久一区二区| 精品国产亚洲一区二区三区| 日韩av电影一区| 国产伊人久久| 亚洲精品国产偷自在线观看| 蜜臀久久久99精品久久久久久| 日本精品一区二区三区在线观看视频| 国产精品欧美在线观看| 久久久成人网| 久久精品国产99久久| 在线精品视频一区| 久久精品国产一区二区| 久久网站免费观看| 欧美亚洲国产日韩| 国内精品福利| 日韩动漫一区| 亚洲中字黄色| 三上亚洲一区二区| 亚洲一区国产一区| 日韩大片在线观看| 久久国产乱子精品免费女| 美女少妇全过程你懂的久久| 日韩精选在线| 欧美成人综合| 成人国产精选| 国产精品最新自拍| 热久久国产精品| 精品国产一区二| 日韩av一级片| 国产精品三上| 久久久精品久久久久久96| 日本高清久久| 婷婷成人综合| www.com.cn成人| 精品一区二区三区免费看| 青青草伊人久久| 亚洲精品无吗| 亚洲免费中文| 欧美91精品| 一区二区三区四区在线看| 成人自拍av| 免费毛片在线不卡| 亚洲激情黄色| 在线视频精品| 免费精品视频在线| 99国产精品久久久久久久| 99精品视频精品精品视频| 午夜精品成人av| 久久爱www.| 精品国产aⅴ| 97精品在线| 久久精品高清| 综合国产在线| 精品网站999| 久久久777| 欧美综合二区| 日韩1区2区日韩1区2区| 麻豆国产欧美一区二区三区| 国产精品超碰| 欧美91在线| 国产福利片在线观看| 亚洲成av在线| 亚洲精品在线二区| 久久这里只有| 亚洲国产日韩欧美在线| 鲁大师成人一区二区三区| 亚洲字幕久久| 精品久久亚洲| 玖玖玖国产精品| 国产精品九九| 日韩欧美综合| 亚洲久久在线| 九九精品调教| 欧美在线看片| 婷婷成人综合| 日日摸夜夜添夜夜添国产精品| 亚洲综合日韩| 久久中文字幕一区二区三区| 免费久久精品| 精品久久久中文字幕| 水蜜桃久久夜色精品一区的特点| 国产精品亚洲二区| 99精品美女| 国语精品一区| 日韩精品欧美激情一区二区| 久久成人福利| 亚欧成人精品| 国产精品黑丝在线播放| 日韩中文av| 9色国产精品| 国产一区福利| 国产美女亚洲精品7777| 中文亚洲免费| 精品美女在线视频| 国产精品一站二站| 综合欧美亚洲| 亚洲一区av| 视频在线观看91| 亚洲欧美久久久| 日本不卡免费高清视频在线| 欧美日韩一区二区高清| 免费视频一区二区| 爽好久久久欧美精品| 亚洲女人av| 亚洲精品美女| 午夜影院欧美| 美女毛片一区二区三区四区 | 亚洲精品中文字幕乱码| 久久精品日韩欧美| 亚洲精品福利| 国产伦精品一区二区三区千人斩| 亚洲aa在线|