Hystrix是什么

通过第三方客户端的库来为访问依赖服务时的潜在故障提供保护和控制;

防止在复杂分布式系统中出现级联故障;

快速失败和迅速恢复;

在允许的情况下,提供退路对服务进行优雅降级;

提供近实时的监控、报警和操作控制;

熔断

什么是熔断

通过配置一系列参数条件,例如请求执行时间,达到出发熔断条件后快速返回一个备选结果(调用指定fallback方法),并在指定周期内尝试服务是否恢复

熔断类型

打开

请求不再进行调用当前服务,内部设置时钟一般为MTTR(平均故障处理时间),当打开时长达到所设时钟则进入半熔断状态

触发条件:

  • 满足一定的阈值的时候(默认10秒内超过20个请求次数)
  • 当失败率达到一定的时候(默认10秒内超过50%请求失败)

半开

部分请求根据规则调用当前服务,如果请求成功且符合规则则认为当前服务恢复正常,关闭熔断

触发条件

  • 一段时间之后(默认5秒),由打开变为半开状态,会让其中一个请求进行转发,如果成功,断路器会关闭,若失败,继续开启,重复等待判断直至关闭

关闭

熔断关闭不会对服务进行熔断

触发条件

  • 当半开状态下,有成功的请求后

使用方法

导包

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
<version>2.2.5.RELEASE</version>
</dependency>

添加启动注解

@SpringBootApplication
@EnableEurekaClient
@EnableCircuitBreaker
public class ServiceApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceApplication.class, args);
}
}

新增方法

    @HystrixCommand(fallbackMethod = "getInstanceIdByHystrixFallBack",commandProperties = {
@HystrixProperty(name = "circuitBreaker.enabled", value = "true"), //是否开启熔断
@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "10"), //请求数达到后才计算
@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "10000"), //休眠时间窗(断路器打开后,多久会放一个请求过来尝试)
@HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "60"), //错误率达到多少开启熔断
})
@GetMapping("/getInstanceIdByHystrix/{number}")
public String getInstanceIdByHystrix(@PathVariable("number")int number) throws InterruptedException {
int a=0/number;
return instanceId+"number"+number;
} /**
* 在熔断开启时,调用备选方法
* @param number
* @return
*/
public String getInstanceIdByHystrixFallBack(@PathVariable("number")int number){
return "fallback_"+number;
}

测试

传入0时,会走备选方法,当达到熔断条件后,会调用getInstanceIdByHystrixFallBack备选方法,并且在指定时间段(sleepWindowInMilliseconds)后放一个请求过来看看是否恢复

熔断开启后,在sleepWindowInMilliseconds时间段还未到,即便服务恢复,也走备选方法

降级

什么是降级

降级主要体现在消费端(客户端、上游服务。。。叫什么都行),当服务提供方自身出现异常,停机时,客户端会主动采用备选方案,避免引发更多问题

例如:double 11(双11),服务器中有一个服务A,为了给双11提供服务器资源,暂时将A服务关闭,但如果直接关了,A服务的调用方会报错,所以需要在调用方采用降级操作

使用方法

修改调用方项目

导包

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
<version>2.2.5.RELEASE</version>
</dependency>

修改yml,新增如下

feign:
hystrix:
enabled: true #开启hystrix

启动类新增注解 @EnableHystrix

@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
@RibbonClient(name = "SERVICE-PROJECT",configuration = RbRule.class) //OpenFeign也使用RbRule策略
@EnableFeignClients
@EnableHystrix
public class ClientApplication {
public static void main(String[] args) {
SpringApplication.run(ClientApplication.class, args);
}
}

修改方法

    @Autowired
private FeignDemoService feignDemoService; //引入刚刚创建的接口 @HystrixCommand(fallbackMethod = "feignGetInstanceFallBack",commandProperties = {
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "5000") //5秒未响应则调用feignGetInstanceFallBack方法
})
@GetMapping("feignGetInstance")
public String feignGetInstance(){
return feignDemoService.getInstance();//调用,即可返回对应服务提供接口的信息
}
public String feignGetInstanceFallBack(){
return "feignGetInstanceFallBack";
}

测试

访问feignGetInstance,如果服务提供方正常,会给出对应的响应,如果在service打个断点模拟客户端请求超过指定响应时间,则调用备选方法;

服务端停止客户端调用直接进入备选方法,服务恢复后会自动恢复调用

其他降级策略

