zoukankan      html  css  js  c++  java
  • 谷粒商城高级结束(四十八)

    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

    image-20200824150152311

    /**
     * @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;
            });
        }
    }
    
  • 相关阅读:
    贪心算法 Wooden Sticks
    HDOJ 2189 悼念512汶川大地震遇难同胞——来生一起走
    hdoj1069 Monkey and Banana(最长上升子序列)
    2012级计科《程序设计基础Ⅱ》期末上机考试
    Constructing Roads In JGShining's Kingdom
    c语言学习随笔之指针(二)
    c语言学习随笔之指针(一)
    遍历网页框架结构
    笔记本测试软件(让奸商头疼的软件)0
    ResizePicturevb.net
  • 原文地址:https://www.cnblogs.com/dalianpai/p/13554058.html
Copyright © 2011-2022 走看看