分布式锁获取token

该代码段展示了获取和刷新HS.NET开放API令牌的过程。首先尝试从Redis缓存中获取,若不存在则使用分布式锁进行保护,通过HTTP调用来获取新的令牌,并将其存储到缓存中,确保在令牌过期前更新。同时,提供了刷新令牌的函数,同样使用分布式锁保证并发安全性。
摘要由CSDN通过智能技术生成
    /**
     * 获取hs.net-openApiToken
     * @param
     * @return java.lang.String
     * @author 德先生
     * @Date 13:21 2021/5/24
     */
    public static String getAuthToken() {
        //首先从redis中获取
        String authToken = LightDataConstant.HS_CACHE.get(LightDataConstant.QUANTIZATION_OPEN_API_AUTH_TOKEN_LIGHT_DATA_ALIAS, String.class);

        //为空 http获取
        if (StringUtils.isBlank(authToken)) {

            //分布式锁:redis为空先上锁 配置文件默认生成锁的时间为30S
            DistributedLock lock = DistributedLockFactory.buildLock(LightDataConstant.LOCK_QUAANTIZATION_FACTOR_AUTH_TOCKEN);
            //获取到锁立即进入,获取不到锁10秒等待
            Long waitSeconds = 10L;
            if (lock.tryLock(waitSeconds, TimeUnit.SECONDS)) {
                //进入锁后再判断一次redis是否有token
                authToken = LightDataConstant.HS_CACHE.get(LightDataConstant.QUANTIZATION_OPEN_API_AUTH_TOKEN_LIGHT_DATA_ALIAS, String.class);
                //再次没有,说明上次HTTP获取Token失败 尝试再次HTTP获取
                if (StringUtils.isBlank(authToken)) {
                    //http获取Token
                    String authorization = "Basic" + " " + Base64.getEncoder().encodeToString((staticKey + ":" + staticSecret).getBytes(StandardCharsets.UTF_8));
                    AuthToken hsNetAuthToken = null;
                    try {
                        //form表单的形式提交
                        List<NameValuePair> nvps = new ArrayList<>();
                        nvps.add(new BasicNameValuePair("grant_type", "client_credentials"));
                        String queryStr = URLEncodedUtils.format(nvps, Consts.UTF_8);
                        ResponseEntity<AuthToken> responseEntity = staticHsNetClient.getAuthToken(authorization, queryStr);
                        hsNetAuthToken = responseEntity.getBody();
                    } catch (Exception e) {
                        log.error("调用hs.net-openApi接口:oauth2/oauth2/token,获取Token失败");
                        log.error(e.getMessage());
                        throw new BaseBizException(ResponseEnum.ERROR_SYSTEM.getErrorCode(), ResponseEnum.ERROR_SYSTEM.getErrorInfo());
                    }
                    //将结果放到缓存 缓存时间比它的失效时间小1800秒
                    assert hsNetAuthToken != null;
                    authToken =  hsNetAuthToken.getAccessToken();
                    LightDataConstant.HS_CACHE.put(LightDataConstant.QUANTIZATION_OPEN_API_AUTH_TOKEN_LIGHT_DATA_ALIAS, authToken, hsNetAuthToken.getExpiresIn() - 1800);
                }

                //最后释放锁
                try {
                    lock.unlock();
                } catch (Exception e) {
                    log.error(e.getMessage());
                }
            } else {
                //等待超过10s提示系统繁忙
                log.info("HsNetOpenApiUtil.getAuthToken()等待超过10秒,未获取到锁,未进入HTTP请求");
                throw new BaseBizException(ResponseEnum.ERROR_SYSTEM.getErrorCode(), ResponseEnum.ERROR_SYSTEM.getErrorInfo());
            }
        }
        return authToken;
    }

    public static String freshAuthToken() {
        String authToken;
        //分布式锁:redis为空先上锁 配置文件默认生成锁的时间为30S
        DistributedLock lock = DistributedLockFactory.buildLock(LightDataConstant.LOCK_QUAANTIZATION_FACTOR_AUTH_TOCKEN);
        //获取到锁立即进入,获取不到锁立即拒绝
        if (lock.tryLock()) {
            //http获取Token
            String authorization = "Basic" + " " + Base64.getEncoder().encodeToString((staticKey + ":" + staticSecret).getBytes(StandardCharsets.UTF_8));
            AuthToken hsNetAuthToken = null;
            try {
                //form表单的形式提交
                List<NameValuePair> nvps = new ArrayList<>();
                nvps.add(new BasicNameValuePair("grant_type", "client_credentials"));
                String queryStr = URLEncodedUtils.format(nvps, Consts.UTF_8);
                ResponseEntity<AuthToken> responseEntity = staticHsNetClient.getAuthToken(authorization, queryStr);
                hsNetAuthToken = responseEntity.getBody();
            } catch (Exception e) {
                log.error("调用hs.net-openApi接口:oauth2/oauth2/token,获取Token失败");
                log.error(e.getMessage());
                throw new BaseBizException(ResponseEnum.ERROR_SYSTEM.getErrorCode(), ResponseEnum.ERROR_SYSTEM.getErrorInfo());
            }
            //将结果放到缓存 缓存时间比它的失效时间小1800秒
            assert hsNetAuthToken != null;
            authToken = hsNetAuthToken.getAccessToken();
            LightDataConstant.HS_CACHE.put(LightDataConstant.QUANTIZATION_OPEN_API_AUTH_TOKEN_LIGHT_DATA_ALIAS, authToken, hsNetAuthToken.getExpiresIn() - 1800);

            //最后释放锁
            try {
                lock.unlock();
            } catch (Exception e) {
                log.error(e.getMessage());
            }
        } else {
            //等待超过10s提示系统繁忙
            log.info("HsNetOpenApiUtil.freshAuthToken()未获取到锁,立即拒绝,未进入HTTP请求");
            throw new BaseBizException(ResponseEnum.ERROR_SYSTEM.getErrorCode(), ResponseEnum.ERROR_SYSTEM.getErrorInfo());
        }
        return authToken;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值