这些配置都是配置到@HystrixCommand注解中的

    @HystrixCommand(fallbackMethod = "feignGetInstanceFallBack",commandProperties = {
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "5000"),
@HystrixProperty(name = "fallback.enable",value = "true"),
.
.
.
.
})
参数 描述 默认值
execution.isolation.strategy 隔离策略,有THREAD和SEMAPHORETHREAD - 它在单独的线程上执行,并发请求受线程池中的线程数量的限制 SEMAPHORE - 它在调用线程上执行,并发请求受到信号量计数的限制 默认使用THREAD模式,以下几种场景可以使用SEMAPHORE模式:只想控制并发度外部的方法已经做了线程隔离调用的是本地方法或者可靠度非常高、耗时特别小的方法(如medis)
execution.isolation.thread.timeoutInMilliseconds 超时时间 默认值:1000在THREAD模式下,达到超时时间,可以中断在SEMAPHORE模式下,会等待执行完成后,再去判断是否超时设置标准:有retry,99meantime+avg meantime没有retry,99.5meantime
execution.timeout.enabled HystrixCommand.run()执行是否应该有超时。 默认值:true
execution.isolation.thread.interruptOnTimeout 在发生超时时是否应中断HystrixCommand.run()执行。 默认值:true THREAD模式有效
execution.isolation.thread.interruptOnCancel 当发生取消时,执行是否应该中断。 默认值为false THREAD模式有效
execution.isolation.semaphore.maxConcurrentRequests 设置在使用时允许到HystrixCommand.run()方法的最大请求数。 默认值:10S EMAPHORE模式有效
fallback.isolation.semaphore.maxConcurrentRequests 设置从调用线程允许HystrixCommand.getFallback()方法的最大请求数。 默认值:10 SEMAPHORE模式有效
fallback.enabled 确定在发生失败或拒绝时是否尝试调用HystrixCommand.getFallback()。 默认值为true

新问题,代码冗余

上面的使用配置方式,需要每个方法都配置一个fallback,为减少代码量,可将公共的fallback提取

方式1:@DefaultProperties

通过在类上添加@DefaultProperties注解,让此类下所有添加@HystrixCommand注解的方法执行异常都会走defaultFallback方法;

单独在@HystrixCommand中配置的fallbackMethod会走单独配置的方法

  • 实现如下
@RestController
@DefaultProperties(defaultFallback = "feignGetInstanceFallBackByPublic")
//第一步,配置DefaultProperties注解
public class DemoController { @Autowired
private FeignDemoService feignDemoService; //引入刚刚创建的接口 /**
* 走特定方法的fallback
* @return
*/
@HystrixCommand(fallbackMethod = "feignGetInstanceFallBack",commandProperties = {
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "5000")
})
@GetMapping("feignGetInstance")
public String feignGetInstance(){
return feignDemoService.getInstance();//调用,即可返回对应服务提供接口的信息
}
/**
* 走通用fallback
* @return
*/
@HystrixCommand
@GetMapping("feignGetInstanceByPublic")
public String feignGetInstanceByPublic(){
return feignDemoService.getInstance();//调用,即可返回对应服务提供接口的信息
} /**
* 特定方法的fallback
* @return
*/
public String feignGetInstanceFallBack(){
return "feignGetInstanceFallBack";
}
/**
* 公共方法的fallback
* @return
*/
public String feignGetInstanceFallBackByPublic(){
return "public-feignGetInstanceFallBack";
}
}
  • 测试

    当服务端异常时,

    调用feignGetInstance方法会跳转feignGetInstanceFallBack备用方法

    调用feignGetInstanceByPublic方法会调转feignGetInstanceFallBackByPublic备用方法

方式2:实现@FeignClient接口

实现@FeignClient标注的接口,不论多少个类都调用,通用Fallback备用方法

  • 新增通用FallBack实现类

    //FeignDemoService这个类就是被@FeignClient修饰的类
    @Component
    public class FeignDemoFallBackService implements FeignDemoService {
    @Override
    public String getInstance() {
    return "public_getInstance";
    } @Override
    public String getInstanceIdByTimeOut(int time) {
    return null;
    }
    }
  • 修改@FeignClient注解

    //@FeignClient注解中新增fallback,指定上一步实现的类
    @Service
    @FeignClient(value = "SERVICE-PROJECT",fallback = FeignDemoFallBackService.class) //调用的服务名
    public interface FeignDemoService {
    @GetMapping(value = "/getInstanceId") //服务端的请求地址,如果有入参可通过@PathVariable传入
    public String getInstance();
    @GetMapping(value = "/getInstanceIdByTimeOut/{time}")
    public String getInstanceIdByTimeOut(@PathVariable("time") int time);
    }
  • 调用方如下

    @RestController
    public class DemoController {
    @Autowired
    private FeignDemoService feignDemoService; //引入刚刚创建的接口
    @GetMapping("feignGetInstance")
    public String feignGetInstance(){
    return feignDemoService.getInstance();//调用,即可返回对应服务提供接口的信息
    }
    @GetMapping("feignGetInstanceByPublic")
    public String feignGetInstanceByPublic(){
    return feignDemoService.getInstance();//调用,即可返回对应服务提供接口的信息
    }
    }
  • 测试

    http请求feignGetInstance等接口,发生错误后,会统一返回FeignDemoService实现类中对应方法的fallback信息

