以下demo代码:https://github.com/wades2/HystrixtDemo

官网定义:Hystrix是一个延迟容错库。在分布式环境中,许多服务依赖项中的一些不可避免地会失败。Hystrix是一个库,可通过添加延迟容错和容错逻辑来帮助您控制这些分布式服务之间的交互。Hystrix通过隔离服务之间的访问点,阻止它们之间的级联故障以及提供后备选项来实现这一点,所有这些都可以提高系统的整体弹性。

因为在分布式系统中很多服务是相互依赖的,假如以下某个功能实现依赖于几个服务:

假如此时【家庭信息查询服务】由于请求过多或者服务器原因出现了大批量服务不可用,【个人信息查询服务】由于无法请求到【家庭信息查询服务】,一直阻塞,造成服务器压力越来越大,后续又有【人员信息查询】的请求来了。就好比堵车的公路上又来了一大批车;此时会每个依赖关系都会在某些时候不可避免地失败。如果主机应用程序未与这些外部故障隔离,则整个系统可能会崩溃。

此时Hystrix熔断器就发挥了作用:

1、通过第三方客户端库访问(通常通过网络)依赖关系,以防止和控制延迟和故障。
        2、在复杂的分布式系统中停止级联故障。(在一段时间内侦测到许多类似的错误,会强迫其以后的多个调用快速失败,不再访问远程服务器)
        3、快速失败并迅速恢复。(快速失败后【个人信息查询服务】不会由于阻塞过载,就不会导致雪崩,)
        4、在可能的情况下,后退并优雅的降级。
        5、实现近实时监控,警报和操作控制。(如果熔断器诊断【家庭信息查询服务】错误已经修正,应用程序会再次尝试调用这个服务。)

这样我们就在之前学习Euraka+ribbon的基础上加熔断机制:

首先在我们的EurekaCaller里面添加上需要的依赖:

【注:如果不清楚的朋友或者没有重头看的朋友,这里附上我demo的

git地址:https://github.com/wades2/EurekaDemo2

完整的搭建教程在:https://blog.csdn.net/asd529735325/article/details/85044158

如果你的Eureka和ribbon已经搭建好了可以直接跳过。】

我们的项目基本是这个样子的:

Eurekacaller是这个样子:

添加pom依赖引入需要的jar包:

  1. <dependency>
  2. <groupId>org.springframework.cloud</groupId>
  3. <artifactId>spring-cloud-starter-hystrix</artifactId>
  4. </dependency>

重写一下我们的Controller:

  1. package com.example.demo.controller;
  2. import com.example.demo.service.Services;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.web.bind.annotation.*;
  5. import org.springframework.web.client.RestTemplate;
  6. @RestController
  7. public class Controller {
  8. @Autowired
  9. private Services service;
  10. @RequestMapping(value = "getUser/routine",method = RequestMethod.GET)
  11. public String routine(@RequestParam String id){
  12. String json=service.routineService(id);
  13. return json;
  14. }
  15. }

然后是我们具体的service,负载的部分,我们的断熔就放在service这里,一旦请求超时或者失败,立即失败并触发降级方法,我这里的降级方法是:callback。

  1. package com.example.demo.service;
  2. import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.stereotype.Service;
  5. import org.springframework.web.bind.annotation.RequestParam;
  6. import org.springframework.web.client.RestTemplate;
  7. @Service
  8. public class Services {
  9. @Autowired
  10. private RestTemplate restTemplate;
  11. //实现的callback方法来实现短路保护
  12. @HystrixCommand(fallbackMethod = "callback")
  13. public String routineService(String id){
  14. System.out.println(id);
  15. String jsons = restTemplate.getForObject("http://Eureka-client/user/getUser2", String.class);
  16. return jsons;
  17. }
  18. public String callback(String id){
  19. String msg="出现错误id:"+id;
  20. return msg;
  21. }
  22. }

因为在前期我们没有扫描/user/getUser2所在的包路径,所以这个是肯定扫描不到的,访问一定是404not found的。

