提升微服务稳定性与性能:深入剖析Netflix Hystrix框架

说到 Netflix Hystrix 框架,一定离不开 com.netflix.hystrix.HystrixCommand,这个类是 Netflix 开源的 Hystrix 框架中的一个关键类,用于实现服务的容错和熔断功能。它主要用于将远程服务调用封装成一个独立的命令对象,以便于进行容错处理和监控。

一、核心源码

源码中有几个关键方法,具体方法以及注释看下面的代码:

public abstract class HystrixCommand < R > extends AbstractCommand < R > implements HystrixExecutable< R >, HystrixInvokableInfo< R >, HystrixObservable< R > {/*** 用于【同步】执行命令*/public R execute() {try {return queue().get();}catch(Exception e) {throw Exceptions.sneakyThrow(decomposeException(e));}}/*** 用于【异步】执行命令。*/public Future< R > queue() {return f;}/*** execute() 或 queue()失败的时候,返回兜底数据*/protected R getFallback() {throw new UnsupportedOperationException("No fallback available.");}/*** execute() 和 queue() 被调用的时候,执行的方法*/protected abstract R run() throws Exception;
}
二、HystrixCommand 的主要功能及使用场景
  1. 容错处理:HystrixCommand 通过封装远程服务调用,可以在服务调用失败或超时时执行降级逻辑,避免整个系统的级联故障。它提供了一系列的容错策略,如超时设置、线程池隔离、断路器等,可以根据具体的业务需求进行配置。

  2. 熔断机制:HystrixCommand 通过断路器的机制,可以在服务调用失败率超过一定阈值时自动熔断,避免对不可用的服务进行无效的调用。熔断后,HystrixCommand 会快速失败,并执行预设的降级逻辑,以减少对不可用服务的依赖。

  3. 监控和统计:HystrixCommand 提供了丰富的监控和统计功能,可以实时监控服务调用的成功率、失败率、响应时间等指标,并提供了可视化的仪表盘。这些统计数据可以帮助开发人员了解服务的健康状况,及时发现和解决潜在的问题。

HystrixCommand 的使用场景主要包括:

  1. 微服务架构:在微服务架构中,服务之间的调用是不可避免的。使用 HystrixCommand 可以有效地处理服务调用的容错和熔断问题,提高系统的可用性和稳定性。

  2. 高并发场景:在高并发的场景下,如果某个服务出现故障或响应缓慢,会导致整个系统的性能下降。使用 HystrixCommand 可以通过设置超时时间和线程池隔离等策略,避免因单个服务的故障而影响整个系统的性能。

  3. 服务降级:在一些特殊情况下,为了保证核心功能的可用性,可能需要对某些非关键的功能进行降级处理。使用 HystrixCommand 可以方便地实现服务的降级逻辑,保证核心功能的稳定性。

三、业务场景

多个独立的业务逻辑场景非常适合使用 Netflix Hystrix 框架,它能并发执行所有的业务逻辑,帮我们提升系统的访问速度。

也能方便的监控每个业务逻辑执行时发生的异常、超时等异常,也很方便配置各个业务逻辑的兜底(fallback)等。

具体的业务场景如:多个独立的弹窗、多个独立的展示数据。这种业务场景都是一个页面位置中可能出现多种业务。

四、应用代码示例
4.1 抽象类

定制化自己的 AbstractCustomerCommand 类,这个类能够实现所有业务逻辑通用的逻辑。

也能实现,对每个业务逻辑发生 reject、异常、超时、熔断的时候的监控和日志。