监控

新建监控项目

导包

        <dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
<version>2.2.5.RELEASE</version>
</dependency>

启动类添加注解

@EnableHystrixDashboard

@SpringBootApplication
@EnableHystrixDashboard
public class MonitorApplication {
public static void main(String[] args) {
SpringApplication.run(MonitorApplication.class, args);
}
}

修改配置文件

server:
port: 9999
hystrix:
dashboard:
proxy-stream-allow-list: #这配置的就是要监控的ip、域名,如不配置可能会出现Unable to connect to Command Metric Stream错误
- "192.168.1.2"
- "192.168.1.3"

启动项目

访问 http://ip:prot/hystrix 出现跟刺猬一样的页面既成功

修改其他项目

目的是让Dashboard监控别的项目

导包

        <dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
<version>2.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

修改启动类

@SpringBootApplication
@EnableEurekaClient
@EnableCircuitBreaker //新增此注解
public class ServiceApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceApplication.class, args);
} /**新增此Bean配置
* 此配置是为了服务监控而配置,与服务容错本身无观,springCloud 升级之后的坑
* ServletRegistrationBean因为springboot的默认路径不是/hystrix.stream
* 只要在自己的项目中配置上下面的servlet即可
* @return
*/
@Bean
public ServletRegistrationBean getServlet() {
HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet() ;
ServletRegistrationBean registrationBean = new ServletRegistrationBean(streamServlet);
registrationBean.setLoadOnStartup(1);
registrationBean.addUrlMappings("/hystrix.stream");
registrationBean.setName("HystrixMetricsStreamServlet");
return registrationBean;
}
}

调用方法修改

需要监控的方法上需要新增@HystrixCommand注解,否则不会在Dashboard监控中体现

    @HystrixCommand //必须加这个
@GetMapping("getInstanceId")
public String getInstanceId(){
return instanceId;
}

测试

  • 启动上面修改好的两个项目

  • http://ip:prot/hystrix 打开页面中输入要监控服务的地址 ip:port/actuator/hystrix.stream

  • 然后请求被@HystrixCommand注解修饰的接口,Dashboard会显示如下界面

  • 至此,Dashboard就没问题了

监控看法

实心圆:共有两种含义。它通过颜色的变化代表了实例的健康程度,它的健康程度从 绿色 > 黄色 > 橙色 > 红色 递减;

该实心圆除了颜色的变化之外,它的大小也会根据实例的请求流量发生变化,流量越大实心圆就越大,所以通过该实心圆的展示,就可以在大量实例中快速的发现故障实例和高压力实例。

