SpringCloud断路器Hystrix全面解析

在微服务场景中,通常会有很多层的服务调用。如果一个底层服务出现问题,故障会被向上传播给用户。我们需要一种机制,当底层服务不可用时,可以阻断故障的传播。这就是断路器的作用。他是系统服务稳定性的最后一重保障。

在springcloud中断路器组件就是Hystrix。Hystrix也是Netflix套件的一部分。他的功能是,当对某个服务的调用在一定的时间内(默认10s,由metrics.rollingStats.timeInMilliseconds配置),有超过一定次数(默认20次,由circuitBreaker.requestVolumeThreshold参数配置)并且失败率超过一定值(默认50%,由circuitBreaker.errorThresholdPercentage配置),该服务的断路器会打开。返回一个由开发者设定的fallback

fallback可以是另一个由Hystrix保护的服务调用,也可以是固定的值。fallback也可以设计成链式调用,先执行某些逻辑,再返回fallback。

如何使用

Netflix断路器是安装在服务消费者上。我们需要做的是在服务消费者上开启断路器并配置。

Ribbon消费者:

1,引入依赖

2,打开开关

只需要在启动类上加上@EnableCircuitBreaker注解即可

3,在服务上加上fallback

4,测试,将服务提供者关掉

过一会,再将服务提供者启动,可以观察到,服务消费者自动恢复。

注意,配置的fallbackMethod方法必须与被@HystrixCommand注解的方法有意向的入参和返回值

否则会报错fallback method wasn‘t found: defaultFallback

在Feign中使用

@EnableFeignClients中已经默认打开了断路器功能,所以这里的启动类上不需要再加@EnableCircuitBreaker注解

只需要在@FeignClient中为fallback参数指定fallback方法

因为@FeignClient注解的是接口,所以我们必须创建一个替代的类,就像mock一样

创建一个实现了HelloService接口的类

最后一步

在配置文件application.yml中开启断路器

在很早的版本中,Feign的断路器默认是开启的。后来有人提issue,认为这样不方便。一旦使用Feign就默认使用了断路器功能,导致了一些问题。后面从D版本开始断路器就是默认关闭的,需要手动打开。

可以看到和Ribbon一样的效果

注意事项

如果方法执行需要用到Thread Local的属性,这个属性默认是不能传递到fallback方法中的,因为在Hystrix中, 主要通过线程池来实现资源隔离. 通常在使用的时候我们会根据调用的远程服务划分出多个线程池. 例如调用产品服务的Command放入A线程池, 调用账户服务的Command放入B线程池. 这样做的主要优点是运行环境被隔离开了. 这样就算调用服务的代码存在bug或者由于其他原因导致自己所在线程池被耗尽时, 不会对系统的其他服务造成影响. 但是带来的代价就是维护多个线程池会对系统带来额外的性能开销. 如果是对性能有严格要求而且确信自己调用服务的客户端代码不会出问题的话, 可以使用Hystrix的信号模式(Semaphores)来隔离资源.

你需要做如下配置

Hystrix Dashboard

既然断路器可以检测到服务的可用性,但是不够直观。Hystrix Dashboard可以提供一个监控平台,方便查看服务的可用性。

1,新建一个工程

因为Dashboard是一个统一的断路器监控平台,所以我们新建一个项目。不和现在服务消费者混在一起

2,引入依赖

3,注解启动类

用@EnableHystrixDashboard注解启动类

启动引用,访问/hystrix

看上面的说明,我们可以知道,Hystrix Dashboard共支持三种不同的监控方式

1,默认的集群监控:通过URL:turbine-hostname:port/turbine.stream开启,实现对默认集群的监控。

2,指定的集群监控:通过URL:turbine-hostname:port/turbine.stream?cluster=[clusterName]开启,实现对clusterName集群的监控。

3,单体应用的监控:通过URL/hystrix-app:port/hystrix.stream开启,实现对具体某个服务实例的监控。

注意,这里有点问题,我们以前说过,从springboot2开始,actuator都是要在请求路径加上/actuator,也就是hystrix-app:port/actuator/hystrix.stream才对

Delay:控制服务器上轮询监控信息的延迟时间,默认为2000毫秒,可以通过配置该属性来降低客户端的网络和CPU消耗。

Title:该参数可以展示合适的标题。

监控单个实例的服务

我们先测试第3个,监控单个实例的服务。这个最好理解

