spring cloud中使用hystrix实现回退
在微服务架构中,我们的服务被拆分成多个微服务,每个微服务完成自己的职责,微服务之间通过rpc或http进行调用。这个时候我们就要确保我们的服务高可用,但谁也说不准我们的服务能永远快速的提供服务。假如现在发生了这个一种情况 A->B->C->D->E 即A服务调用B服务,B调用C服务,C调用D服务,D调用E服务,这个时候我们的E服务过载,响应速度特别慢,当并发高时,我们的请求就会堆积在E服务,E服务无法返回,导致请求堆积在D服务,以此类推,就会导致请求依次堆积在我们的这个调用链上,最终导致所有的服务都不可用,形成服务的雪崩。下面以一个简单的图来表示服务的雪崩。
为了解决以上问题,spring cloud中为我们提供了 hystrix 断路器来保护我们的应用程序。
断路器机制:hystrix存在三种状态:CLOSED、OPEN和HALF_OPEN。默认情况下为CLOSED,当一个服务在一定的时间内(metrics.rollingStats.timeInMilliseconds默认10s),请求次数达到了某个阀值(circuitBreaker.requestVolumeThreshold默认20次),并且错误率也达到了某个阀值(circuitBreaker.errorThresholdPercentage默认>50%),此时断路器变成了OPEN的状态,当断路器打开,过了一定的时间(circuitBreaker.sleepWindowInMilliseconds默认为5s)将会放行一个请求,此时变成HALF_OPEN状态,如果可以访问就变成CLOSED否则变成OPEN状态
资源隔离:hystrix为每个依赖都提供了一个线程池或信号量。当线程池满了之后,发往该依赖的请求会被直接拒绝,从而加速失败。
注意: 进入fallback方法并不意味者断路器一定是打开的,请求失败、超时、被拒绝以及断路器打开时都会执行回退逻辑。
需求:
1、在feign中使用hystrix
2、在降级方法中获取到为什么进入了降级方法
代码结构:
eureka-server
|- 服务注册中心
hystrix
product-provider-8091
|- 服务提供者
product-consumer-feign-hystrix-8093
|- feign 和 hystrix的整合
feign
fallback
ProductServiceFeignFallback(回退实现)
ProductServiceFeignFallbackFactory(可以获知为何进入回退)
代码实现
一、注册中心和服务提供者的实现(见下方的代码)
二、服务消费者(需要引入hystrix)
1、feign和hystrix引入
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
2、启动方法上增加@EnableCircuitBreaker 注解
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
@EnableCircuitBreaker
public class ApplicationProductConsumer8093 {
public static void main(String[] args) {
SpringApplication.run(ApplicationProductConsumer8093.class, args);
}
}
3、配置文件中在feign中启动hystrix
feign:
hystrix:
enabled: true
4、回退的实现,fallback的实现
注意: fallbackFatory 需要注意的事项
5、控制层的写法
/**
* 商品控制器
*
* @author huan.fu
* @date 2018/5/30 - 16:52
*/
@RestController
@RequestMapping("product")
public class ProductController {
@Autowired
private ProductService01Feign productService01Feign;
@Autowired
private ProductService02Feign productService02Feign;
/**
* 获取商品信息
*
* @param productId
* @return
*/
@GetMapping("/01/selectOne/{productId}")
public Map<String, Object> select01ByProductId(@PathVariable String productId) {
return productService01Feign.selectByProductId(productId);
}
/**
* 获取商品信息
*
* @param productId
* @return
*/
@GetMapping("/02/selectOne/{productId}")
public Map<String, Object> select02ByProductId(@PathVariable String productId) {
return productService02Feign.selectByProductId(productId);
}
}
/product/01/selectOne/{productId} ===> fallback 回退
/product/02/selectOne/{productId} ===> fallbackFactory 回退,可以知道回退的原因
6、测试
测试的服务启动者先启动,然后停止看效果。
完整代码
https://gitee.com/huan1993/spring-cloud-parent/tree/master/hystrix
spring cloud中使用hystrix实现回退的更多相关文章
- spring Cloud中,解决Feign/Ribbon整合Hystrix第一次请求失败的问题?
Spring Cloud中,Feign和Ribbon在整合了Hystrix后,可能会出现首次调用失败的问题,要如何解决该问题呢? 造成该问题的原因 Hystrix默认的超时时间是1秒,如果超过这个时间 ...
- Spring Cloud中Hystrix、Ribbon及Feign的熔断关系是什么?
导读 今天和大家聊一聊在Spring Cloud微服务框架实践中,比较核心但是又很容易把人搞得稀里糊涂的一个问题,那就是在Spring Cloud中Hystrix.Ribbon以及Feign它们三者之 ...
- Spring Cloud中五大神兽总结(Eureka/Ribbon/Feign/Hystrix/zuul)
Spring Cloud中五大神兽总结(Eureka/Ribbon/Feign/Hystrix/zuul) 1.Eureka Eureka是Netflix的一个子模块,也是核心模块之一.Eureka是 ...
- 详解Spring Cloud中Hystrix 线程隔离导致ThreadLocal数据丢失
在Spring Cloud中我们用Hystrix来实现断路器,Zuul中默认是用信号量(Hystrix默认是线程)来进行隔离的,我们可以通过配置使用线程方式隔离. 在使用线程隔离的时候,有个问题是必须 ...
- Spring Cloud中,如何解决Feign整合Hystrix第一次请求失败的问题
Spring Cloud中,Feign和Ribbon在整合了Hystrix后,可能会出现首次调用失败的问题,要如何解决该问题呢? 造成该问题的原因 Hystrix默认的超时时间是1秒,如果超过这个时间 ...
- Spring Cloud(Dalston.SR5)--Hystrix 断路器-缓存
在 Spring Cloud 中可以使用注解的方式来支持 Hystrix 的缓存,缓存与合并请求功能需要先初始化请求上下文才能实现,因此,必须实现 javax.servlet.Filter 用于创建和 ...
- Spring Cloud入门教程-Hystrix断路器实现容错和降级
简介 Spring cloud提供了Hystrix容错库用以在服务不可用时,对配置了断路器的方法实行降级策略,临时调用备用方法.这篇文章将创建一个产品微服务,注册到eureka服务注册中心,然后我们使 ...
- Spring Cloud中关于Feign的常见问题总结
一.FeignClient接口,不能使用@GettingMapping 之类的组合注解 代码示例: @FeignClient("microservice-provider-user" ...
- Spring Cloud(Dalston.SR5)--Hystrix 断路器-合并请求
在 Spring Cloud 中可以使用注解的方式来支持 Hystrix 的合并请求,缓存与合并请求功能需要先初始化请求上下文才能实现,因此,必须实现 javax.servlet.Filter 用于创 ...
随机推荐
- Hive的分桶表
[分桶概述] Hive表分区的实质是分目录(将超大表的数据按指定标准细分到指定目录),且分区的字段不属于Hive表中存在的字段:分桶的实质是分文件(将超大文件的数据按指定标准细分到分桶文件),且分桶的 ...
- 全局CSS样式表
看api手册使用即可 1.按钮和图片 2.表格.表单 表单的lable作用就是点击前面的文字可以聚焦到对应的输入框中
- linq 集合按照多列进行distinct
List<TaskBatch> sourceList = (from c in BatchCollecion ...
- linux关于profile 、bashrc 、.bash_profile、.bashrc的区别
linux关于profile .bashrc ..bash_profile..bashrc的区别 - /etc/profile /etc/bashrc ~/.bash_profile ~/.bashr ...
- 编译执行 VS 解释执行
一般编译程序从对源程序执行途径的角度不同,可分为解释执行和编译执行. 所谓解释执行是借助于解释程序完成,即按源程序语句运行时的动态结构,直接逐句地边分析边翻译并执行.像自然语言翻译中的口译,随时进行翻 ...
- 使用 mysql 的 Docker 镜像
使用 mysql 的 Docker 镜像 前言 之前搞了很多都是手工在操作系统的镜像中安装使用 mysql,作为自己折腾也就算了,作为实际使用实为不妥:Docker最重要的特性就是可扩展性,把各种程序 ...
- php保留2位小数方法
$num = 10.4567; //第一种:利用round()对浮点数进行四舍五入 echo round($num,2); //10.46 //第二种:利用sprintf格式化字符串 $format_ ...
- django 使用装饰器验证用户登陆
使用装饰器验证用户登陆,需要使用@method_decorator 首先需引用,method_decorator,并定义一个闭包 from django.utils.decorators import ...
- 关于Redis的十个高频面试问题
文件来自大神的分析,小弟引用.希望更多的资源能被更多的人分享到!!! 一.Redis有哪些数据结构? 字符串String.字典Hash.列表List.集合Set.有序集合SortedSet. 如果你是 ...
- P4884-多少个1?【BSGS】
正题 题目链接:https://www.luogu.com.cn/problem/P4884 题目大意 求一个最小的\(n\)使得\(n\)个连续的\(1\)其在模\(m\)意义下等于\(k\). \ ...