Hystrix&Dashboard配置使用的更多相关文章

  1. 【spring cloud】spring cloud2.X spring boot2.0.4调用feign配置Hystrix Dashboard 和 集成Turbine 【解决:Hystrix仪表盘Unable to connect to Command Metric Stream】【解决:Hystrix仪表盘Loading...】

    环境: <java.version>1.8</java.version><spring-boot.version>2.0.4.RELEASE</spring- ...

  2. springcloud(五):熔断监控Hystrix Dashboard和Turbine

    Hystrix-dashboard是一款针对Hystrix进行实时监控的工具,通过Hystrix Dashboard我们可以在直观地看到各Hystrix Command的请求响应时间, 请求成功率等数 ...

  3. 解决Hystrix Dashboard 一直是Loading ...的情况

    Hystrix是什么 Hystrix 能使你的系统在出现依赖服务失效的时候,通过隔离系统所依赖的服务,防止服务级联失败,同时提供失败回退机制,更优雅地应对失效,并使你的系统能更快地从异常中恢复. Hy ...

  4. Spring Cloud项目之断路器集群监控Hystrix Dashboard

    微服务(Microservices Architecture)是一种架构风格,一个大型复杂软件应用由一个或多个微服务组成.系统中的各个微服务可被独立部署,各个微服务之间是松耦合的.每个微服务仅关注于完 ...

  5. spring cloud(五)熔断监控Hystrix Dashboard和Turbine

    Hystrix-dashboard是一款针对Hystrix进行实时监控的工具,通过Hystrix Dashboard我们可以在直观地看到各Hystrix Command的请求响应时间, 请求成功率等数 ...

  6. SpringCloud系列七:Hystrix 熔断机制(Hystrix基本配置、服务降级、HystrixDashboard服务监控、Turbine聚合监控)

    1.概念:Hystrix 熔断机制 2.具体内容 所谓的熔断机制和日常生活中见到电路保险丝是非常相似的,当出现了问题之后,保险丝会自动烧断,以保护我们的电器, 那么如果换到了程序之中呢? 当现在服务的 ...

  7. Spring Cloud 入门教程(八): 断路器指标数据监控Hystrix Dashboard 和 Turbine

    1. Hystrix Dashboard (断路器:hystrix 仪表盘)  Hystrix一个很重要的功能是,可以通过HystrixCommand收集相关数据指标. Hystrix Dashboa ...

  8. 【六】Hystrix Dashboard

    除了隔离依赖服务的调用以外,Hystrix还提供了准实时的调用监控(Hystrix Dashboard) , Hystrix会持续地记录所有通过 Hystrix发起的请求的执行信息,并以统计报表和图形 ...

  9. spring cloud Hystrix监控面板Hystrix Dashboard和Turbine

    我们提到断路器是根据一段时间窗内的请求情况来判断并操作断路器的打开和关闭状态的.而这些请求情况的指标信息都是HystrixCommand和HystrixObservableCommand实例在执行过程 ...

随机推荐

  1. BIMFACE 二次开发 SDK 之歌

    <BIMFACE SDK 之歌>讲述了作者与 BIMFACE 从相识.相知.相爱.相守的艳遇之爱唯美故事   我是一个小小的程序员 穿行在人来人往的IT行业之间 编程工作与建筑信息化相关 ...

  2. 消息队列 - mac上安装RabbitMq (转)

    什么是RabbitMQ? RabbitMQ是由Erlang语言编写的实现了高级消息队列协议(AMQP)的开源消息代理软件(也称为面向消息的中间件).支持WIndows.Linux.MAC OS 操作系 ...

  3. Mysql数据库优化技术之配置篇、索引篇 ( 必看 必看 转)

    转自:Mysql数据库优化技术之配置篇.索引篇 ( 必看 必看 ) (一)减少数据库访问对于可以静态化的页面,尽可能静态化对一个动态页面中可以静态的局部,采用静态化部分数据可以生成XML,或者文本文件 ...

  4. Keepalived配置与使用(1)

    介绍 Keepalived是一个基于VRRP协议来实现的WEB服务高可用方案,可以利用其来避免单点故障.一个WEB服务至少会有2台服务器运行Keepalived,一台为主服务器(MASTER),一台为 ...

  5. 「游记」NOIP 2021 爆零记

    推荐访问本人自建博客 \(\text{cjwen.top}\) 欧拉欧拉欧拉欧拉欧拉欧拉欧拉欧拉,第一次参加 \(NOIP\),欧拉欧拉欧拉欧拉欧拉欧拉欧拉欧拉. 第一题比较简单,用类似于筛质数的做法 ...

  6. Scala函数高级篇

    一.匿名函数 没有名字的函数就是匿名函数,格式:(x:Int)=>{函数体} x:表示输入参数类型:Int:表示输入参数类型:函数体:表示具体代码逻辑 传递匿名函数至简原则: 参数的类型可以省略 ...

  7. tree目录结构

    https://www.cnblogs.com/richard-youth/p/6297827.html 常用命令 tree -Cd -L 3 相信很多使用过Linux的用户都用过tree命令,它可以 ...

  8. 国外很便宜的服务器 一年 2核2G 一年20美元

    今年 服务器 //=====================================一下是去年的================================= 优惠码:zhujicepin ...

  9. MyBatis加强(4)~mybatis 插件开发

    一.插件介绍[动态代理] 1.插件[动态代理]:mybatis 允许在已经映射的语句的执行过程的某个时机进行拦截增强的机制. 2.mybatis中的组件动态代理的运用: MyBatis 在四大组件对象 ...

  10. spring mvc通过客户端传值,controller获取Sort对象

    之前客户端需要根据需求按不同的排序方式查看数据,按照一种约定排序,比如1代表时间升序,2代表时间降序,3,4这种形式,然后后台根据这些值创建Sort对象. 后来发现完全多此一举,可以根据特定的方式,直 ...