Hystrix 容错处理
雪崩效应
在一个微服务系统之中,各个服务之间存在相互依赖,如A-->B-->C,
一旦C由于某种原因无法使用,则会导致A、B都无法使用
超时线程会一直等待下去,处于阻塞状态。一旦这种请求多了,则系统就崩了
在分布式系统中,如果一个服务长期被占用,则可以通过断路器直接返回错误信息,
释放资源,避免了错误在分布式系统中的蔓延。
术语:基础服务故障导致级联故障的现象称为雪崩效应。
容错的基本思想
- 网络请求超时设置
每次请求,其返回必须是明确的。
要么返回正常数据,要么在指定时长后返回异常数据。
不应该陷入无限制的等待中
- 断路器模式
断路器可以理解为对容易导致错误的操作的代理。
这种代理能够统计一段时间内调用失败的次数,并决定是正常请求还是直接返回。
当某个服务的请求失败率达到阀值后,应该开启断路器,使该服务不再被调用。
断路器启动后,过会儿允许调用被关闭的服务,检测一下是否已经恢复正常
什么是Hystrix
Hystrix是一个实现了超时机制和断路器模式的工具类库。
用于隔离远程访问系统、服务或者第三方库,防止级联失败。
从而提升系统的可用性与容错性。
通过以下几点实现延迟和容错
- 包裹请求
调用依赖的服务,这个过程在独立线程中执行
- 跳闸机制
当服务错误率到达设定的阀值,Hystrix可以自动或者手动跳闸。
停止该服务一段时间。
- 资源隔离
Hystrix为每个依赖的服务都维护了一个小型的线程池(或信号量)
如果该线程池已满,则发往该服务的请求立马被拒绝,而不是排队等候。加速失败判定。
- 监控
- 回退机制
请求失败后,执行回退逻辑
一般是回滚一些操作或执行降级服务
- 自我修复
断路器打开一段时间后检查服务是否可用
如果服务可用使用了,则继续提供服务
简单使用
消费端使用Hystrix
- pom
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
注解开启
在启动类上使用注解开启
@EnableCircuitBreaker//注解开启断路器功能
此时我们的启动类上就有了3个注解
@EnableDiscoveryClient//注册为Eureka客户端
@EnableCircuitBreaker//注解开启断路器功能
@SpringBootApplication
这三个注解可以使用一个注解代替
@SpringCloudApplication
是等效的,因为@SpringCloudApplication
的源码如下
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootApplication
@EnableDiscoveryClient
@EnableCircuitBreaker
public @interface SpringCloudApplication {
}
可见,Spring Cloud官方认为,对于一个Spring Cloud应用,
是应该包含服务发现与断路器的
改造消费方法
新增一个service层代码
package org.zln.spb.service;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
/**
* Created by nbcoolkid on 2017-10-21.
*/
@Service
public class HelloService {
@Autowired
private RestTemplate restTemplate;
@HystrixCommand(fallbackMethod = "helloFallBack")
public String helloService(String name) {
return restTemplate.getForObject("http://HELLO-SERVICE/hello?name={1}", String.class, name);
}
public String helloFallBack(String name) {
return "error" + name;
}
}
@HystrixCommand(fallbackMethod = "helloFallBack")
当调用失败的时候,就去调用helloFallBack方法
那么什么是调用失败呢?链路断了、超时等。
默认Hystrix的超时时间为2000ms,只要超过2秒没有响应,就会认为本次调用失败
值得一提的是这个错误回调方法的参数与返回类型,需要与helloService保持一致
这里,我们的fallbackMethod是一个异常提示信息,
另一种常见的情况是调用方法A失败后,去调用方法B
方法B失败后,去调用方法C,也就是helloFallBack上也是可以使用@HystrixCommand的
形成一个异常调用的执行链,形成服务降级链条
@HystrixCommand 详细配置
在上例中,我们只是使用fallbackMethod
属性配置了调用异常后的回调方法。
其实还有很多更加强大的配置项,下面我们详细讲讲。
@HystrixCommand(fallbackMethod = "helloFallBack", commandProperties = {
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "5000"),
@HystrixProperty(name = "metrics.rollingStats.timeInMilliseconds", value = "10000")
}, threadPoolProperties = {
@HystrixProperty(name = "coreSize", value = "1"),
@HystrixProperty(name = "maxQueueSize", value = "10")
})
public String helloService(String name) {
return restTemplate.getForObject("http://demo02-provider/test/t1?name={name}", String.class, name);
}
@HystrixCommand
除了可以配置在Service
层,
其实更多的是配置在Controller
层。
对于一笔服务调用来说,Controller
才是他的入口
更详细的配置信息:https://github.com/Netflix/Hystrix/wiki/Configuration
Hystrix线程隔离策略与传播上下文
Hystrix的隔离策略有两种
- 线程隔离(默认)
HystrixCommand将会在单独的线程上执行,并发请求受线程池中的线程数量的限制。
- 信号量隔离
HystrixCommand将会在调用线程执行,开销相对较小。
并发请求受到信号量个数的限制。
之所以默认使用线程隔离,是因为这种方式有一个除了网络超时以外的额外保护层。
一般只有当负载非常高(每个实例每秒数百次)才需要使用信号量隔离。
信号量隔离一般仅适用于非网络调用的隔离。
使用execution.isolation.strategy
属性指定隔离策略
@HystrixCommand(fallbackMethod = "helloFallBack", commandProperties = {
@HystrixProperty(name = "execution.isolation.strategy", value = "SEMAPHORE")
}, threadPoolProperties = {
@HystrixProperty(name = "coreSize", value = "1"),
@HystrixProperty(name = "maxQueueSize", value = "10")
})
SEMAPHORE
表示信号量,THREAD
表示线程。
当然,如果采用线程隔离的话,不配置就行了。
Hystrix监控
状态监控
Hystrix断路器的状态也会暴露在Actuator的/health端点中,所以我们引入Actuator模块。
注意:
management:
security:
enabled: false
配置上述,用于在/health端点中查看到更多信息。
小实验:
在消费端引入Hystrix作为断路器,引入Actuator作为监控组件。
- 正常访问
对其中的服务进行正常访问
- 查看/health
访问消费端的 http://localhost:10005/health,显示服务端正常
- 停止服务提供者
因为服务提供者停止了,消费者访问肯定会失败。
所以这个时候进行请求,会返回降级处理的结果。
- 继续访问/health
这个时候虽然服务提供者已经挂了,
但是我们访问消费者的/health端点,仍旧任务服务处于up状态。
那因为失败率还没到达阀值。(默认5秒内20次失败)
- 触发阀值
通过多个标签页,不停的访问消费者。达到触发断路器的条件。
此时再访问/health端点,就能够发现Hystrix的status处于CIRCUIT_OPEN状态了。
Hystrix 容错处理的更多相关文章
- (四)Hystrix容错保护
Feign默认是整合了Ribbon和Hystrix这两个框架,所以代码我们在上一篇的基础上进行修改,启动Eureka,service-hello,Feign 所谓的熔断机制和日常生活中见到电路保险丝是 ...
- SpringCloud之Hystrix容错保护原理及配置
1 什么是灾难性雪崩效应? 如下图的过程所示,灾难性雪崩形成原因就大致如此: 造成灾难性雪崩效应的原因,可以简单归结为下述三种: 服务提供者不可用.如:硬件故障.程序BUG.缓存击穿.并发请求量过大等 ...
- Hystrix (容错,回退,降级,缓存)
Hystrix熔断机制就像家里的保险丝一样,若同时使用高功率的电器,就会烧坏电路,这时候保险丝自动断开就有效的保护了电路.而我们程序中也同样是这样.例如若此时数据库压力太大速度很慢,此时还有不断的请求 ...
- SpringCloud学习笔记(4):Hystrix容错机制
简介 在微服务架构中,微服务之间的依赖关系错综复杂,难免的某些服务会出现故障,导致服务调用方出现远程调度的线程阻塞.在高负载的场景下,如果不做任何处理,可能会引起级联故障,导致服务调用方的资源耗尽甚至 ...
- Hystrix容错处理
如果服务提供者响应非常缓慢,那么消费者对提供者的请求就会被强制等待,直接提供者响应或超时.在高负载场景下,如果不做任何处理,此类问题可能会导致服务消费者的资源耗竭甚至整个系统的崩溃.这时,就需要进行容 ...
- Spring Cloud08: Hystrix 容错机制与数据监控
一.概述 容错机制是指的是在一个分布式系统中,每个微服务之间是相互调用的,并且他们之间相互依赖,而实际的运行情况中,可能会因为各种原因导致某个微服务不可用,那么依赖于这个微服务的其他微服务就可能出现响 ...
- SpringCloud Alibaba实战(9:Hystrix容错保护)
源码地址:https://gitee.com/fighter3/eshop-project.git 持续更新中-- 在上一节我们已经使用OpenFeign完成了服务间的调用.想一下,假如我们一个服务链 ...
- Spring Cloud入门教程-Hystrix断路器实现容错和降级
简介 Spring cloud提供了Hystrix容错库用以在服务不可用时,对配置了断路器的方法实行降级策略,临时调用备用方法.这篇文章将创建一个产品微服务,注册到eureka服务注册中心,然后我们使 ...
- 【Dalston】【第四章】容错保护(Hystrix)
我们在实践微服务架构时,通常会将业务拆分成一个个微服务,微服务之间通过网络进行通信,进行互相调用,造成了微服务之间存在依赖关系.我们知道由于网络原因或者自身的原因,服务并不能保证服务的100%可用,如 ...
随机推荐
- Qt-网易云音乐界面实现-3 音乐名片模块的实现
这个模块其实我是不知道该叫什么的,暂时就叫做音乐名片模块吧,这可以看到,这个模块简单的显示以下信息. 1. 歌曲名称 2. 歌曲歌唱者 3. 歌曲封面 4. 喜欢歌曲的按钮 5. 分享歌曲的按钮 6. ...
- Spring集成Kafka-注解,xml配置2种方式实现
准备工作: 1.安装kafka+zookeeper环境 2.利用命令创建好topic 参考官网 http://kafka.apache.org/documentation/ 一XML配置文件方式实现
- 【LeetCode算法题库】Day7:Remove Nth Node From End of List & Valid Parentheses & Merge Two Lists
[Q19] Given a linked list, remove the n-th node from the end of list and return its head. Example: G ...
- ClassLoader.loadClass()与Class.forName()的区别
ClassLoader.loadClass()与Class.forName()都是反射用来构造类的方法,但是他们的用法还是有一定区别的. 在讲区别之前,我觉得很有不要把类的加载过程在此整理一下. 在J ...
- 如何利用京东云的对象存储(OSS)上传下载文件
作者:刘冀 在公有云厂商里都有对象存储,京东云也不例外,而且也兼容S3的标准因此可以利用相关的工具去上传下载文件,本文主要记录一下利用CloudBerry Explorer for Amazon S3 ...
- Python基础系列讲解——继承派生和组合的概念剖析
Python作为一门面向对象的语言,它的面向对象体系中主要存在这么两种关系,一个是“类”和“实例”的关系,另一个是“父类”和“子类”的关系. 所谓“类”是从一堆对象中以抽象的方式把相同的特征归类得到的 ...
- Django之Models与ORM操作
一.models例子 from django.db import models class User(models.Model): """ 用户表 "" ...
- python将response中的cookies加入到header
url = “http://abad.com”header = { "user-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64 ...
- iOS - Bundle 资源文件包生成和常见资源文件使用
1.Bundle 文件 Bundle 文件,就是资源文件包.我们将许多图片.XIB.文本文件组织在一起,打包成一个 Bundle 文件.方便在其他项目中引用包内的资源. Bundle 文件是静态的,也 ...
- AJAX(Asynchronous JavaScript and XML)学习笔记
基本概念: 1.AJAX不是一种新的编程语言,而是一种使用现有标准的新方法. 2.AJAX最大的优点是在不重新加载整个页面的情况下,与服务器交换数据并更新部分网页内容,用于创建快速动态网页(传统网页如 ...