在微服务架构中,我们的服务被拆分成多个微服务,每个微服务完成自己的职责,微服务之间通过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实现回退的更多相关文章

  1. spring Cloud中,解决Feign/Ribbon整合Hystrix第一次请求失败的问题?

    Spring Cloud中,Feign和Ribbon在整合了Hystrix后,可能会出现首次调用失败的问题,要如何解决该问题呢? 造成该问题的原因 Hystrix默认的超时时间是1秒,如果超过这个时间 ...

  2. Spring Cloud中Hystrix、Ribbon及Feign的熔断关系是什么?

    导读 今天和大家聊一聊在Spring Cloud微服务框架实践中,比较核心但是又很容易把人搞得稀里糊涂的一个问题,那就是在Spring Cloud中Hystrix.Ribbon以及Feign它们三者之 ...

  3. Spring Cloud中五大神兽总结(Eureka/Ribbon/Feign/Hystrix/zuul)

    Spring Cloud中五大神兽总结(Eureka/Ribbon/Feign/Hystrix/zuul) 1.Eureka Eureka是Netflix的一个子模块,也是核心模块之一.Eureka是 ...

  4. 详解Spring Cloud中Hystrix 线程隔离导致ThreadLocal数据丢失

    在Spring Cloud中我们用Hystrix来实现断路器,Zuul中默认是用信号量(Hystrix默认是线程)来进行隔离的,我们可以通过配置使用线程方式隔离. 在使用线程隔离的时候,有个问题是必须 ...

  5. Spring Cloud中,如何解决Feign整合Hystrix第一次请求失败的问题

    Spring Cloud中,Feign和Ribbon在整合了Hystrix后,可能会出现首次调用失败的问题,要如何解决该问题呢? 造成该问题的原因 Hystrix默认的超时时间是1秒,如果超过这个时间 ...

  6. Spring Cloud(Dalston.SR5)--Hystrix 断路器-缓存

    在 Spring Cloud 中可以使用注解的方式来支持 Hystrix 的缓存,缓存与合并请求功能需要先初始化请求上下文才能实现,因此,必须实现 javax.servlet.Filter 用于创建和 ...

  7. Spring Cloud入门教程-Hystrix断路器实现容错和降级

    简介 Spring cloud提供了Hystrix容错库用以在服务不可用时,对配置了断路器的方法实行降级策略,临时调用备用方法.这篇文章将创建一个产品微服务,注册到eureka服务注册中心,然后我们使 ...

  8. Spring Cloud中关于Feign的常见问题总结

    一.FeignClient接口,不能使用@GettingMapping 之类的组合注解 代码示例: @FeignClient("microservice-provider-user" ...

  9. Spring Cloud(Dalston.SR5)--Hystrix 断路器-合并请求

    在 Spring Cloud 中可以使用注解的方式来支持 Hystrix 的合并请求,缓存与合并请求功能需要先初始化请求上下文才能实现,因此,必须实现 javax.servlet.Filter 用于创 ...

随机推荐

  1. Linux上安装服务器监视工具,名为Scout_Realtime。

    如何从浏览器监视Linux服务器和进程指标 在服务器上安装Ruby 1.9.3+ sudo yum -y install rubygems-devel 在Linux系统上安装了Ruby之后,现在可以使 ...

  2. 苹果手机input输入文字消失,看不见

    这里的方法是: 原来字体是12号,改成15号或其他大一点的字号

  3. mysql 基础配置经验

    创建库: 排序:utf8_unicode_ci和utf8_general_ci对中.英文来说没有实质的差别.utf8_general_ci校对速度快,但准确度稍差. 普遍的意思utf8_unicode ...

  4. rationrose安装步骤

    Rational Rose是Rational公司出品的一种面向对象的统一建模语言的可视化建模工具.用于可视化建模和公司级水平软件应用的组件构造. 就像一个戏剧导演设计一个剧本一样,一个软件设计师使用R ...

  5. 在eclipse上配置tomcat(包括解决找不到server,配置8.0以上版本)

    下载安装eclipse普通eclipse最多只支持到tomcat v 7,要想使用8以上的tomcat,就需要下载最新版本的Eclipse IDE,安装时 选择 Eclipse IDE for Ent ...

  6. xmind使用技巧

    xmind看似每个人都会使用,但是掌握一些小技巧,能够有效提升工作效率. 多行复制粘贴 在xmind中选中多行,复制然后可以直接粘贴到excel.word当中. 在excel.word选中多行,复制然 ...

  7. CF1556D-Take a Guess【交互】

    正题 题目链接:https://codeforces.com/contest/1556/problem/D 题目大意 现在有\(n\)个你不知道的数字,你有两种询问操作 询问两个下标的数字的\(and ...

  8. bzoj3729-Gty的游戏【Splay,博弈论】

    正题 题目链接:https://darkbzoj.tk/problem/3729 题目大意 给出\(n\)个点的一棵树,第\(i\)个节点上有\(a_i\)个石子,然后每次可以选择不超过\(L\)个石 ...

  9. WPF进阶技巧和实战03-控件(2-特殊容器)

    ScrollViewer控件 直接继承ContextControl类,提供了虚拟界面,允许用户围绕更大的元素滚动.只能包含单个元素(ContextControl决定),但可以放置布局控件来实现多个任意 ...

  10. 在CentOS 6中安装和配置OrientDB社区版

    OrientDB概述: OrientDB是一个开源NoSQL非关系型数据库管理系统. NoSQL数据库提供了一种用于存储和检索引用除表式数据之外的数据(例如文档数据或图形数据)的NO关系或非关系数据的 ...