穀粒商城高階結束(四十八)
阿新 • • 發佈:2020-08-24
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; }); } }