Hystrix组件

Hystrix组件

demo地址

gitee.com/w--kk/hytri...

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%的请求失败)

注意:一旦断路开启之后所有到这个服务请求均不可用, 只有在断路关闭之后才可用

  1. 服务熔断的实现思路
  • 引入hystrix依赖,并开启熔断器(断路器)
  • 模拟降级方法
  • 进行调用测试
  1. 项目中引入hystrix依赖
java 复制代码
<!--引入hystrix-->
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
  1. 开启断路器
java 复制代码
@SpringBootApplication
@EnableCircuitBreaker  //用来开启断路器
public class Products9998Application {
    public static void main(String[] args) {
        SpringApplication.run(Products9998Application.class, args);
    }
}
  1. 使用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;
}
  1. 访问测试
  • 正常参数访问
  • 错误参数访问
  1. 默认的服务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;
}
  1. 总结
  • 从上面演示过程中会发现如果触发一定条件断路器会自动打开,过了一点时间正常之后又会关闭。那么断路器打开条件是什么呢?

断路器

断路器打开条件

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 than circuitBreaker.errorThresholdPercentage (default: >50%) in a rolling window defined by metrics.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.

  1. 引入Hystrix依赖
    注意: openfeign组件底层自动依赖Hystrix依赖项目中无须显示引入
  1. 开启Openfeign对Hystrix支持
java 复制代码
# 开启openfeign在调用服务过程中 开启hystrix支持 默认:就是没有开启
feign.hystrix.enabled=true
  1. 开发openfeign服务调用失败默认处理的实现类
java 复制代码
// 自定义HystrixClient 默认备选处理
@Configuration
public class HystrixClientFallBack implements HystrixClient {
    @Override
    public String demo(Integer id) {
        return "当前服务不可用,请稍后再试! id: "+id;
    }
}
  1. 在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);
}
  1. 当调用服务不可用时,直接会执行自定义默认处理

服务降级的实现

服务降级: 站在系统整体负荷角度  实现: 关闭系统中某些边缘服务 保证系统核心服务运行

Emps 核心服务 Depts 边缘服务

  1. 客户端openfeign + hystrix实现服务降级实现
  • 引入hystrix依赖
  • 配置文件开启feign支持hystrix
  • 在feign客户端调用加入fallback指定降级处理
  • 开发降级处理方法
  1. 开启openfeign支持服务降级
    feign.hystrix.enabled=true #开启openfeign支持降级

  2. 在openfeign客户端中加如Hystrix

java 复制代码
@FeignClient(value = "PRODUCTS",fallback = ProductFallBack.class)
public interface ProductClient {
    @GetMapping("/product/hystrix")
    String testHystrix(@RequestParam("name") String name);
}
  1. 开发fallback处理类
java 复制代码
public class ProductFallBack implements ProductClient {
    @Override
    public String testHystrix(String name) {
        return "我是客户端的Hystrix服务实现!!!";
    }
}

Hystrix Dashboard(仪表盘)

  1. Hystrix DashBoard  NetFlix

    仪表盘: 用来显示状态信息

    作用: 监控每一个@HystrixCommond注解创建一组度量构建一组信息, 然后通过图形化方式展示当前方法@HystrixCommond的状态信息

  2. 构建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(仪表盘,有点坑,以后研究)

  1. 说明
  • Hystrix Dashboard的一个主要优点是它收集了关于每个HystrixCommand的一组度量。 Hystrix仪表板以高效的方式显示每个断路器的运行状况。
  1. 项目中引入依赖
java 复制代码
<!--引入hystrix dashboard 依赖-->
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>
  1. 入口类中开启hystrix dashboard
java 复制代码
@SpringBootApplication
@EnableHystrixDashboard //开启监控面板
public class Hystrixdashboard9990Application {
	public static void main(String[] args) {
		SpringApplication.run(Hystrixdashboard9990Application.class, args);
  }
}
  1. 启动hystrix dashboard应用
  1. 监控的项目中入口类中加入监控路径配置[新版本坑],并启动监控项目

注意:要监控哪个服务就把这段配置加到哪,不是加到仪表盘里面

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;
}
  1. 通过监控界面监控
    https://hystrix-app:port/actuator/hystrix.stream

    检测单个节点。注意这里修改地址。

  2. 点击监控, 一致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 工具集

  1. 服务注册中心 netflix Eureka  Go Consul  java zk nacos
    作用: 1.管理所有服务健康状态 2.存储所有微服务元数据信息

  2. 服务间通信问题

    手段:

    http协议:使用rest方式通信  效率低 解耦合 推荐

    RPC技术:使用传输层协议通信  效率高 Dubbo框架  同一种语言通信
    使用rest方式通信

    1.RestTemplate + Ribbon (负载均衡客户端组件)

    2.openFeign(spring-->Feign(netflix) 伪Http客户端组件  调用存在负载均衡  支持springmvc注解

  3. 服务雪崩(某一个服务不可用, 并将不可用还渐放大导致整个系统服务不可用服务雪崩)

    1.Hystrix ---服务熔断

    2.Hystrix DashBoard  Hystrix仪表盘来显示Hystrix断路器状态信息

引用 编程不良人

相关推荐
这孩子叫逆6 分钟前
Spring Boot项目的创建与使用
java·spring boot·后端
星星法术嗲人10 分钟前
【Java】—— 集合框架:Collections工具类的使用
java·开发语言
一丝晨光28 分钟前
C++、Ruby和JavaScript
java·开发语言·javascript·c++·python·c·ruby
天上掉下来个程小白31 分钟前
Stream流的中间方法
java·开发语言·windows
xujinwei_gingko42 分钟前
JAVA基础面试题汇总(持续更新)
java·开发语言
liuyang-neu43 分钟前
力扣 简单 110.平衡二叉树
java·算法·leetcode·深度优先
一丝晨光1 小时前
Java、PHP、ASP、JSP、Kotlin、.NET、Go
java·kotlin·go·php·.net·jsp·asp
罗曼蒂克在消亡1 小时前
2.3MyBatis——插件机制
java·mybatis·源码学习
_GR1 小时前
每日OJ题_牛客_牛牛冲钻五_模拟_C++_Java
java·数据结构·c++·算法·动态规划
coderWangbuer1 小时前
基于springboot的高校招生系统(含源码+sql+视频导入教程+文档+PPT)
spring boot·后端·sql