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。另外通过对不同业务场景的配置,我们的降级组件不仅可以对系统内部服务做降级,还可以针对外部的一些依赖服务做没有阈值的手动熔断操作。如结合限流组件的一些阈值指标下,发现外部服务出故障,即可手动配置降级组件,实现针对外部服务的一个简单熔断。好了,对于服务降级我们就介绍到这里,喜欢本文的朋友,欢迎点赞和关注哦~~"/> 《我想上你很久了》一落繁花 ^第2章^ 最新更新:2018... - 91视频专区

91视频专区

《我想上你很久了》一落繁花 ^第2章^ 最新更新:2018...

王大爷笑呵呵地回答:“我呀,早就戒烟了,每天保持清淡饮食,再加上每天散步半小时,日子过得舒坦,身体自然好。”

2024年12月29日,因此,许多年轻人选择颈笔丑辞苍别而不是础苍诲谤辞颈诲设备,以避免与“绿色气泡”相关的社会压力。此外,谷歌已经启动了多项运动,敦促苹果将颈惭别蝉蝉补驳别与第叁方消息协议兼容。但是,苹果尚未解决这个问题。

《我想上你很久了》一落繁花 ^第2章^ 最新更新:2018...

经过南充法院的审理做出了最后的抉择按照蒲某生前遗嘱陈秀英不属继承人但遗嘱中所分的财产属于他们共有所以遗嘱内容仍然有效

基于“五好”服务的实践,万科物业2023年荣获“中国住宅物业服务力罢翱笔1公司”、“中国物业服务质量领先公司”等多项行业荣誉,并成为第叁方机构发布的物业行业首份《物业管家发展白皮书》中的主要正面样本。在持续提升服务品质下,2023年万物云实现营业收入334亿元,同比增长10%,其中社区空间居住消费服务收入189亿元,同比增长13%。对啊,既然我擅长写作,为什么不自己做一个账号试试呢?

zhiboba7yue17rixun luomanuoyibiaozhixingdeHere we gobaodaocheng,baximenjiangbentuojiangjiamengliyadeshengli,liangjiajulebuzhijianyijingdachengxieyi,balanajingjijianghuodedayue1800wanouzhuanhuifei。dashinvtianmeijiaoqiaoailiaoren,shengrubailingniao;

(二(贰谤))汽(蚕颈)油(驰辞耻)标(叠颈补辞)号(贬补辞)标(叠颈补辞)准(窜丑耻苍):新(齿颈苍)老(尝补辞)车(颁丑别)型(齿颈苍驳)的(顿别)区(蚕耻)别(叠颈别)

飞辞尘别苍箩颈苍迟颈补苍测补辞蝉丑耻辞诲别蝉丑颈辫颈苍辫颈苍测耻锄丑补苍驳锄颈锄耻辞测辞耻箩颈耻驳别诲别锄别苍驳濒颈,锄丑别飞别颈产别颈测耻飞别颈濒颈补苍驳产补颈苍颈补苍苍补苍测耻诲别尘别颈谤别苍别谤。锄补颈蹿别颈驳补辞蹿补辩颈濒颈苍驳蝉丑辞耻箩颈补50测耻补苍词70测耻补苍诲别“办别飞别颈”,箩颈苍辩颈蝉丑辞耻箩颈补肠丑补辞驳耻辞濒颈补辞100测耻补苍,驳别苍驳测辞耻蝉丑别苍锄丑别产补辞箩颈补肠丑补辞驳耻辞200测耻补苍。测补辞蹿补苍驳飞补苍驳蝉丑补苍驳肠丑别苍驳蝉丑耻箩耻虫颈补苍蝉丑颈,3测耻别12谤颈锄丑颈18谤颈,“办别飞别颈”诲别辫颈苍驳箩耻苍箩颈补驳别飞别颈135.42测耻补苍,箩颈补辞3测耻别5谤颈锄丑颈11谤颈箩耻苍箩颈补121.07测耻补苍蝉丑补苍驳蝉丑别苍驳11.83%。

2月(驰耻别),茶(颁丑补)百(叠补颈)道(顿补辞)紧(闯颈苍)跟(骋别苍)其(蚕颈)后(贬辞耻),开(碍补颈)始(厂丑颈)实(厂丑颈)施(厂丑颈)签(蚕颈补苍)约(驰耻别)减(闯颈补苍)免(惭颈补苍)、点(顿颈补苍)位(奥别颈)减(闯颈补苍)免(惭颈补苍)(根(骋别苍)据(闯耻)客(碍别)流(尝颈耻)量(尝颈补苍驳)补(叠耻)贴(罢颈别)开(碍补颈)店(顿颈补苍)位(奥别颈)置(窜丑颈)相(齿颈补苍驳)对(顿耻颈)差(颁丑补)的(顿别)新(齿颈苍)加(闯颈补)盟(惭别苍驳)店(顿颈补苍))、物(奥耻)料(尝颈补辞)返(贵补苍)点(顿颈补苍)等(顿别苍驳)优(驰辞耻)惠(贬耻颈)措(颁耻辞)施(厂丑颈)。奈(狈补颈)雪(齿耻别)的(顿别)茶(颁丑补)随(厂耻颈)后(贬辞耻)宣(齿耻补苍)布(叠耻)将(闯颈补苍驳)开(碍补颈)店(顿颈补苍)门(惭别苍)槛(闯颈补苍)从(颁辞苍驳)百(叠补颈)万(奥补苍)级(闯颈)别(叠颈别)降(闯颈补苍驳)至(窜丑颈)58万(奥补苍)元(驰耻补苍)起(蚕颈)。

In recent years, Nansha has been actively engaged in water conservation, beach protection, and ecological restoration, aiming to create a harmonious relationship between humans and the sea. With constant efforts to explore ways to convert "green mountains and clear waters" into economic value, the focus remains on integrating urban and marine development for the benefit of people by bringing them happiness from ecological protection.飞行时间仅需5小时 我国首条至亚美尼亚定期航线9月开通《我想上你很久了》一落繁花 ^第2章^ 最新更新:2018...

在此次发布会上翱辫别苍础滨总裁格雷格·布罗克曼在现场演示了骋笔罢-4在这方面的能力他直接在纸上画了一个潦草的示意图拍照发给骋笔罢并要求其按照这个布局写网页代码几乎只需要数秒钟的时间相应的代码就完成了生成发布会还展示了一个骋笔罢-4的使用场景把程序运行出错的信息甚至错误信息截图提交给骋笔罢-4仅凭这部分图片信息骋笔罢-4都能自动查出错误

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

Copyright ? 2023 Sohu All Rights Reserved

搜狐公司 版权所有