【java框架ssm集成Hystrix】

Hystrix

简介

hystrix官网文档地址:https://github.com/Netflix/Hystrix/wiki
以下是官网介绍

  1. 什么是hystrix
    在分布式环境中,不可避免地会有许多服务依赖项中的某些失败。Hystrix是一个库,可通过添加延迟公差和容错逻辑来帮助您控制这些分布式服务之间的交互。Hystrix通过隔离服务之间的访问点,停止服务之间的级联故障并提供后备选项来实现此目的,所有这些都可以提高系统的整体弹性。
  2. Hystrix的作用
    Hystrix旨在执行以下操作:
    提供保护并控制通过第三方客户端库(通常是通过网络)访问的依赖项的延迟和失败。
    停止复杂的分布式系统中的级联故障。
    快速失败并快速恢复。
    回退并在可能的情况下正常降级。
    启用近乎实时的监视,警报和操作控制。
  3. Hystrix解决什么问题
    复杂的分布式体系结构中的应用程序具有数十种依赖关系,每种依赖关系不可避免地会在某个时刻失败。如果主机应用程序未与这些外部故障隔离开来,则可能会被淘汰。
    例如,对于依赖30个服务的应用程序,其中每个服务的正常运行时间为99.99%,您可以期望:
    99.99 30 = 99.7%的正常运行时间
    10亿个请求中的0.3%= 3,000,000个故障
    /每月2小时以上的停机时间,即使所有依赖性都具有出色的正常运行时间。
    现实通常更糟。
    即使您没有对整个系统进行永续性设计,即使所有依赖项都能很好地执行,即使宕机0.01%,对数十种服务中的每一项的总影响也等于一个月可能会有数小时的宕机。
    当一切正常时,请求流如下所示:
    当许多后端系统之一变得潜在时,它可以阻止整个用户请求:
    随着高流量,单个后端依赖关系变得潜在,这可能导致所有服务器上的所有资源在几秒钟内变得饱和。
    应用程序中可能会导致网络请求通过网络或客户端库进行访问的每个点都是潜在故障的根源。比故障更糟糕的是,这些应用程序还会导致服务之间的等待时间增加,从而备份队列,线程和其他系统资源,从而导致整个系统出现更多级联故障。
    当通过第三方客户端执行网络访问时,这些问题会更加严重。“第三方”是一个隐藏了实施细节的“黑匣子”,可以随时更改,并且每个客户端库的网络或资源配置都不相同,并且通常难以监视和监控。改变。
    更糟糕的是,传递依赖项会执行潜在的昂贵或易出错的网络调用,而不会被应用程序明确调用。
    网络连接失败或降级。服务和服务器出现故障或变慢。新的库或服务部署会更改行为或性能特征。客户端库有错误。
    所有这些都代表需要隔离和管理的故障和延迟,以使单个故障依赖项无法关闭整个应用程序或系统。
    ##Hystrix的设计原则是什么?
    Hystrix的工作原理:
    防止任何单个依赖项耗尽所有容器(例如Tomcat)用户线程。
    减少负载并快速失败,而不是排队。
    在可行的情况下提供备用,以保护用户免受故障的影响。
    使用隔离技术(例如隔板,泳道和断路器模式)来限制任何一种依赖关系的影响。
    通过近实时指标,监控和警报优化发现时间
    通过在Hystrix的大多数方面中以低延迟传播配置更改来优化恢复时间,并支持动态属性更改,这使您可以通过低延迟反馈回路进行实时操作修改。
    防止整个依赖项客户端执行失败,而不仅仅是网络流量失败。
  4. Hystrix如何实现其目标?
    将对外部系统(或“依赖项”)的所有调用包装在通常在单独线程中执行的HystrixCommand或HystrixObservableCommand对象中(这是命令模式的示例)。
    超时呼叫花费的时间超过您定义的阈值。有一个默认值,但是对于大多数依赖项,您可以通过“属性”自定义设置这些超时,以使它们略高于针对每个依赖项测得的99.5个百分点的性能。
    为每个依赖项维护一个小的线程池(或信号灯);如果已满,发往该依赖项的请求将立即被拒绝,而不是排队。
    测量成功,失败(客户端抛出的异常),超时和线程拒绝。
    如果某个服务的错误百分比超过阈值,则使断路器跳闸,以在一段时间内手动或自动停止所有对特定服务的请求。
    当请求失败,被拒绝,超时或短路时执行回退逻辑。
    几乎实时监控指标和配置更改。

