分布式系统中不可避免的会出现一些故障,因为服务间错综复杂的依赖关系,有时候一个服务出现问题后,会导致依赖于它的服务出现远程调度的线程受阻,给服务造成压力,当然同样的,祖父级调用者(暂且这么叫吧)当然也会因此受阻,依赖于祖父级调用者的应用也会被阻塞,,,,,这就是所谓的“雪崩”。
  hystrix,一般叫做断路器。它的直译应该是豪猪,一种浑身有刺,碰到危险时可以保护自己的动物,netflix团队将项目取名为hystrix也是这么个用意吧。观察一下,会发现hystrix的监控界面图标就是一个Q版的豪猪。
--------------------------------------------------------------------------------------------------------------------------------
hystrix的设计原则:
  1、防止单个服务的故障耗尽整个服务的servlet容器的线程资源。
  2、快速失败机制;如果某个服务出现了故障,则调用该服务的请求走快速失败通道,而不是线程等待。
  3、提供回退方案,在请求发生故障时,提供良好的回退方案。
  4、使用熔断机制,防止扩散到其它服务。
  5、提供熔断器的监控组件hystrix dashboard,可以实时监控熔断器状态。
工作机制:
  断路器工作流程图如下:
  当一段时间内用户请求失败次数小于阈值的时候,说明服务正常,此时断路器是关闭的;当失败数达到或高于阈值的时候,说明服务出现了问题,此时断路器开启,所有请求执行快速失败,不再执行原业务代码;过一段时间后,原先隔离的服务可能恢复正常了,断路器会尝试进入半打开状态,执行正常业务代码;如果执行的请求失败了,则继续打开,请求走快速失败,若执行的请求成功了,则关闭断路器,执行正常业务代码。
代码演示:
  1、pom内容:
  只是hystrix断路功能的话,

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>

  就可以了,如果要查看监控页面,需要额外引入以下两个:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
</dependency>
2、启用注解:
  相应的,断路器跟监控分别需要注解:@EnableHystrix跟@EnableHystrixDashboard
3、配置hystrix
  a、对于restTemplate配置:需要在方法上加@HystrixCommand注解,并声明快速失败函数,例如:
@HystrixCommand(fallbackMethod = "sayError") //fallbackMethod为hystrix开启后执行的快速失败方法
public PersonVo getPerson(){
PersonVo personVo = null;
personVo = restTemplate.getForObject("http://sms-module/sms/getPerson?phoneNumber=17301394307",PersonVo.class);
return personVo;
} public PersonVo sayError(){
PersonVo vo = new PersonVo();
vo.setName("lisi");
return vo;
}

  b、对于feign的配置:需要在@FeignClient注解中声明fallback对应方法所在的类,该类必须实现@FeignClient注解所修饰的接口,例如:

@FeignClient(name = "sms-module",fallback = FeignHystrix.class)
public interface FeignSmsClient {
@RequestMapping(value = "/sms/getPerson")
PersonVo queryPerson(@RequestParam("phoneNumber") String phoneNumber);
}
  fallback的实现类:  
@Component  //注意,这个实现类要纳入ioc管理
public class FeignHystrix implements FeignSmsClient {
@Override
public PersonVo queryPerson(String phoneNumber) {
PersonVo vo = new PersonVo();
vo.setName("王五");
return vo;
}
}
3、测试
  分别启动eureka-server,sms-module跟我们搭建的hystrix服务,注意,hystrix服务在用feign的时候,要在配置文件注明feign.hystrix.enabled=true,使用feign的时候hystrix默认是关闭的。
  controller代码为:
@RequestMapping("/demo")
@RestController
public class TestClientController {
@Autowired
FeignService feignService;
@Autowired
TemplateService templateService; @RequestMapping("/test")
public PersonVo myGetPerson(){
ServiceInstance instance = loadBalancerClient.choose("sms-module");
System.out.println("本次执行的实例是:"+instance.getHost()+":"+instance.getPort());
PersonVo personVo = templateService.getPerson();
return personVo;
} @RequestMapping("/test2")
public PersonVo myGetPerson2(){
PersonVo personVo = null;
personVo = feignService.queryPerson("15611273879");
return personVo;
}
}

  测试resttemplate跟feign正常访问:

  关闭sms-module,两个都因为访问不到资源而被hystrix保护,进入快速失败:

  再次启动sms-module,其它不作任何处理,过一段时间会发现两者又可以继续访问了。
4、监控配置
  监控可以使用hystrix-dashboard或者turbine,两者的区别是dashboard只能监控单个服务,而turbine可以监控多个(需要在配置文件写监控哪些),可以看做是dashboard的高级版本,是netflix后来才开源的。
  为了对比,分两个服务进行搭建:
  a、需要的依赖:
  turbine所在服务:
<!--监控相关-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-turbine</artifactId>
</dependency>

  dashboard所在服务只依赖前两个starter

b、开启注解
  在启动类配置注解@EnableHystrixDashboard跟@EnableTurbine,dashboard所在服务只配置第一个。
  在turbine项目,配置文件配置
turbine:
appConfig: feign-demo,turbine-demo #这里是turbine要监控的服务名列表,逗号隔开,我本地turbine项目的服务名为feign-demo,hystrix项目的服务名为turbine-demo(项目名是从前边的学习一路过来的,这名字在这里比较容易混淆,,,,)
clusterNameExpression: new String("default")

  其它代码共用上边hystrix的测试代码,在dashboard项目中将controller中url映射改为test3跟test4,相应的service方法名加222,启动项目分别访问http://localhost:port/hystrix

  页面三个框,分别填写http://localhost:8081/hystrix.stream、2000、dashboard-env跟http://localhost:8080/turbine.stream、2000、turbine-env,点击monitor stream,
  可能开始页面为空,访问http://localhost:8081/demo/test3、http://localhost:8081/demo/test4跟http://localhost:8080/demo/test、http://localhost:8080/demo/test2后再查看页面

  

  页面中各个监控数据的含义:

  

  很明显8081只显示了自己本服务的两个接口,而8080则显示了两个项目的所有接口,这就是dashboard跟turbine的区别,相比较来说,当然选择turbine了。