然后启动我们的5个启动类,访问http://localhost:8086/getUser/routine?id=52,我们可以看到访问到了callback页面:

这样一来,即使EurkaClient都出现了问题或者过载,我们也可以降级处理。那我们再试试如果超时会怎么样。

修改配置文件。,添加超时设置:

  1. spring.application.name=Eureka_caller
  2. server.port=8086
  3. eureka.client.serviceUrl.defaultZone=http://user:123456@localhost:8083/eureka,http://user:123456@localhost:8082/eureka
  4. #hystrix配置
  5. hystrix.metrics.enabled=true
  6. #默认的超时时间设置
  7. hystrix.metrics.polling-interval-ms=2000

修改下Ribbon请求的路径:

  1. //实现的callback方法来实现短路保护
  2. @HystrixCommand(fallbackMethod = "callback")
  3. public String routineService(String id){
  4. System.out.println(id);
  5. String jsons = restTemplate.getForObject("http://Eureka-client/user/getUser", String.class);
  6. return jsons;
  7. }

修改对应Service提供者的Client具体实现类(也就是修改EurekaClient和EurekaClient2),使其沉睡时间大于我们的熔断请求延迟时间,模拟服务器过载阻塞:

  1. package com.example.demo.controller;
  2. import com.netflix.appinfo.InstanceInfo;
  3. import com.netflix.discovery.DiscoveryClient;
  4. import com.netflix.discovery.EurekaClient;
  5. import com.netflix.discovery.converters.Auto;
  6. import com.netflix.discovery.shared.Applications;
  7. import org.springframework.beans.factory.annotation.Autowired;
  8. import org.springframework.web.bind.annotation.GetMapping;
  9. import org.springframework.web.bind.annotation.RequestMapping;
  10. import org.springframework.web.bind.annotation.RestController;
  11. import java.util.List;
  12. @RestController
  13. @RequestMapping("user")
  14. public class UserController {
  15. @Autowired
  16. private EurekaClient eurekaClients;
  17. @GetMapping("getUser")
  18. public String getUser() {
  19. //todo 得到eureka server的服务实例
  20. InstanceInfo info=eurekaClients.getNextServerFromEureka("Eureka-client",false);
  21. try{
  22. Thread.sleep(60000);
  23. }catch (Exception e){
  24. e.printStackTrace();
  25. }
  26. return "hello one";
  27. }
  28. }

我们看到请求后依然页面被拦截熔断了,因为等待时间60000毫秒远远大于了我们设置熔断等待时间:2000毫秒。

以上就是我们关于Hystrix熔断器的学习,各位看官大佬爷有什么问题请留言区评论,大家一起讨论解决。