对于Robbon工程,在上面我们已经加好了断路器。现在需要做的是引入actuator依赖

然后暴露hystrix.stream接口

启动应用。

现在我把windows10.microdone.cn:8781/actuator/hystrix.stream的服务填上,点击Monitor

多点击几次请求,可以看到请求的成功失败情况被监控起来了

对于Feign

我们上面讲过,Feign自己已经集成了断路器。但是如果要暴露hystrix.stream接口,还是必须引入spring-cloud-starter-netflix-hystrix依赖,在启动类上打上@EnableCircuitBreaker注解注解

然后测试,和Ribbon一样的效果

Turbine

turbine又是个什么概念?

Turbine是Netflix的一个独立项目,单独的一个springcloud实例的断路器数据用处并不大,而且很麻烦,像上面我们有两个消费者项目,就需要开两个页面查看,能不能把这些监控都聚合在以前看呢?

当然是可以的,所以才有了这个Turbine项目

Turbine的原理是,通过将将自己注册到注册中心,发现同一个注册中心上的hystrix服务,然后聚合数据。再通过暴露自己的端点,在仪表盘上进行展示。

操作:

1,创建一个应用

2,引入依赖:

启动类注解:

@EnableTurbine @EnableDiscoveryClient

yml配置:

启动,我们现在8792端口起来了turbine

在到hystrix页面,在监控地址填127.0.0.1:8792/turbine.stream

点击monitor

可以看到已经将feign和ribbon两个工程的消费者集合在了一起

服务名HelloService#hello(String)和hiService 是被Hystrix fallback的方法名

关于default

cluster-name-expression集群名字,可以是spel表达式,这里用的是默认的default。如果想自定义集群的名字,改为如下配置:

turbine:# 要监控的应用,多个用逗号隔开 app-config: feign-consumer,ribbon-consumer # 指定聚合哪些集群,多个使用","分割,默认为default aggregator: cluster-config: ribbon,feign # 配合被监控的应用使用。假设想要监控的应用配置了eureka.instance.metadata-map.cluster: ABC,则需要配置,同时turbine.aggregator.clusterConfig: ABC cluster-name-expression: metadata[‘cluster‘] # 让同一主机上的服务通过主机名与端口号的组合来进行区分,默认情况下会以host来区分不同的服务,这会使得在本机调试的时候,本机上的不同服务聚合成一个服务来统计。 combine-host-port: true

这个配置是用了两个集群,ribbon和feign

cluster-name-expression配的是取元数据的cluster值

这个就需要对应去修改被监控应用的配置文件了,

ribbon消费者工程:

feign消费者工程:

全部重启一下

再去hystrix页面

这个时候再用 127.0.0.1:8792/turbine.stream是连不上的,因为集群名字已经变了,不再有default集群了

分别用127.0.0.1:8792/turbine.stream?cluster=feign和ribbon去监控

这样区分的作用是,如果公司有很多的服务,可以通过区分集群来分别查看。

转载自:https://baijiahao.baidu.com/s?id=1623004854011062838&wfr=spider&for=pc

原文地址:https://www.cnblogs.com/aboutYouH/p/12552062.html

时间: 2024-10-09 15:51:40

SpringCloud断路器Hystrix全面解析的相关文章

SpringCloud断路器(Hystrix)

一.为什么需要 Hystrix? 在微服务架构中,我们将业务拆分成一个个的服务,服务与服务之间可以相互调用(RPC).为了保证其高可用,单个服务又必须集群部署.由于网络原因或者自身的原因,服务并不能保证服务的100%可用,如果单个服务出现问题,调用这个服务就会出现网络延迟,此时若有大量的网络涌入,会形成任务累计,导致服务瘫痪,甚至导致服务“雪崩”.为了解决这个问题,就出现断路器模型. Hystrix 是一个帮助解决分布式系统交互时超时处理和容错的类库, 它同样拥有保护系统的能力 什么是服务雪崩

SpringCloud学习系列之三----- 断路器Hystrix和断路器监控Dashboar

前言 本篇主要介绍的是SpringCloud中的断路器(Hystrix)和断路器指标看板(Dashboard)的相关使用知识. SpringCloud Hystrix Hystrix 介绍 Netflix创建了一个名为Hystrix的库,它实现了断路器模式.主要的目的是为了解决服务雪崩效应的一个组件,是保护服务高可用的最后一道防线. 开发准备 开发环境 JDK:1.8 SpringBoot:2.1.1.RELEASE SpringCloud:Finchley 注:不一定非要用上述的版本,可以根据