--------------------------------------------------------------------------------------------------------------------------------
  先这样吧,更深的内容以后再补。

 

 

断路器hystrix的更多相关文章

  1. SpringCloud学习系列之三----- 断路器(Hystrix)和断路器监控(Dashboard)

    前言 本篇主要介绍的是SpringCloud中的断路器(Hystrix)和断路器指标看板(Dashboard)的相关使用知识. SpringCloud Hystrix Hystrix 介绍 Netfl ...

  2. 【Spring Cloud笔记】 断路器-hystrix

    在微服务架构中,一个微服务的超时失败可能导致瀑布式连锁反映,Spring Cloud Netflix 的断路器Hystrix通过自主反馈,防止了这种情况发生.下面介绍简单的断路器使用方法. [step ...

  3. spring cloud学习(五)断路器 Hystrix

    断路器 Hystrix 断路器模式 (云计算设计模式) 断路器模式源于Martin Fowler的Circuit Breaker一文. 在分布式环境中,其中的应用程序执行访问远程资源和服务的操作,有可 ...

  4. 004声明式服务调用Feign & 断路器Hystrix

    1.POM配置 和普通Spring Boot工程相比,添加了Eureka Client.Feign.Hystrix依赖和Spring Cloud依赖管理 <dependencies> &l ...

  5. SpringCloud IDEA 教学 (四) 断路器(Hystrix)

    写在开始 在SpringCloud项目中,服务之间相互调用(RPC Remote Procedure Call —远程过程调用),处于调用链路底层的服务产生不可用情况时,请求会产生堆积使得服务器线程阻 ...

  6. 断路器Hystrix与Turbine集群监控-Spring Cloud学习第三天(非原创)

    文章大纲 一.Hystrix基础介绍二.断路器Hystrix简单使用三.自定义Hystrix请求命令四.Hystrix的服务降级与异常处理五.Hystrix的请求缓存与请求合并六.Hystrix仪表盘 ...

  7. 断路器-Hystrix的深入了解

    前言 高可用相关的技术以及架构,对于大型复杂的分布式系统,是非常重要的.而高可用架构中,非常重要的一个环节,就是如何将分布式系统中的各个服务打造成高可用的服务,从而足以应对分布式系统环境中的各种各样的 ...

  8. SpringCloud断路器(Hystrix)和服务降级案列

    断路器(Hystrix) 为什么需要 Hystrix? 在微服务架构中,我们将业务拆分成一个个的服务,服务与服务之间可以相互调用(RPC).为了保证其高可用,单个服务又必须集群部署.由于网络原因或者自 ...

  9. 【Spring Cloud学习之六】断路器-Hystrix

    环境 eclipse 4.7 jdk 1.8 Spring Boot 1.5.2 Spring Cloud 1.2 一.服务雪崩1.什么是服务雪崩分布式系统中经常会出现某个基础服务不可用造成整个系统不 ...

  10. 断路器Hystrix(Feign)

    上一篇中我们讲了 断路器Hystrix(Ribbon) 本章讲解Feign+Hystrix已经Request请求传递,各种奇淫技巧…. - Hystrix Hystrix支持回退概念:当 断路器 打开 ...

随机推荐

  1. [转]CMD命令提示符窗口中的快捷键、小技巧和常用命令

    转至:https://wenku.baidu.com/view/d5d2b7ca360cba1aa811dac6.html 快捷键:  F1:按F1一次,命令提示符向后切换到已经执行过的命令字符.如果 ...

  2. Kotlin 控制台交互式操作

    kotlin 可以使用和控制台进行交互式操作. 还是蛮有意思. 使用Kotlin的交互式操作首先必须要正确的安装JDK和配置JDK的环境. 可以参考这篇文长 安装完成之后就要下载一个Kotlin的交互 ...

  3. SnackBar使用

    注意:build(BuildContext context)在 Scaffold.of(context)之前时,会报错,解决办法:通过build widget来解决,如下代码. import 'pac ...

  4. day01.3-常用Dos命令

    一.  常用Dos命令 Windons系统下:开始 —> 运行—> cmd —> 进入命令运行界面 1.  ipconfig /? |—> 查看ip帮助: 2.  ping / ...

  5. MySQL数据库之插入显示图片

    图书馆系统项目需要用到好多图片,并且要求存入到数据库中,对这个特别感兴趣,于是上网查了资料,采用C#语言,进行了具体实现. 说明: 功能:往MySQL数据库插入并显示图片: 验证:执行插入功能后,我把 ...

  6. 【转】在Windows64位环境下.net访问Oracle解决方案

    源地址:http://www.cnblogs.com/asingna/archive/2012/05/27/2519950.html

  7. 1.Tow Sum(两数和)

    Level: ​ Easy 题目描述: Given an array of integers, return indices of the two numbers such that they add ...

  8. 利用zookeeper生成唯一id,通用性代码

    在上篇中是写死的,这章就写出通用的 package com.cxy.com.cxy.curator; import java.util.concurrent.ExecutorService; impo ...

  9. 网站后台登录asp 提示错误号:-2147467259

    方法/步骤   1 asp 提示错误号:-2147467259 提示:[] 错误号:-2147467259 错误描述:操作必须使用一个可更新的查询. SQL错误 解决方法  把data文件夹的权限改下 ...

  10. vmware正在使用中问题

    解决方法:找到vmware目录下的.lck文件,将其删掉即可.