Hystrix组件
demo地址
Hystrix 豪猪
起源 : netFlix springcloud netflix hystrix
作用:用来防止微服务系统重服务雪崩现象 实现服务熔断 熔断防止雪崩手段
说明
In a distributed environment, inevitably some of the many service dependencies will fail. Hystrix is a library that helps you control the interactions between these distributed services by adding latency tolerance and fault tolerance logic. Hystrix does this by isolating points of access between the services, stopping cascading failures across them, and providing fallback options, all of which improve your system's overall resiliency. --[摘自官方]
- 译: 在分布式环境中,许多服务依赖项不可避免地会失败。Hystrix是一个库,它通过添加延迟容忍和容错逻辑来帮助您控制这些分布式服务之间的交互。
Hystrix通过隔离服务之间的访问点、停止它们之间的级联故障以及提供后备选项来实现这一点,所有这些都可以提高系统的整体弹性。 - 通俗定义: Hystrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统中,许多依赖不可避免的会调用失败,超时、异常等,Hystrix能够保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障(服务雪崩现象),提高分布式系统的弹性。
作用
- hystrix 用来保护微服务系统 实现 服务降级 服务熔断
- 服务雪崩
- 服务降级
- 服务熔断
服务熔断的实现
Hystrix断路器打开条件
a. 当满足一定的阈值的时候 (默认10秒内超过20个请求次数)
b. 当失败率达到一定的时候 (默认10秒内超过50%的请求失败)
注意:一旦断路开启之后所有到这个服务请求均不可用, 只有在断路关闭之后才可用
- 服务熔断的实现思路
- 引入hystrix依赖,并开启熔断器(断路器)
- 模拟降级方法
- 进行调用测试
- 项目中引入hystrix依赖
java
<!--引入hystrix-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
- 开启断路器
java
@SpringBootApplication
@EnableCircuitBreaker //用来开启断路器
public class Products9998Application {
public static void main(String[] args) {
SpringApplication.run(Products9998Application.class, args);
}
}
- 使用HystrixCommand注解实现断路
java
//服务熔断
@GetMapping("/product/break")
//熔断之后快速响应
@HystrixCommand(fallbackMethod = "testBreakFall" )
public String testBreak(int id){
log.info("接收的商品id为: "+ id);
if(id<=0){
throw new RuntimeException("数据不合法!!!");
}
return "当前接收商品id: "+id;
}
public String testBreakFall(int id){
return "当前数据不合法: "+id;
}
- 访问测试
- 正常参数访问
- 错误参数访问
- 默认的服务FallBack处理方法
- 如果为每一个服务方法开发一个降级,对于我们来说,可能会出现大量的代码的冗余,不利于维护,这个时候就需要加入默认服务降级处理方法
java
@GetMapping("/product/hystrix")
@HystrixCommand(fallbackMethod = "testHystrixFallBack") //通过HystrixCommand降级处理 指定出错的方法
public String testHystrix(String name) {
log.info("接收名称为: " + name);
int n = 1/0;
return "服务[" + port + "]响应成功,当前接收名称为:" + name;
}
//服务降级处理
public String testHystrixFallBack(String name) {
return port + "当前服务已经被降级处理!!!,接收名称为: "+name;
}
- 总结
- 从上面演示过程中会发现如果触发一定条件断路器会自动打开,过了一点时间正常之后又会关闭。那么断路器打开条件是什么呢?
断路器
断路器打开条件
A service failure in the lower level of services can cause cascading failure all the way up to the user. When calls to a particular service exceed
circuitBreaker.requestVolumeThreshold
(default: 20 requests) and the failure percentage is greater thancircuitBreaker.errorThresholdPercentage
(default: >50%) in a rolling window defined bymetrics.rollingStats.timeInMilliseconds
(default: 10 seconds), the circuit opens and the call is not made. In cases of error and an open circuit, a fallback can be provided by the developer. --摘自官方
原文翻译之后,总结打开关闭的条件:
- 1、 当满足一定的阀值的时候(默认10秒内超过20个请求次数)
- 2、 当失败率达到一定的时候(默认10秒内超过50%的请求失败)
- 3、 到达以上阀值,断路器将会开启
- 4、 当开启的时候,所有请求都不会进行转发
- 5、 一段时间之后(默认是5秒),这个时候断路器是半开状态,会让其中一个请求进行转发。如果成功,断路器会关闭,若失败,继续开启。重复4和5。
断路器流程
整个流程: 当Hystrix监控到对该服务接口调用触发1 2 两个阈值时,会在系统中自动触发熔断器,在熔断器打开期间,任何到该接口请求均不可用。
同时在断路器打开5s后断路器会处于半开状态,此时断路器允许放行一个请求到该服务接口,如果该请求执行成功,断路器彻底关闭,如果该请求执行失败,断路器重新打开。
在实战过程中断路器使用
a. 为每一个调用接口提供自定义备选处理
java
//熔断之后处理fallbackMethod 书写快速失败方法名
@HystrixComand(fallbackHethod = "demoFallBack")
b. 使用Hystrix提供默认备选处理
@HystrixCommand(fallbackMethod = "demoFallBack",defaultrallback="默认处理方法名")
OpenFeign调用服务过程集成Hystrix实现默认备选处理
除了考虑服务端的熔断,还要考虑客户端的熔断,因为服务可能不可用,无法返回fallback。所以openfeign集成hytrix.
- 引入Hystrix依赖
注意: openfeign组件底层自动依赖Hystrix依赖项目中无须显示引入
- 开启Openfeign对Hystrix支持
java
# 开启openfeign在调用服务过程中 开启hystrix支持 默认:就是没有开启
feign.hystrix.enabled=true
- 开发openfeign服务调用失败默认处理的实现类
java
// 自定义HystrixClient 默认备选处理
@Configuration
public class HystrixClientFallBack implements HystrixClient {
@Override
public String demo(Integer id) {
return "当前服务不可用,请稍后再试! id: "+id;
}
}
- 在openfeign客户端接口中的
@FeignClients(value="服务id",fallBack = 默认处理.class)
java
@FeignClient(value = "HYSTRIX",fallback = HystrixClientFallBack.class) //fallback: 这个属性用来指定当前调用服务不可用时,默认的备选处理
public interface HystrixClient {
@GetMapping("/demo")
//openfeign伪客户端所以参数调用指明@RequestParam
String demo(@RequestParam("id") Integer id);
}
- 当调用服务不可用时,直接会执行自定义默认处理
服务降级的实现
服务降级: 站在系统整体负荷角度 实现: 关闭系统中某些边缘服务 保证系统核心服务运行
Emps 核心服务 Depts 边缘服务
- 客户端openfeign + hystrix实现服务降级实现
- 引入hystrix依赖
- 配置文件开启feign支持hystrix
- 在feign客户端调用加入fallback指定降级处理
- 开发降级处理方法
-
开启openfeign支持服务降级
feign.hystrix.enabled=true #开启openfeign支持降级
-
在openfeign客户端中加如Hystrix
java
@FeignClient(value = "PRODUCTS",fallback = ProductFallBack.class)
public interface ProductClient {
@GetMapping("/product/hystrix")
String testHystrix(@RequestParam("name") String name);
}
- 开发fallback处理类
java
public class ProductFallBack implements ProductClient {
@Override
public String testHystrix(String name) {
return "我是客户端的Hystrix服务实现!!!";
}
}
Hystrix Dashboard(仪表盘)
-
Hystrix DashBoard NetFlix
仪表盘: 用来显示状态信息
作用: 监控每一个@HystrixCommond注解创建一组度量构建一组信息, 然后通过图形化方式展示当前方法@HystrixCommond的状态信息
-
构建Hystrix DashBoard 仅仅是一个仪表盘应用
a. 创建springboot应用 b. 引入hystrix dashBoard 依赖
java<!--引入hystrix dashboard 依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId> </dependency>
Hystrix Dashboard(仪表盘,有点坑,以后研究)
- 说明
- Hystrix Dashboard的一个主要优点是它收集了关于每个HystrixCommand的一组度量。 Hystrix仪表板以高效的方式显示每个断路器的运行状况。
- 项目中引入依赖
java
<!--引入hystrix dashboard 依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>
- 入口类中开启hystrix dashboard
java
@SpringBootApplication
@EnableHystrixDashboard //开启监控面板
public class Hystrixdashboard9990Application {
public static void main(String[] args) {
SpringApplication.run(Hystrixdashboard9990Application.class, args);
}
}
- 启动hystrix dashboard应用
- 监控的项目中入口类中加入监控路径配置[新版本坑],并启动监控项目
注意:要监控哪个服务就把这段配置加到哪,不是加到仪表盘里面
java
@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;
}
-
通过监控界面监控
https://hystrix-app:port/actuator/hystrix.stream检测单个节点。
注意这里修改地址。
-
点击监控, 一致loading, 打开控制台发现报错[特别坑]
解决方案
-
新版本中springcloud将jquery版本升级为3.4.1,定位到monitor.ftlh文件中,js的写法如下: $(window).load(function()
-
jquery 3.4.1已经废弃上面写法
-
修改方案 修改monitor.ftlh为如下调用方式: $(window).on("load",function()
-
编译jar源文件,重新打包引入后,界面正常响应。
Hystrix停止维护
官方地址: github.com/Netflix/Hys...
-
翻译:Hystrix(版本1.5.18)足够稳定,可以满足Netflix对我们现有应用的需求。同时,我们的重点已经转移到对应用程序的实时性能作出反应的更具适应性的实现,而不是预先配置的设置(例如,通过自适应并发限制)。对于像Hystrix这样的东西有意义的情况,我们打算继续在现有的应用程序中使用Hystrix,并在新的内部项目中利用诸如
resilience4j
这样的开放和活跃的项目。我们开始建议其他人也这样做。 ----> sentinel 流量卫兵 -
Dashboard也被废弃
-
日后如何解决服务雪崩
a. Hystrix (版本15.18) 足够稳定,可以满足netflix对我们现有应用程序的需求
b. resilience4j 替换Hystrix 实时自适应系统熔断 Springcloud resilience4j
c. sentinel 流量卫兵 流量控制降低策略 (根据异常)
推荐
Sentinel & sentinel dashboard`
组件快速回顾
微服务
定义: 单体应用基于项目业务进行拆分,拆分出一个个微小服务, 每一个服务都是一个独立的应用, 独立开发,独立部署独立运行在自己的计算机进程里面, 针对于这些服务都是分布式管理。
springcloud 工具集
-
服务注册中心 netflix Eureka Go Consul java zk nacos
作用: 1.管理所有服务健康状态 2.存储所有微服务元数据信息 -
服务间通信问题
手段:
http协议:使用
rest方式通信
效率低 解耦合推荐
RPC技术:使用传输层协议通信 效率高 Dubbo框架 同一种语言通信
使用rest方式通信 :1.RestTemplate + Ribbon (负载均衡客户端组件)
2.openFeign(spring-->Feign(netflix) 伪Http客户端组件 调用存在负载均衡 支持springmvc注解
-
服务雪崩(某一个服务不可用, 并将不可用还渐放大导致整个系统服务不可用服务雪崩)
1.Hystrix ---服务熔断
2.Hystrix DashBoard Hystrix仪表盘来显示Hystrix断路器状态信息
引用 编程不良人