SpringBoot--超时熔断器

需求背景

如果一个服务中有很多涉及需要服务间熔断的地方,就会出现N多下述代码:

1.N个fegnClient接口

@FeignClient(name = "hello-world-service", fallback = HelloWorldFallback.class)
public interface HelloWorldService {@GetMapping("/hello")String sayHello();
}

2.N个降级结果类

@Component
public class HelloWorldFallback implements HelloWorldService {@Overridepublic String sayHello() {return "fallback";}
}

feign调用接口上都要加上fallback降级类,只是想简单方便且不需要关心创建及返回结果,并且可以把hystrix的框架包装在中间件中,屏蔽调用逻辑,让开发者更加关注于业务本身。

方案设计

1.使用注解和切面技术,拦截需要熔断保护的方法

2.继承com.netflix.hystrix.HystrixCommand.class(奈飞熔断器源码),实现自定义的超时熔断处理

代码实现

自定义注解DoHystrix

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface DoHystrix {String returnJson() default "";         // 失败结果 JSONint timeoutValue() default 0;           // 超时熔断}

熔断器的具体实现--HystrixValveImpl.class

public class HystrixValveImpl extends HystrixCommand<Object> implements IValveService {private ProceedingJoinPoint jp;private Method method;private DoHystrix doHystrix;public HystrixValveImpl() {/********************************************************************************************** 置HystrixCommand的属性* GroupKey:            该命令属于哪一个组,可以帮助我们更好的组织命令。* CommandKey:          该命令的名称* ThreadPoolKey:       该命令所属线程池的名称,同样配置的命令会共享同一线程池,若不配置,会默认使用GroupKey作为线程池名称。* CommandProperties:   该命令的一些设置,包括断路器的配置,隔离策略,降级设置,以及一些监控指标等。* ThreadPoolProperties:关于线程池的配置,包括线程池大小,排队队列的大小等*********************************************************************************************/super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("GovernGroup")).andCommandKey(HystrixCommandKey.Factory.asKey("GovernKey")).andThreadPoolKey(HystrixThreadPoolKey.Factory.asKey("GovernThreadPool")).andCommandPropertiesDefaults(HystrixCommandProperties.Setter().withExecutionIsolationStrategy(HystrixCommandProperties.ExecutionIsolationStrategy.THREAD)).andThreadPoolPropertiesDefaults(HystrixThreadPoolProperties.Setter().withCoreSize(10)));}@Overridepublic Object access(ProceedingJoinPoint jp, Method method, DoHystrix doHystrix, Object[] args) {this.jp = jp;this.method = method;this.doHystrix = doHystrix;// 设置熔断超时时间Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("GovernGroup")).andCommandPropertiesDefaults(HystrixCommandProperties.Setter().withExecutionTimeoutInMilliseconds(doHystrix.timeoutValue()));return this.execute();}@Overrideprotected Object run() throws Exception {try {return jp.proceed();} catch (Throwable throwable) {return null;}}@Overrideprotected Object getFallback() {return JSON.parseObject(doHystrix.returnJson(), method.getReturnType());}}

主要是对HystrixCommand的再次封装,通过继承父类构造函数来配置熔断器启动参数,包括熔断器工厂分组,key,线程隔离策略,线程池的核心线程数等

HystrixCommand.run()方法:返回正确方法调用结果
HystrixCommand.getFallback()方法:返回超时熔断降级结果

切面实现--DoHystrixPoint.class

@Aspect
@Component
public class DoHystrixPoint {@Pointcut("@annotation(cn.bugstack.middleware.hystrix.annotation.DoHystrix)")public void aopPoint() {}@Around("aopPoint() && @annotation(doGovern)")public Object doRouter(ProceedingJoinPoint jp, DoHystrix doGovern) throws Throwable {IValveService valveService = new HystrixValveImpl();return valveService.access(jp, getMethod(jp), doGovern, jp.getArgs());}private Method getMethod(JoinPoint jp) throws NoSuchMethodException {Signature sig = jp.getSignature();MethodSignature methodSignature = (MethodSignature) sig;return jp.getTarget().getClass().getMethod(methodSignature.getName(), methodSignature.getParameterTypes());}}

切面中的逻辑已经在统一白名单中间件  文章中详细梳理过了,需要请移步

测试

在被调用方法上加自定义熔断注解,超时时长设置为500毫秒,当前线程睡一秒

