1. 程式人生 > 實用技巧 >穀粒商城高階結束(四十八)

穀粒商城高階結束(四十八)

325-338 整合鏈路追蹤和sentinel

全部的Java程式碼已經提交到:https://gitee.com/dalianpai/gulimall

之前的boot和cloud都是高版本,整合的時候有問題,而且高版本在加入actuator後,用JRebel啟動也有報錯,降低版本和視訊中一樣的時候,P6spy資料來源也有問題,最後就先不用p6spy了。

之前也簡單寫過部落格:https://www.cnblogs.com/dalianpai/p/12286966.html

下面為主要的程式碼:

/**
 * @author WGR
 * @create 2020/8/20 -- 21:59
 */
@Configuration
public class SecKillSentinelConfig {

    public SecKillSentinelConfig(){
        WebCallbackManager.setUrlBlockHandler((request, response, exception) -> {
            R error = R.error(BizCodeEnume.TO_MANY_REQUEST.getCode(), BizCodeEnume.TO_MANY_REQUEST.getMessage());
            response.setCharacterEncoding("UTF-8");
            response.setContentType("application/json");
            response.getWriter().write(JSON.toJSONString(error));
        });
    }
}
 @SentinelResource(value = "getCurrentSeckillSkusResource",blockHandler = "blockHandler")
    @Override
    public List<SecKillSkuRedisTo> getCurrentSeckillSkus() {
        // 1.確定當前時間屬於那個秒殺場次
        long time = new Date().getTime();
        try (Entry entry = SphU.entry("seckillSkus")){

            Set<String> keys = redisTemplate.keys(SESSIONS_CACHE_PREFIX + "*");
            for (String key : keys) {

                String replace = key.replace("seckill:sessions:", "");
                String[] split = replace.split("_");
                long start = Long.parseLong(split[0]);
                long end = Long.parseLong(split[1]);
                if(time >= start && time <= end){
                    // 2.獲取這個秒殺場次的所有商品資訊
                    List<String> range = redisTemplate.opsForList().range(key, 0, 100);
                    BoundHashOperations<String, String, String> hashOps = redisTemplate.boundHashOps(SKUKILL_CACHE_PREDIX);
                    List<String> list = hashOps.multiGet(range);
                    if(list != null){
                        return list.stream().map(item -> {
                            SecKillSkuRedisTo redisTo = JSON.parseObject(item, SecKillSkuRedisTo.class);
                            return redisTo;
                        }).collect(Collectors.toList());
                    }
                    break;
                }
        }
        }catch (BlockException e){
            log.warn("資源被限流:" + e.getMessage());
        }
        return null;
    }

後來sentinel版本要換成1.7.2

/**
 * @author WGR
 * @create 2020/8/24 -- 12:19
 */
@Configuration
public class SentinelGateWayConfig {

    public SentinelGateWayConfig(){
        GatewayCallbackManager.setBlockHandler((exchange, t) ->{
            // 閘道器限流了請求 就會回撥這個方法
            R error = R.error(BizCodeEnume.TO_MANY_REQUEST.getCode(), BizCodeEnume.TO_MANY_REQUEST.getMessage());
            String errJson = JSON.toJSONString(error);
            Mono<ServerResponse> body = ServerResponse.ok().body(Mono.just(errJson), String.class);
            return body;
        });
    }
}