Spring cloud微服务 Hystrix熔断器学习教程的更多相关文章

  1. Spring Cloud 微服务四:熔断器Spring cloud hystrix

    前言:在微服务架构中,一般都是进程间通信,有可能调用链都比较长,当有底层某服务出现问题时,比如宕机,会导致调用方的服务失败,这样就会发生一连串的反映,造成系统资源被阻塞,最终可能造成雪崩.在sprin ...

  2. Spring Cloud微服务学习笔记

    Spring Cloud微服务学习笔记 SOA->Dubbo 微服务架构->Spring Cloud提供了一个一站式的微服务解决方案 第一部分 微服务架构 1 互联网应用架构发展 那些迫使 ...

  3. spring cloud微服务快速教程之(七) Spring Cloud Alibaba--nacos(一)、服务注册发现

    0.前言 什么是Spring Cloud Alibaba? Spring Cloud Alibaba 是阿里开源的,致力于提供微服务开发的一站式解决方案.此项目包含开发分布式应用微服务的必需组件,方便 ...

  4. 一张图了解Spring Cloud微服务架构

    Spring Cloud作为当下主流的微服务框架,可以让我们更简单快捷地实现微服务架构.Spring Cloud并没有重复制造轮子,它只是将目前各家公司开发的比较成熟.经得起实际考验的服务框架组合起来 ...

  5. 在阿里云容器服务上开发基于Docker的Spring Cloud微服务应用

    本文为阿里云容器服务Spring Cloud应用开发系列文章的第一篇. 一.在阿里云容器服务上开发Spring Cloud微服务应用(本文) 二.部署Spring Cloud应用示例 三.服务发现 四 ...

  6. Spring Cloud 微服务六:调用链跟踪Spring cloud sleuth +zipkin

    前言:随着微服务系统的增加,服务之间的调用关系变得会非常复杂,这给运维以及排查问题带来了很大的麻烦,这时服务调用监控就显得非常重要了.spring cloud sleuth实现了对分布式服务的监控解决 ...

  7. Spring Cloud 微服务五:Spring cloud gateway限流

    前言:在互联网应用中,特别是电商,高并发的场景非常多,比如:秒杀.抢购.双11等,在开始时间点会使流量爆发式地涌入,如果对网络流量不加控制很有可能造成后台实例资源耗尽.限流是指通过指定的策略削减流量, ...

  8. Spring Cloud微服务初探

    学习初衷 因为加了不少优秀的知识星球,结交了更多的小伙伴,加了更多的群,每每在自我介绍的时候,都说自己是Android & Java攻城狮. 然鹅,有的小伙伴就来问了,你是搞Java的,那对S ...

  9. spring cloud微服务实践七

    在spring cloud 2.x以后,由于zuul一直停滞在1.x版本,所以spring官方就自己开发了一个项目 Spring Cloud Gateway.作为spring cloud微服务的网关组 ...

随机推荐

  1. GET/POST/g和钩子函数(hook)

    GET请求和POST请求: 1. get请求: * 使用场景:如果只对服务器获取数据,并没有对服务器产生任何影响,那么这时候使用get请求. * 传参:get请求传参是放在url中,并且是通过`?`的 ...

  2. Python之函数练习题

    一.简述普通参数.指定参数.默认参数.动态参数的区别 普通参数:就是放入一个形参,当放入实参时,需要按照顺序给形参值. 指定参数:放入实参时是指定的,不用按照顺序给形参,都能让形参获得相应的参数. 默 ...

  3. mysql远程访问被禁止

    远程连接Mysql服务器的数据库,错误代码是1130,ERROR 1130: Host xxx.xxx.xxx.xxx  is not allowed to connect to this MySQL ...

  4. python web框架之Tornado的简单使用

    python web框架有很多,比如常用的有django,flask等.今天主要介绍Tornado ,Tornado是一个用Python写的相对简单的.不设障碍的Web服务器架构,用以处理上万的同时的 ...

  5. 配置vuex并使用

    配置vuex并使用 安装vuex: npm install --save-dev vuex 在src目录下创建store文件夹 store文件夹下文件 index.js,state.js,getter ...

  6. redhat7查看系统版本 修改主机名

    在CentOS或RHEL中,有三种定义的主机名:静态的(static),瞬态的(transient),以及灵活的(pretty).“静态”主机名也称为内核主机名,是系统在启动时从 /etc/hostn ...

  7. NSArray,NSMutable和NSSet,NSMutableSet和NSDictionary,NSMutableDictionary用法

    开始编写应用程序的代码时,可以利用大量的 Objective-C 框架.其中,为所有应用程序提供基本服务的 Foundation 框架尤为重要.Foundation 框架包括表示基本数据类型的值类(如 ...

  8. Kibana6.x.x——执行yarn build出现的警告信息记录

    Running "_build:installDependencies" task Warning: Command failed: /home/kibana_git/kibana ...

  9. Linq,拉姆达表达式注意!

    linq的条件语句尽量不要出现计算的式子,要不然很可能,程序不能正确的将这些复杂的式子编译成表达式!! 例如: dataContext.Assets.Count(s => s.SubCatego ...

  10. Codeforces-C-Grid game(思维)

    You are given a 4x4 grid. You play a game - there is a sequence of tiles, each of them is either 2x1 ...