 方法调用大于500毫秒:
 

{"code":"0","info":"调用超500毫秒"}

将线程睡一秒干掉,方法调用小于500毫秒:
 

{"name":"xxx","age":20,"address":"xxx"}

总结

通过对中间件的设计屏蔽掉底层应用的复杂性,让整个功能服务的业务代码更加纯粹,同时可以让使用此功能的研发不会过多的参与到插件的使用中,把更多的关心放在业务逻辑开发中

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/9651.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HDLBits刷题笔记9:Circuits.Sequential Logic.Counters + Shift Registers

Counters Four-bit binary counter module top_module (input clk,input reset, // Synchronous active-high resetoutput reg [3:0] q);always (posedge clk) beginif(reset)q < 0;elseq < q 1;end endmoduleDecade counter 建立一个计数器&#xff0c;从0计数…

【深度学习】深度强化学习初学者指南

一、说明 GAN&#xff08;Generative Adversarial Networks&#xff09;是一种深度学习模型&#xff0c;它由两个神经网络组成&#xff1a;一个生成网络和一个判别网络。生成网络学习如何生成类似于给定数据集的新数据&#xff0c;而判别网络则学习如何区分生成网络生成的数据和…

vscode 插件系统的运行机制!

做vscode二次开发有一段时间了&#xff0c;平时都是任务比较重&#xff0c;最近有时间做下总结&#xff0c;详细的讲解下vscode 插件系统的运行机制&#xff0c;vscode做为最受欢迎的编辑器&#xff0c;有着庞大的插件市场。其插件系统确实很复杂&#xff0c;文章很长&#xff…

Maven基础概念

仓库 作用&#xff1a;用于存储资源&#xff0c;包含各种jar包 仓库分类 本地仓库远程仓库 2.1中央仓库 2.2私服&#xff08;用于解决下载速度慢&#xff0c;版权问题等&#xff09; 1.maven坐标 <groupId></groupId>当前MAVEN项目隶属组织名称 <artifactId…

nginx纳入skywalking调用链监控

nginx纳入skywalking调用链监控 一、说明二、nginx部署2.1 OpenResty介绍2.2 准备SkyWalking Nginx Agent2.3 docker方式部署OpenResty2.3.1 修改配置文件2.3.2 启动OpenResty容器 2.4 验证 一、说明 服务器中已部署好skywalking&#xff0c;并将tomcat纳入skywalking监控(tom…

Unity包体积优化实践

目录 简述优化前优化中assets目录资源ab包动态下发资源大小优化dll大小优化场景模型动态下载和加载优化assets目录后大小 lib目录优化目标架构裁剪代码优化代码和引用 其他优化项Shader优化Release模式编译选项 优化后 简述 在移动端App混合Unity开发的项目中&#xff0c;Unit…

MATLAB图像处理实现高光抑制

下面是的几个用MATLAB进行高光抑制的处理例子。 1. 基于最大值滤波的亮光抑制方法 原理是用某像素周围一定大小的邻域中的最大值减去该像素值&#xff0c;可达到亮光抑制的效果。在MATLAB中&#xff0c;可以使用mat2gray函数将图像归一化后&#xff0c;再使用imextendedmax函…

【花雕】全国青少年机器人技术一级考试备考实操搭建手册10

随着科技的不断进步&#xff0c;机器人技术已经成为了一个重要的领域。在这个领域中&#xff0c;机械结构是机器人设计中至关重要的一部分&#xff0c;它决定了机器人的形态、运动方式和工作效率。对于青少年机器人爱好者来说&#xff0c;了解机械结构的基础知识&#xff0c;掌…

目标检测的评估指标

Precision(精确率/查准率)&#xff1a;是指在所有被预测为正的样本中&#xff0c;确实是正样本的占比。当Precision越大时&#xff0c;FP越小&#xff0c;此时将其他类别预测为本类别的个数也就越少&#xff0c;可以理解为预测出的正例纯度越高。Precision越高&#xff0c;误检…

ORA-01122 ORA-01200故障处理---惜分飞

由于某种原因客户的数据库启动报ORA-01122 ORA-01200错误 让客户把system01.dbf文件发给我进行分析,发现system01.dbf文件大于32G(在8k的blocksize库中,默认情况system01.dbf文件不会超过32G),这个明显异常 检测坏块情况发现4096000之后的block全部为全0块 通过bbed分析文…

uniapp-设置全屏

需求&#xff1a;就是想要小程序不受限制&#xff0c;可以把图片或者文字全屏的展示&#xff0c;如下图 vue代码如下&#xff1a; <template><view class"content"><image class"image-bg" src"/static/logo.png" /><imag…

学生成绩管理系统的设计与实现(论文+源码)_kaic

摘要 该系统在开发过程中&#xff0c;要注意使其与业务流程的运作相一致&#xff0c;力争使该系统全面&#xff0c;通用&#xff0c;以便该系统不仅适用于教育机构。在开发方法的选择上&#xff0c;选择生命周期方法和原型方法&#xff0c;并按照四个主要阶段的系统研究&#x…