源码地址:https://gitee.com/fighter3/eshop-project.git

持续更新中……

在上一节我们已经使用OpenFeign完成了服务间的调用。想一下,假如我们一个服务链路上上下游有十几个服务,每个服务有若干个节点,其中一个节点故障,上游请求打到故障的节点,加入请求一直阻塞,大量堆积的请求可能会把服务打崩,可能导致级联式的失败,甚至整个链路失败,这就是所谓的服务雪崩,严重可能直接导致系统挂掉。为了避免这种可怕的情况,必要的容错保护机制是必需的。

1、Hystrix简介

Hystrix是Netflix的一个重要组件,提供了断路器、资源隔离与自我修复功能。

如下是Hystrix作为断路器,阻止级联失败。

但是Hystrix1.5.18版本之后进入了维护模式,我们采用的就是这个版本。在SpringCloud Alibaba的体系,有另外一个组件sentinel可以作为替代品,在后面我们会用到。

尽管Hystrix已经停止更新,但是经过多年迭代,目前已经是一个比较成熟的产品,所以仍然有比较广泛的应用。

Hystrix在SpringCloud体系的使用也非常简单,下面,我们开始吧!

2、引入Hystrix

仍然是用我们上节的例子。

  • 采用spring-cloud-starter的方式引入:
    <dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
  • 在application.yml开启hystrix:
feign:
hystrix:
enabled: true
  • 在服务启动类加入@EnableHystrix注解,以使系统支持hystrix的功能。
@SpringBootApplication
@MapperScan("cn.fighter3.mapper")
@EnableDiscoveryClient
@EnableFeignClients(basePackages = "cn.fighter3.client")
@EnableHystrix
public class EshopGoodsApplication { public static void main(String[] args) {
SpringApplication.run(EshopGoodsApplication.class, args);
}
}
  • 编写一个StockClientFallback类,实现StockClientFeign接口,这个类是用来干什么的呢?是用于Feign客户端远程调用失败回调的。
/**
* @Author 三分恶
* @Date 2021/5/29
* @Description 库存服务回调异常回调类
*/
@Component
@Slf4j
public class StockClientFallback implements StockClientFeign { public Integer addStock(StockAddDTO stockAddDTO) {
log.error("库存服务-添加库存不可用!");
return 0;
} public Integer getAccountById(Integer goodsId) {
log.error("库存服务-获取库存不可用!");
return 0;
}
}
  • 在StockClientFeign中添加失败回调配置,原来是@FeignClient(value = "stock-service")
@FeignClient(value = "stock-service", fallback = StockClientFallback.class)

还有另外一种方式,可以在方法上使用@HystrixCommand(fallbackMethod = "getDefaultUser")来定义服务降级方法。

3、测试Hystrix

  • 依次启动Nacos-Server、商品服务,注意,我们没有启动库存服务

  • 打开 http://localhost:8020/doc.html ,调用一下添加商品接口。想一下,正常情况下,会是什么结果呢?由于库存服务没起,那么连带着商品服务也一定会返回异常,但是加入了hystrix,发现,接口返回成功的结果。

看一下我们打的日志,发现回调的方法被调用了。

好了,Hystrix实现断路器到这就结束了。

持续更新中,敬请关注……

"简单的事情重复做,重复的事情认真做,认真的事情有创造性地做!"——

我是三分恶,一个能文能武的全栈开发,咱们下期见!


参考:

【1】:小专栏《SpringCloudAlibaba微服务实战 》

【2】:Spring Cloud Hystrix:服务容错保护