springcloud熔断器Hystrix

熔断器 雪崩效应 在微服务架构中通常会有多个服务层调用,基础服务的故障可能会导致级联故障,进而造成整个系统不可用的情况,这种现象被称为服务雪崩效应.服务雪崩效应是一种因"服务提供者"的不可用导致"服务消费者"的不可用,并将不可用逐渐放大的过程. 如果下图所示:A作为服务提供者,B为A的服务消费者,C和D是B的服务消费者.A不可用引起了B的不可用,并将不可用像滚雪球一样放大到C和D时,雪崩效应就形成了. 图片描述(最多50字) 熔断器(CircuitBreaker)

12、Feign整合断路器Hystrix

公众号: java乐园 上编说了<RestTemplate+Ribbon整合断路器Hystrix>,这篇来看看如何Feign整合断路器Hystrix,Feign整合断路器Hystrix也是相对比较简单的.Feign默认已经自带断路器Hystrix,所以不需要像RestTemplate+Ribbon整合断路器Hystrix那样需要在SpringBoot的启动类添加注解.但是Feign自带断路器并没有打开,需要做些额外的配置. feign: hystrix: enabled: true 1. 新建

断路器Hystrix与Turbine集群监控-Spring Cloud学习第三天

文章大纲 一.Hystrix基础介绍二.断路器Hystrix简单使用三.自定义Hystrix请求命令四.Hystrix的服务降级与异常处理五.Hystrix的请求缓存与请求合并六.Hystrix仪表盘与Turbine集群监控七.项目源码与参考资料下载八.参考文章 一.Hystrix基础介绍 1. Hystrix简介   一个用户管理项目,里边就三个功能:用户注册.用户登录.用户详情浏览.按照传统的软件开发方式直接创建一个Web项目,分分钟就把这三个功能开发出来了,但是我现在想使用微服务+服务治理

springcloud的Hystrix turbine断路器聚合监控实现(基于springboot2.02版本)

本文基于方志朋先生的博客实现:https://blog.csdn.net/forezp/article/details/70233227 一.准本工作 1.工具:Idea,JDK1.8,Maven3.5 2.创建四个model,名字分别为eurserver(服务注册中心),service-hi(实现断路监控),service-lucy(实现断路监控),service-turbine(断路器聚合监控) 二.创建与实现 1.创建服务注册中心eurserver,右键工程,new ==> model,然

springcloud入门之断路器Hystrix(四)

什么是断路器 断路器模式源于Martin Fowler的Circuit Breaker一文."断路器"本身是一种开关装置,用于在电路上保护线路过载,当线路中有电器发生短路时,"断路器"能够及时的切断故障电路,防止发生过载.发热.甚至起火等严重后果. 在分布式架构中,断路器模式的作用也是类似的,当某个服务单元发生故障(类似用电器发生短路)之后,通过断路器的故障监控(类似熔断保险丝),向调用方返回一个错误响应,而不是长时间的等待.这样就不会使得线程因调用故障服务被长时间

Hystrix断路器配置属性解析

HystrixCommand 配置方式 我们的配置都是基于 HystrixCommand 的,我们通过在方法上添加 @HystrixCommand 注解并配置注解的参数来实现配置,但有的时候一个类里面会有多个 Hystrix 方法,每个方法都是类似配置的话会冗余很多代码,这时候我们可以在类上使用 @DefaultProperties 注解来给整个类的 Hystrix 方法设置一个默认值. 配置项 下面是 HystrixCommand 支持的参数,除了 commandKey/observableE

第四篇 断路器(Hystrix) --IDEA SpringCloud全攻略 亲测可用

写在开始 在SpringCloud项目中,服务之间相互调用(RPC Remote Procedure Call -远程过程调用),处于调用链路底层的服务产生不可用情况时,请求会产生堆积使得服务器线程阻塞,甚至导致服务器瘫痪.断路器就是为了解决服务不可用问题的方法. 正文开始 本篇在第三篇基础上进行代码编写,介绍的断路器是基于Ribbon类型的断路器 新建项目的用户可以在构建项目时勾选下面组件 已经搭建项目的用户可以在pom中增加 <!--断路器插件--> <dependency>