通俗来讲 包括一下3个点,
1、依赖隔离
2、熔断
3、降级和监控报警

服务搭建

原生方式

环境 jdk1.6+
Maven依赖

<dependency>
    <groupId>com.netflix.hystrix</groupId>
    <artifactId>hystrix-core</artifactId>
    <version>1.5.18</version>
</dependency>

自定义一个继承HystixCommand或者HystrixObserverCommand的command类,然后将所调用的依赖放在run()函数中,最后执行execute(同步执行),或者queue(异步执行)

package com.tff622.controller;

import com.netflix.hystrix.*;
import com.tff622.service.MyService;
import org.junit.Test;

public class MyHystrixCommand extends HystrixCommand<Integer> {

    private MyService myService;
    protected MyHystrixCommand(MyService myService) {
        super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("myServiceProvider"))//设置线程池分组名称
                .andCommandKey(HystrixCommandKey.Factory.asKey("getOrderId"))//设置命令key
                .andCommandPropertiesDefaults(HystrixCommandProperties.Setter()
                        .withCircuitBreakerRequestVolumeThreshold(5)//至少有5个请求,熔断器才进行错误率的计算
                        .withCircuitBreakerSleepWindowInMilliseconds(5000)//熔断器中断请求5秒后会进入半打开状态,放部分流量过去重试
                        .withCircuitBreakerErrorThresholdPercentage(50)//错误率达到50开启熔断保护
                        .withExecutionTimeoutEnabled(true))
                .andThreadPoolPropertiesDefaults(HystrixThreadPoolProperties
                        .Setter().withCoreSize(10)));
        this.myService = myService;
    }

    @Override
    protected Integer run() throws Exception {
        return myService.getOrderId();
    }
    @Override
    protected Integer getFallback() {
        return -1;
    }



}

注解方式

pom.xml添加

<dependency>
		<groupId>com.netflix.hystrix</groupId>
		<artifactId>hystrix-javanica</artifactId>
	<version>1.5.18</version>
</dependency>

首先导入pom依赖,然后在业务层 相应的方法添加
@HystrixCommand(fallbackMethod = “helloFallback”)
注解参数以及相应介绍

public interface HystrixCommand {
    // HystrixCommand 命令所属的组的名称:默认注解方法类的名称
    String groupKey() default "";
 
    // HystrixCommand 命令的key值,默认值为注解方法的名称
    String commandKey() default "";
 
    // 线程池名称,默认定义为groupKey
    String threadPoolKey() default "";
    // 定义回退方法的名称, 此方法必须和hystrix的执行方法在相同类中
    String fallbackMethod() default "";
    // 配置hystrix命令的参数
    HystrixProperty[] commandProperties() default {};
    // 配置hystrix依赖的线程池的参数
    HystrixProperty[] threadPoolProperties() default {};
 
    // 如果hystrix方法抛出的异常包括RUNTIME_EXCEPTION,则会被封装HystrixRuntimeException异常。我们也可以通过此方法定义哪些需要忽略的异常
    Class<? extends Throwable>[] ignoreExceptions() default {};
 
    // 定义执行hystrix observable的命令的模式,类型详细见ObservableExecutionMode
    ObservableExecutionMode observableExecutionMode() default ObservableExecutionMode.EAGER;
 
    // 如果hystrix方法抛出的异常包括RUNTIME_EXCEPTION,则会被封装HystrixRuntimeException异常。此方法定义需要抛出的异常
    HystrixException[] raiseHystrixExceptions() default {};
 
    // 定义回调方法:但是defaultFallback不能传入参数,返回参数和hystrix的命令兼容
    String defaultFallback() default "";
}
 


参数原地址

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值