public abstract class AbstractCustomerCommand<R> extends HystrixCommand<R> {private final static Logger logger = LoggerFactory.getLogger(AbstractCustomerCommand.class);public String key;protected AbstractSecondScreenCommand(CommandThreadEnum commandThreadEnum) {}@Overrideprotected R run() throws Exception {long t1 = System.currentTimeMillis();R r = null;try {r = doExecute(t1);} finally {long cost = System.currentTimeMillis() - t1;}return r;}@Overrideprotected R getFallback() {boolean isRejected = isResponseRejected();boolean isException = isFailedExecution();boolean isTimeout = isResponseTimedOut();boolean isCircuit = isCircuitBreakerOpen();// 添加异常情况的日志和监控logger.error("{} fallback happened,isRejected:{},isException:{},isTimeout:{},isCircuit:{}",key, isRejected, isException, isTimeout, isCircuit);Throwable exception = getExecutionException();if (exception != null) {logger.error("{} fallback", key, exception);}return null;}protected abstract R doExecute(long start);/*所有业务逻辑统一逻辑*/public void commonLogic() {}
}
4.2 具体的业务场景类
@Slf4j
public class Case1Command extends AbstractCustomerCommand<User> {// 构造函数public LowPriceAreaCommand() {}@Overrideprotected DisplayCard doExecute(long start) {// 具体业务逻辑}
}
4.3 执行
Case1Command caseCommand = new Case1Command();
// 异步执行
caseCommand.queue();
四、总结

com.netflix.hystrix.HystrixCommand 是 Netflix Hystrix 框架中的核心类,用于实现服务的容错和熔断功能。

它通过封装远程服务调用,提供容错处理、熔断机制和监控统计等功能,适用于微服务架构和高并发场景。通过使用 HystrixCommand,可以提高系统的可用性、稳定性和性能。

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

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

相关文章

论坛介绍 | COSCon'23 云计算(C)

众多开源爱好者翘首期盼的开源盛会&#xff1a;第八届中国开源年会&#xff08;COSCon23&#xff09;将于10月28-29日在四川成都市高新区菁蓉汇举办。本次大会的主题是&#xff1a;“开源&#xff1a;川流不息、山海相映”&#xff01;各位新老朋友们&#xff0c;欢迎到成都&am…

一些bug总结

今天被几个小问题和bug折磨了一天&#xff0c;来总结一下… 权限问题 用vscode连接服务器&#xff0c;如果是在root用户连接的情况下新建的文件/文件夹&#xff0c;然后切换到别的用户的时候去写的代码 可能会遇到各种问题 解决方案是更改文件或文件夹的所有权。这可以通过使用…

ubuntu 18.04 LTS交叉编译opencv 3.4.16并编译工程[全记录]

一、下载并解压opencv 3.4.16源码 https://opencv.org/releases/ 放到home路径下的Exe文件夹&#xff08;专门放用户安装的软件&#xff09;中&#xff0c;其中build是后期自建的 为了版本控制&#xff0c;保留了3.4.16&#xff0c;并增加了-gcc-arm 二、安装cmake和cmake-g…

微信小程序使用本地存储方法

微信小程序提供了本地存储的方法 wx.setStorageSync() 和 wx.getStorageSync()&#xff0c;可以用 于在用户本地存储数据。 wx.setStorageSync() wx.setStorageSync() 方法用于将数据存储到本地缓存中。该方法是同步的。 wx.setStorageSync(key, data) 参数说明&#xff1a; …

Redis:Feed流之Timeline的实现

当我们关注了用户后&#xff0c;这个用户发了动态&#xff0c;那么我们应该把这些数据推送给用户&#xff0c;这个需求&#xff0c;其实我们又把他叫做Feed流&#xff0c;关注推送也叫做Feed流&#xff0c;直译为投喂。为用户持续的提供“沉浸式”的体验&#xff0c;通过无限下…

5.Vue-在Vue框架中实现Vue的增删改查

题记 在vue框架中实现vue的增删改查&#xff0c;以下是具体操作流程和代码 编写TestView.vue文件 TestView.vue文件如下&#xff1a; <template> <div id"app"> <h1>学生列表</h1> <input type"text" v-model"searchQue…

使用 VS Code 作为 VC++ 6.0 的编辑器

使用 VS Code 作为 VC 6.0 的编辑器 由于一些众所周知的原因&#xff0c;我们不得不使用经典&#xff08;过时&#xff09;的比我们年龄还大的已有 25 年历史的 VC 6.0 来学习 C 语言。而对于现在来说&#xff0c;这个经典的 IDE 过于简陋&#xff0c;并且早已不兼容新的操作系…

KNN算法

文章目录 释义欧氏距离simple——KNNsklearn——KNN 释义 近朱者赤近墨者黑----从训练数据集中找出和待预测样本最接近的K个样本 对于分类问题&#xff0c;我们使用了多数表决法来判断目标对象的类别。 对于回归问题&#xff0c;我们使用了平均值法来判断目标对象的数值 如上…

【YOLO】语义分割和实例分割(四)

0 YOLO系列笔记 【YOLO】朴实无华的yolov5环境配置&#xff08;一&#xff09; 【YOLO】yolov5训练自己的数据集&#xff08;二&#xff09; 【YOLO】目标识别模型的导出和opencv部署&#xff08;三&#xff09; 1 前言 在之前的实践过程中&#xff0c;总结了如何使用YOLOv…

Vue3响应式原理初探

vue3响应式原理初探 为什么要使用proxy取代defineProperty使用proxy如何完成依赖收集呢&#xff1f; 为什么要使用proxy取代defineProperty 原因1&#xff1a;defineproperty无法检测到原本不存在的属性。打个&#x1f330; new Vue({data(){return {name:wxs,age:25}}})在vue…

WuThreat身份安全云-TVD每日漏洞情报-2023-10-13

漏洞名称:libcue <2.2.1 越权访问漏洞 漏洞级别:高危 漏洞编号:CVE-2023-43641,CNNVD-202310-579 相关涉及:系统-alpine_edge-libcue-*-Up to-(excluding)-2.2.1-r0- 漏洞状态:未定义 参考链接:https://tvd.wuthreat.com/#/listDetail?TVD_IDTVD-2023-25092 漏洞名称:科大…

电脑版便签软件下载用哪个?

在面对每天繁忙的工作日程&#xff0c;电脑是许多上班族不可或缺的工作助手&#xff0c;而一款得心应手的电脑便签软件&#xff0c;更是可以帮助大家记录、提醒、督促各项任务按时完成的得力助手。那么&#xff0c;究竟在众多的电脑便签软。件中&#xff0c;哪一位能够真正成为…

Ubuntu:Arduino IDE 开发环境配置【保姆级】

物联网开发学习笔记——目录索引 本章主要介绍在Ubuntu系统搭建Arduino IDE 开发环境&#xff0c;windows系统请移步&#xff1a;Windows&#xff1a;Arduino IDE 开发环境配置【保姆级】 参考官网&#xff1a;Arduino - Home 有关更多详细信息&#xff0c;请参阅 Arduino I…

SpringCloud微服务(注册发现Nacos、服务调用SSM、网关gateway)项目环境搭建(项目概况,SSM细节总结)

目录 1.nacos环境搭建nacos安装 2.项目主体结构6.2)表结构分析6.4)**运营端微服务搭建**6.4)登录功能实现 7)接口工具postman、swagger、knife4j7.1)postman7.2)swagger7.3)knife4j 8)网关9)前端集成9.1)前端项目部署思路9.2)配置nginx 1.nacos环境搭建 nacos安装 ①&#xf…