SpringCloud Alibaba实战(9:Hystrix容错保护)的更多相关文章

  1. SpringCloud之Hystrix容错保护原理及配置

    1 什么是灾难性雪崩效应? 如下图的过程所示,灾难性雪崩形成原因就大致如此: 造成灾难性雪崩效应的原因,可以简单归结为下述三种: 服务提供者不可用.如:硬件故障.程序BUG.缓存击穿.并发请求量过大等 ...

  2. SpringCloud Alibaba实战(3:存储设计与基础架构设计)

    1.存储设计 在上一章中,我们已经完成了基本业务流程的梳理和服务模块的划分,接下来,开始设计数据存储. 虽然在微服务的理论中,没有对数据库定强制性的规范,但一般,服务拆分之后,数据库也会对应的拆分. ...

  3. SpringCloud Alibaba实战(7:nacos注册中心管理微服务)

    源码地址:https://gitee.com/fighter3/eshop-project.git 持续更新中-- 在上一节我们已经完成了Nacos Server的本地部署,这一节我们学习如何将Nac ...

  4. (四)Hystrix容错保护

    Feign默认是整合了Ribbon和Hystrix这两个框架,所以代码我们在上一篇的基础上进行修改,启动Eureka,service-hello,Feign 所谓的熔断机制和日常生活中见到电路保险丝是 ...

  5. SpringCloud Alibaba实战(2:电商系统业务分析)

    选用了很常见的电商业务来进行SpringCloud Alibaba的实战. 当然,因为仅仅是为了学习SpringCloud Alibaba,所以对业务进行了大幅度简化,这里只取一个精简版的用户下单业务 ...

  6. SpringCloud Alibaba实战(6:nacos-server服务搭建)

    源码地址:https://gitee.com/fighter3/eshop-project.git 持续更新中-- 大家好,我是三分恶. 这一节我们来学习SpringCloud Alibaba体系中一 ...

  7. SpringCloud Alibaba实战(11:引入服务网关Gateway)

    源码地址:https://gitee.com/fighter3/eshop-project.git 持续更新中-- 大家好,我是三分恶. 在前面的章节中,我们已经完成了服务间的调用.统一配置等等,在这 ...

  8. SpringCloud Alibaba实战(8:使用OpenFeign服务调用)

    源码地址:https://gitee.com/fighter3/eshop-project.git 持续更新中-- 在上一个章节,我们已经成功地将服务注册到了Nacos注册中心,实现了服务注册和服务发 ...

  9. SpringCloud Alibaba实战(12:引入Dubbo实现RPC调用)

    源码地址:https://gitee.com/fighter3/eshop-project.git 持续更新中-- 大家好,我是老三,断更了半年,我又滚回来继续写这个系列了,还有人看吗-- 在前面的章 ...

随机推荐

  1. 使用BeanUtils.copyProperties踩坑经历

    1. 原始转换 提起对象转换,每个程序员都不陌生,比如项目中经常涉及到的DO.DTO.VO之间的转换,举个例子,假设现在有个OrderDTO,定义如下所示: public class OrderDTO ...

  2. 交互-通过axios拦截器添加token认证

    通过axios拦截器添加token认证 一.通过axios请求拦截器添加token,保证拥有获取数据的权限 通常访问接口需要相关权限,通常是需要携带token如下所示 那如何在请求头中添加token? ...

  3. [刷题] 350 Intersection of Two Arrays

    要求 给定两个数组nums,求两个数组交集 输出结果与元素在两个数组中出现的次数一致 不考虑输出结果的顺序 举例 nums1=[1,2,2,1] nums2=[2,2] 结果:[2,2] 思路 使用m ...

  4. 附: Python爬虫 数据库保存数据

    原文 1.笔记 #-*- codeing = utf-8 -*- #@Time : 2020/7/15 22:49 #@Author : HUGBOY #@File : hello_sqlite3.p ...

  5. C++知识点案例 笔记-3

    1.基类指针等与派生类的兼容 2.构造函数 3.析构函数 4.虚基类 5.虚函数 6.虚析构函数 ==基类指针等与派生类的兼容== #include <iostream> #include ...

  6. mysql基础之数据库备份和恢复实操

    一.基于二进制文件的恢复*** 1.算好要恢复数据的时间段,重定向输入到bin.sql文件中 [root@ren7 mysql]# mysqlbinlog --start-datetime=" ...

  7. VMware Tanzu Kubernetes Grid 1.3 发布 - VMware 构建、签名和支持的开源 Kubernetes 容器编排平台的完整分发版

    Tanzu Kubernetes 集群是由 VMware 构建.签名和支持的开源 Kubernetes 容器编排平台的完整分发版.可以通过使用 Tanzu Kubernetes Grid 服务在主管集 ...

  8. Python+Selenium学习笔记6 - 定位

    1.8种针对单个元素的定位方法 find_element_by_id() find_element_by_name() find_element_by_class_name() find_elemen ...

  9. Java设计模式(1:软件架构设计七大原则及开闭原则详解)

    前言 在日常工作中,我们使用Java语言进行业务开发的时候,或多或少的都会涉及到设计模式,而运用好设计模式对于我而言,又是一个比较大的难题.为了解决.克服这个难题,笔主特别开了这个博客来记录自己学习的 ...

  10. jupyter notebook 默认文件路径修改以及启动

    其实这个方法有时候不是特别有效额 方法一: 查了网上好多其他的方法,但是都没用,只好独辟蹊径了. 首先找到anaconda的安装路径,找到jupyter notebook,我的是如下: 发送快捷方式到 ...