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 用于创 ...
随机推荐
- 什么是maven与maven的使用过程(例如在idea创建maven工程(重点讲讲idea创建使用maven管理的web工程,并且部署到tomcat上))
什么是maven与maven的使用过程(例如在idea创建maven工程) (重点讲讲idea创建使用maven管理的web工程项目,并且部署到tomcat服务器上) 一.什么是maven? 1, M ...
- 《挑战程序设计竞赛》——DFS
DFS(深度优先搜索) 简介 深度优先搜索(DFS,Depth-First Search)是搜索的手段之一.它从某个状态开始,不断的转移状态直到无法转移.然后退回到前一步的状态,继续转移到其他状态,如 ...
- POJ1321——棋盘问题
http://poj.org/problem?id=1321 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解 ...
- C++快速读入
使用C++的标准cin进行读入速度比较慢,尤其是在大数据的情况下,所以我们需要使用一种方法,按照字符读入,最后再"组装"成整数.由于字符读入比数字要快,所以这样做可以提高读入速度. ...
- django如何加载外部文件
django如何加载外部文件(环境:pycharm python2.7 django1.11) 有一份新的文件夹名为:py_aiplat_demo,内含有多个文件夹(SDK,demo,data). 1 ...
- SQL-关联查询【转】
T_A A表 T_B B标,id为表与表相关联的字段`创建相关表结构 CREATE TABLE Table_B( id INT(2), serNum VARCHAR(10) ); CREATE TAB ...
- Java-Ide快速创建getter&setter方法
1.右键 选择Generate 2.创建 类的equals方法
- Wannafly挑战赛23F-计数【原根,矩阵树定理,拉格朗日插值】
正题 题目链接:https://ac.nowcoder.com/acm/contest/161/F 题目大意 给出\(n\)个点的一张图,求它的所有生成树中权值和为\(k\)的倍数的个数.输出答案对\ ...
- 踩坑系列《九》 无法获取实体类xxx对应的表名
话不多说,直接说明原因 类似于 @MapperScan(basePackages = "com.hyxiao.user.mapper") 启动类的mapper扫描注解的导入包正确的 ...
- mysql学习教程之mysql管理
MySQL 管理 启动及关闭 MySQL 服务器 Windows 系统下 在 Windows 系统下,打开命令窗口(cmd),进入 MySQL 安装目录的 bin 目录. 启动: cd c:/mysq ...