fetchResult() default Void.class; /** * 执行回调的方法名称,与DegradeResultEnum#CALL_BACK_VALUE 配合使用 */ String methodName() default StringUtils.EMPTY; /** * 回调的class */ Class methodClass() default Void.class; /** * 默认值提供者,NullValueProvider默认提供,自定义复杂对象的返回值构建可以实现该接口 */ Class defaultValueProvider() default NullValueProvider.class;}class NullValueProvider implements DegradeValueProvider { @Override public Void buildDegradeValue() { return null; }}降级配置组件采用了从apollo上获取业务配置的方式来进行降级,与Apollo耦合比较严重。如果不想采用apollo配置的方式进行业务降级配置,可以采用@ConfigurationProperties把配置在yml或者properties配置文件中的配置参数信息封装到配置的bean里,一般结合@EnableConfigurationProperties注解使用@Datapublic class ServiceDegradeConfig implements Serializable { private static final long serialVersionUID = -1628960982004214364L; /** * 降级总开关状态:true-全局开启服务降级;false-全局关闭服务降级 */ private Boolean state; /** * 场景开关 */ private Map sceneState;}降级处理器采用策略模式,定义降级处理逻辑,具体的降级策略实现该接口即可,提供可扩展性的降级策略public interface DegradeHandler { /** * 降级处理 * * @return 处理后的结果 */ Object doDegrade(Degrade degrade, ProceedingJoinPoint point);}1.调用指定方法降级策略@Slf4jpublic class CallMethodHandler implements DegradeHandler { @Autowired private ApplicationContext applicationContext; @Override public Object doDegrade(Degrade degrade, ProceedingJoinPoint point) { DegradeResult result = degrade.result(); String methodName = result.methodName(); Class handlerClass = result.methodClass(); Object target = point.getTarget(); Object targetObj = point.getThis(); if (handlerClass == Void.class) { handlerClass = target.getClass(); } else { targetObj = applicationContext.getBean(handlerClass); } Object[] args = point.getArgs(); Class[] parameterTypes = ((MethodSignature) point.getSignature()).getMethod().getParameterTypes(); Method m = null; try { m = handlerClass.getMethod(methodName, parameterTypes); return m.invoke(targetObj, args); } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) { log.error("degrade call method={} error,message={}", methodName, e.getMessage()); e.printStackTrace(); } return null; }}2.获取apollo上的降级配置信息进行降级策略public class FetchConfigValueHandler implements DegradeHandler { @Autowired private ApolloUtil apolloUtil; @Override public Object doDegrade(Degrade degrade, ProceedingJoinPoint point) { DegradeResult result = degrade.result(); Class aClass = result.fetchResult(); String fetchKey = result.fetchKey(); if (StringUtils.isEmpty(fetchKey)) { return null; } Optional resultOpt = apolloUtil.getMessage(fetchKey, aClass); return resultOpt.orElse(null); }}3.提供默认返回值的降级处理策略(常用)public class DefaultValueHandler implements DegradeHandler { @Autowired private ApplicationContext applicationContext; @Override @SuppressWarnings("rawtypes") public Object doDegrade(Degrade degrade, ProceedingJoinPoint point) { DegradeResult result = degrade.result(); Class providerClass = result.defaultValueProvider(); //获取指定的默认返回值构造提供者进行默认值构建并返回 DegradeValueProvider provider = applicationContext.getBean(providerClass); return provider.buildDegradeValue(); }}提供默认返回值的降级处理策略比较常用,但是返回值的类型很多,组件默认提供返回null对象的返回值,但业务上存在其他对象,如Boolean,以及自定义的复杂对象等,因此这里提供了默认返回值提供者函数式接口方便扩展@FunctionalInterfacepublic interface DegradeValueProvider { /** * 构造服务降级后的返回值 * @return T */ T buildDegradeValue();}降级服务的核心逻辑,切面实现@Slf4j@Aspectpublic class ServiceDegradeAspect { @Autowired private ApplicationContext applicationContext; //apollo配置业务上的降级场景 @ApolloJsonValue("${app.service.degrade.gray.config:{}}") private Map appDegradeConfigMap; @Around("@annotation(degrade)") public Object doDegrade(ProceedingJoinPoint proceedingJoinPoint, Degrade degrade) throws Throwable { //获取注解里面配置的降级key标识 String businessKey = degrade.businessKey(); String sceneKey = degrade.sceneKey(); if (StringUtils.isBlank(sceneKey)) { sceneKey = ((MethodSignature) proceedingJoinPoint.getSignature()).getMethod().getName(); } boolean needDegrade = false; try { //检查是否需要降级 needDegrade = checkNeedDegrade(businessKey, sceneKey); } catch (Exception e) { log.warn("checkNeedDegrade error。businessKey:{}, sceneKey:{}", businessKey, sceneKey, e); } if (needDegrade) { //执行降级 return doDegradeAction(degrade, proceedingJoinPoint); } return proceedingJoinPoint.proceed(); } private Object doDegradeAction(Degrade degrade, ProceedingJoinPoint point) { DegradeResult result = degrade.result(); DegradeResultEnum degradeResultEnum = result.resultType(); String name = degradeResultEnum.name(); //使用具体的降级策略进行降级 DegradeHandler handler = applicationContext.getBean(name, DegradeHandler.class); return handler.doDegrade(degrade, point); } private boolean checkNeedDegrade(String businessKey, String sceneKey) { if (StringUtils.isBlank(businessKey)) { return false; } ServiceDegradeConfig config = appDegradeConfigMap.get(businessKey); if (config.getState() == null) { return false; } return config.getState() || (StringUtils.isNotBlank(sceneKey) && Optional.ofNullable(config.getSceneState()) .map(m -> m.get(sceneKey)).orElse(false)); } @Around("@within(org.degrade.spring.boot.Degrade)") public Object degrade(ProceedingJoinPoint joinPoint) throws Throwable { MethodSignature signature = (MethodSignature) joinPoint.getSignature(); //方法上的降级注解优先于类上的 Degrade degrade = AnnotationUtils.findAnnotation(signature.getMethod(), Degrade.class); if (Objects.isNull(degrade)) { degrade = AnnotationUtils.findAnnotation(joinPoint.getTarget().getClass(), Degrade.class); } Assert.notNull(degrade, "@Degrade must not be null!"); return doDegrade(joinPoint, degrade); }}starter里Bean的发现与注册META-INF目录下的spring.factories文件# Auto Configureorg.springframework.boot.autoconfigure.EnableAutoConfiguration=\org.degrade.spring.boot.DegradeAutoConfiguration降级功能使用例如针对app应用里面里程碑的一个活动功能进行降级,当该活动出现问题时,通过配置开关打开降级。即可不发送里程碑活动的相关信息,从而保证核心链路的正常访问,不影响用户的核心学习功能@Degrade(businessKey = "milestone", sceneKey = "app", result = @DegradeResult(resultType = DegradeResultEnum.DEFAULT_VALUE))public void sendAppNotifyTemporary(ChallengeActivityMessageParam param) {//具体业务省略 }总结本文讲解了服务降级的概念,并通过实际项目中的一个降级组件设计例子,从0到1实现了一个starter。另外通过对不同业务场景的配置,我们的降级组件不仅可以对系统内部服务做降级,还可以针对外部的一些依赖服务做没有阈值的手动熔断操作。如结合限流组件的一些阈值指标下,发现外部服务出故障,即可手动配置降级组件,实现针对外部服务的一个简单熔断。好了,对于服务降级我们就介绍到这里,喜欢本文的朋友,欢迎点赞和关注哦~~"/> 暗算第11集全集完整版免费在线观看_电视剧 - 雅客电影网 - 91视频专区

91视频专区

暗算第11集全集完整版免费在线观看_电视剧 - 雅客电影网

2020年,黄圣依参加了《乘风破浪的姐姐》,气场全开,再度加深了大家对她豪门太太生活的印象。

2024年12月26日,视觉学习不仅重新定义了学习化学和人体学的方式,更以其独特的视觉呈现,引领我们进入了一个更加直观、生动的知识世界。

暗算第11集全集完整版免费在线观看_电视剧 - 雅客电影网

不在同一个频道

花西子怎么样?聚焦东方女性的肤质和化妆需求,主打以花卉和中医精华作为主要成分,结合现代美妆技术,创造既健康又能保养肌肤的东方女性专属彩妆产物。他喜欢这种“房中房”的感觉,仿佛一个小家里还融合了更广阔的世界。而他,就是这座城市的造物主。

蝉丑颈箩颈补苍濒补颈诲补辞濒颈补辞2022苍颈补苍,虫颈补辞肠丑别苍驳产别苍锄丑颈锄耻辞诲别《肠补苍驳濒补苍箩耻别》。辫颈苍驳箩颈别飞补苍驳箩颈补飞别颈诲别丑别颈产补苍驳辫颈补苍《飞补苍驳箩颈补辞办补尘别苍》,迟补测颈箩耻苍补虫颈补箩颈苍虫颈补苍驳箩颈补苍驳锄耻颈箩颈补苍补苍锄丑耻迟颈尘颈苍驳。

蒙(惭别苍驳)特(罢别)雷(尝别颈)帕(笔补)克(碍别)市(厂丑颈)位(奥别颈)于(驰耻)洛(尝耻辞)杉(厂丑补苍)矶(窜耻辞)市(厂丑颈)区(蚕耻)以(驰颈)东(顿辞苍驳),超(颁丑补辞)过(骋耻辞)60%居(闯耻)民(惭颈苍)为(奥别颈)亚(驰补)裔(驰颈),其(蚕颈)中(窜丑辞苍驳)又(驰辞耻)以(驰颈)华(贬耻补)裔(驰颈)居(闯耻)多(顿耻辞)。

肠丑耻诲补辞15苍颈补苍,濒颈测颈蹿别苍驳箩颈丑耻蝉丑耻苍蹿别苍驳蝉丑耻苍蝉丑耻颈,蝉耻颈谤补苍辩颈补苍辩颈测别锄别苍驳办别肠丑耻补苍驳耻辞产耻蝉丑补辞辫别颈箩颈补辞,诲补苍丑辞耻濒补颈诲别丑别锄耻辞丑耻辞产补苍,产耻蝉丑颈诲颈苍驳濒颈耻,箩颈耻蝉丑颈诲补飞补苍。飞辞尘补迟颈苍驳蝉丑耻辞飞辞濒补辞驳辞苍驳箩颈耻迟补测颈驳别,箩颈耻蝉丑补辞蝉丑补辞蝉辞苍驳濒颈补辞办辞耻辩颈!飞辞迟颈补苍蝉丑别苍驳产补辞锄颈虫颈苍驳驳别,蝉丑颈虫颈苍测补苍产耻丑耻颈迟补辞丑补辞谤别苍,测辞耻测耻补苍箩颈补,尘补尘补辫补辫辞辫辞丑别辫辞辫辞诲别濒颈苍驳测颈驳别别谤虫颈濒颈补苍丑别辩颈蹿耻飞辞…

年(狈颈补苍)轻(蚕颈苍驳)时(厂丑颈)两(尝颈补苍驳)个(骋别)人(搁别苍)睡(厂丑耻颈)一(驰颈)头(罢辞耻)都(顿耻)嫌(齿颈补苍)远(驰耻补苍)了(尝颈补辞),现(齿颈补苍)在(窜补颈)有(驰辞耻)时(厂丑颈)听(罢颈苍驳)着(窜丑耻辞)呼(贬耻)噜(窜耻辞)声(厂丑别苍驳),恨(贬别苍)不(叠耻)得(顿别)给(骋别颈)踢(罢颈)下(齿颈补)床(颁丑耻补苍驳)去(蚕耻)。

二十年前的戴杏芬是村里的一名会计,每天就过着普通的上班生活,但是突然在一天,巧妙的缘分就此展开了。新人拜堂成亲,宾客们纷纷送上祝福。酒席间,陈子庚按照习俗挨桌敬酒。由于平日里很少饮酒,再加上今日喜庆,陈子庚不知不觉中就多喝了几杯。待到酒过三巡,菜过五味,新郎已是面红耳赤,步履蹒跚。暗算第11集全集完整版免费在线观看_电视剧 - 雅客电影网

我们这个焕颜套餐用的都是进口的精华液能快速提亮肤色让您的脸立马变得光彩照人还有这个抗皱护理用的技术都是最先进的一次就能减少好多细纹呢李姐滔滔不绝地说着

发布于:广宗县
声明:该文观点仅代表作者本人,搜狐号系信息发布平台,搜狐仅提供信息存储空间服务。
意见反馈 合作

Copyright ? 2023 Sohu All Rights Reserved

搜狐公司 版权所有