表格做网站,浙江省网站域名备案,快速建设网站视频,统计局网站集约化建设方案持续学习持续更新中…
守破离 【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【29】Sentinel 简介熔断降级什么是熔断什么是降级相同点不同点 整合Sentinel自定义sentinel流控返回数据使用Sentinel来保护feign远程调用自定义资源给网关整合Sentinel参考 简介 熔断降…
持续学习持续更新中…
守破离 【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【29】Sentinel 简介熔断降级什么是熔断什么是降级相同点不同点 整合Sentinel自定义sentinel流控返回数据使用Sentinel来保护feign远程调用自定义资源给网关整合Sentinel参考 简介 熔断降级
什么是熔断
A 服务调用 B 服务的某个功能由于网络不稳定问题或者 B 服务卡机导致功能时间超长。
如果这样子的次数太多。我们就可以直接将 B 断路了A 不再请求 B 接口凡是调用 B 的直接返回降级数据不必等待 B 的超长执行。 这样 B 的故障问题就不会级联影响到 A。
什么是降级
整个网站处于流量高峰期服务器压力剧增根据当前业务情况及流量对一些服务和页面进行有策略的降级停止服务所有的调用直接返回降级数据。
缓解服务器资源的的压力保证核心业务的正常运行保持了大部分客户得到正确的响应。
相同点
为了保证集群大部分服务的可用性和可靠性防止崩溃牺牲小我成就全局用户最终都是体验到某个功能不可用
不同点
熔断是被调用方故障触发的系统主动规则降级是基于全局考虑停止一些正常服务释放资源
整合Sentinel https://sentinelguard.io/zh-cn/docs/quick-start.html 导入依赖 spring-cloud-starter-alibaba-sentinel dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-sentinel/artifactId/dependency下载sentinel的控制台直接在命令行启动sentinel-dashboard-1.6.3.jar这是Sentinel的控制台用户名密码是sentinel默认是8080端口如果该端口被占用使用java -jar sentinel-dashboard-1.6.3.jar --server.portxxxx启动
配置sentinel控制台地址信息
spring.cloud.sentinel.transport.dashboardlocalhost:8080
spring.cloud.sentinel.transport.port8719 【默认可以不用配】Sentinel默认对SpringCloud进行了适配每个请求默认就是一个资源访问Controller的请求接口后就可以在Sentinel的控制台看到簇点链路了
建议给每一个微服务都导入spring-boot-starter-actuator 并配合management.endpoints.web.exposure.include*就可以在控制台看到Sentinel的实时监控了
自定义sentinel流控返回数据
Configuration
public class MySentinelConfig {public MySentinelConfig() {WebCallbackManager.setUrlBlockHandler(new UrlBlockHandler() {Overridepublic void blocked(HttpServletRequest request, HttpServletResponse response, BlockException ex) throws IOException {R error R.error(BizCodeEnume.TOO_MANY_REQUEST.getCode(), BizCodeEnume.TOO_MANY_REQUEST.getMsg());response.setCharacterEncoding(UTF-8);response.setContentType(application/json);response.getWriter().write(JSON.toJSONString(error));}});}
}使用Sentinel来保护feign远程调用
调用方
feign.sentinel.enabledtrueSlf4j
Component
public class SeckillFeignServiceFallBack implements SeckillFeignService {Overridepublic R getSkuSeckillInfo(Long skuId) {log.info(熔断方法调用...getSkuSeckillInfo);return R.error(BizCodeEnume.TOO_MANY_REQUEST.getCode(),BizCodeEnume.TOO_MANY_REQUEST.getMsg());}
}FeignClient(value gulimall-seckill, fallback SeckillFeignServiceFallBack.class)
public interface SeckillFeignService {GetMapping(/sku/seckill/{skuId})R getSkuSeckillInfo(PathVariable(skuId) Long skuId);
}远程服务当然也可以自己配置自己的流控/降级规则
自定义资源
无论是方式1还是2一定要配置好被限流以后的返回内容方式1 方式2 public ListSecKillSkuRedisTo blockHandler(BlockException e) {log.error(getCurrentSeckillSkusResource被限流了..);return null;}//返回当前时间可以参与的秒杀商品信息/*** blockHandler 函数会在原方法被限流/降级/系统保护的时候调用而 fallback 函数会针对所有类型的异常。*/SentinelResource(value getCurrentSeckillSkusResource, blockHandler blockHandler/*, fallback getCurrentSeckillSkusFallback*/)Overridepublic ListSecKillSkuRedisTo getCurrentSeckillSkus() {//1、确定当前时间属于哪个秒杀场次。long time new Date().getTime();// try (Entry entry SphU.entry(resourceName)) {SetString keys redisTemplate.keys(SESSIONS_CACHE_PREFIX *);for (String key : keys) {//seckill:sessions:1582250400000_1582254000000String replace key.replace(SESSIONS_CACHE_PREFIX, );String[] s replace.split(_);Long start Long.parseLong(s[0]);Long end Long.parseLong(s[1]);if (time start time end) {//2、获取这个秒杀场次需要的所有商品信息ListString range redisTemplate.opsForList().range(key, -1000, 1000);BoundHashOperationsString, String, String hashOps redisTemplate.boundHashOps(SKUKILL_CACHE_PREFIX);ListString list hashOps.multiGet(range);if (list ! null) {ListSecKillSkuRedisTo collect list.stream().map(item - {SecKillSkuRedisTo redis JSON.parseObject((String) item, SecKillSkuRedisTo.class);
// redis.setRandomCode(null); 当前秒杀开始就需要随机码return redis;}).collect(Collectors.toList());return collect;}break;}}
// } catch (BlockException e) {
// log.error(资源被限流,{}, e.getMessage());
// }return null;}给网关整合Sentinel
使用sentinel-dashboard-1.7.1.jar这个控制台
dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-sentinel/artifactId
/dependency!-- https://mvnrepository.com/artifact/com.alibaba.csp/sentinel-spring-cloud-gateway-adapter --
dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-alibaba-sentinel-gateway/artifactIdversion2.1.0.RELEASE/version
/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-actuator/artifactId
/dependencyspring.cloud.sentinel.transport.dashboardlocalhost:8080
management.endpoints.web.exposure.include*spring.cloud.sentinel.scg.fallback.content-typeapplication/jsonConfiguration
public class SentinelGatewayConfig {//TODO 响应式编程//GatewayCallbackManagerpublic SentinelGatewayConfig(){GatewayCallbackManager.setBlockHandler(new BlockRequestHandler(){//网关限流了请求就会调用此回调 Mono FluxOverridepublic MonoServerResponse handleRequest(ServerWebExchange exchange, Throwable t) {R error R.error(BizCodeEnume.TOO_MANY_REQUEST.getCode(), BizCodeEnume.TOO_MANY_REQUEST.getMsg());String errJson JSON.toJSONString(error);
// MonoString aaa Mono.just(aaa);MonoServerResponse body ServerResponse.ok().body(Mono.just(errJson), String.class);return body;}});// FlowRule flowRule new FlowRule();
// flowRule.setRefResource(gulimall_seckill_route);flowRule.set
// FlowRuleManager.loadRules(Arrays.asList(flowRule));}
}参考
雷丰阳: Java项目《谷粒商城》Java架构师 | 微服务 | 大型电商项目. 本文完感谢您的关注支持