LDAP用户密码自服务平台搭建

源码地址&#xff1a;https://github.com/ltb-project/self-service-password 官方文档 &#xff1a;https://self-service-password.readthedocs.io/en/latest/ 1.创建配置文件 mkdir -p /opt/ssp cd /opt/ssp vim ssp.conf.php2.在ssp.conf.php其中输入如下配置选项&#…

ELK日志分析系统的详细介绍与部署

文章目录 1. ELK的概述1.1 简介1.2 使用ELK的理由1.3 ELK的主要组件1.3.1 Elasticsearch1.3.2 Kibana1.3.3 Logstash1.3.3.1 简介1.3.3.2 Logstash常用相关命令选项 1.3.3.3 Logstash 的输入和输出流1.3.4 Logstash的相关配置文件 1.3.4 Filebeat1.3.4.1 简介1.3.4.2 filebeat …

数学分析:傅里叶级数

卓里奇书好的一点就是&#xff0c;不是直接引出公式&#xff0c;而是告诉你理由。先引出正交的概念&#xff0c;然后在函数空间中&#xff0c;也有正交&#xff0c;只不过是无限维的空间。 这里要注意&#xff0c;明确说明了是有限个。 在函数空间里面&#xff0c;内积是指进行…

Go 深入解析非类型安全指针

一、引言 非类型安全指针&#xff08;也称为“裸指针”或“原始指针”&#xff09;在编程领域中一直是一个具有争议和挑战性的主题。它们赋予程序员直接操作计算机内存的能力&#xff0c;为高级性能优化和底层系统交互提供了可能。然而&#xff0c;这种能力往往伴随着高风险&a…

studio one6值不值得下载?好用吗

零基础学混音&#xff0c;持之以恒才能有所收获。首先要明确自己的学习目标&#xff0c;然后选择适合自己的教程。这套教程适用于后期制作和直播&#xff0c;同样适用。我切换到了桌面屏幕。 在这个基础上运行&#xff0c;它提供了适合零基础的模板&#xff0c;适合直播唱歌或…

【iOS】使用单例封装通过AFNetworking实现的网络请求

这里写目录标题 前言单例封装网络请求1. 首先创建一个继承于NSObject的单例类&#xff0c;笔者这里以Manager对单例类进行命名&#xff0c;然后声明并实现单例类的初始化方法2.实现完单例的创建方法后我们即可通过AFNetworking中的GET方法进行网络请求3.在Controller文件中创建…