一、概述
源码wiki:https://github.com/Netflix/Hystrix/wiki
Netflix创建了一个名为Hystrix的库,实现断路器模式。在微服务体系结构中,通常有多层服务调用。
较低级别的服务中的服务故障可能导致级联故障直至用户。当对特定服务的调用大于CurrBurnReal.RealStestMultRESHOLD(默认值:20请求)和故障率大于TraceBurror.Error阈值百分比(默认值:50%)在MultICC.LoLink StutsTimeMimLimeDS(默认值:10秒)定义的滚动窗口中,电路断开,不进行调用。在发生错误和开路的情况下,开发者可以提供fallback。
开放的电路可以防止级联失败,并允许服务自我恢复。回退可以是Hystrix另一个受保护的调用,静态数据或一个空值。回退可能会是链,因此第一次回退会导致其他业务呼叫转而回退到静态数据。
二、使用
2.1、hystrix-javanica简介
源码地址:https://github.com/Netflix/Hystrix/tree/master/hystrix-contrib/hystrix-javanica
与其他语言(如反射和注释)相比,Java语言具有很大的优势。所有现代框架,如Spring,Hibernate,myBatis等都力求最大限度地利用这些优势。在Hystrix中引入注释的想法是改进的明显解决方案。目前使用Hystrix涉及编写大量代码,这是快速开发的障碍。您可能花费大量时间编写Hystrix命令。通过引入支持注释,Javanica项目的构想更容易使用Hystrix。
简化了Hystrix使用
2.2、使用
@HystrixCommand由一个名为“javanica”的Netflix contrib库提供。Spring Cloud会自动将带有该注释的Spring bean包装在连接到Hystrix断路器的代理中。断路器计算何时打开和关闭电路,以及在发生故障时应采取的措施。
要配置@HystrixCommand,您可以使用带有@HystrixProperty注释列表的commandProperties属性
1、pom引用
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency>
2、启动类增加如下注解
@EnableCircuitBreaker
3、在调用方法增加注解以及fallback方法
@Component public class StoreIntegration { @HystrixCommand(fallbackMethod = "defaultStores") public Object getStores(Map<String, Object> parameters) { //do stuff that might fail } public Object defaultStores(Map<String, Object> parameters) { return /* something useful */; } }
注意点:
1、fallbackMethod 必须是定义的方法
2、defaultStores 方法参数返回值与注解 HystrixCommand标记的一致
3、在发生问题后,会经过defaultStores处理。
三、其他
3.1、传播安全上下文或使用Spring Scopes
如果你想要一些线程本地上下文传播到@HystrixCommand,默认声明将不起作用,因为它在线程池中执行命令(在超时的情况下)。您可以使用某种配置将Hystrix切换为与调用方使用相同的线程,或者直接在注释中请求它使用不同的“隔离策略”。
参看地址:https://github.com/Netflix/Hystrix/wiki/Configuration#command-properties
execution.isolation.strategy:该属性指示HystrixCommand.run()执行的隔离策略,以下两种选择之一:
THREAD - 它在单独的线程上执行,并发请求受线程池中线程数的限制
SEMAPHORE - 它在调用线程上执行,并发请求受信号计数限制
缺省值和建议的设置是使用线程隔离(THREAD)和使用信号量隔离(SEMAPHORE)的HystrixObservableCommands运行HystrixCommands。
使用在对应的方法上增加
@HystrixCommand(fallbackMethod = "findByIdFallback", commandProperties = @HystrixProperty(name = "execution.isolation.strategy", value = "SEMAPHORE"))
如果使用@SessionScope或@RequestScope,则同样适用。您将知道何时需要执行此操作,因为运行时异常表示无法找到范围内的上下文。
【1.2开始】您也可以选择将hystrix.shareSecurityContext属性设置为true。这样做会自动配置一个Hystrix并发策略插件钩子,他可以将SecurityContext从主线程传输到Hystrix命令使用的钩子。Hystrix不允许注册多个hystrix并发策略,因此通过将自己的HystrixConcurrencyStrategy声明为Spring bean,可以使用扩展机制。Spring Cloud将在Spring上下文中查找您的实现,并将其包装在自己的插件中。【一般是出异常,出问题才需配置】
参看文章:https://github.com/spring-cloud/spring-cloud-netflix/issues/1330,https://github.com/spring-cloud/spring-cloud-netflix/issues/1336
3.1.1、Scope
Scope描述的是Spring容器如何新建Bean实例的。Spring的Scope有以下几种,通过@Scope注解来实现。
(1)Singleton:一个Spring容器中只有一个Bean的实例,此为Spring的默认配置,全容器共享一个实例。
(2)Prototype:每次调用新建一个Bean实例。
(3)Request:Web项目中,给每一个 http request 新建一个Bean实例。
(4)Session:Web项目中,给每一个 http session 新建一个Bean实例。
(5)GlobalSession:这个只在portal应用中有用,给每一个 global http session 新建一个Bean实例。
3.2、健康指标
连接断路器的状态也暴露在呼叫应用程序的/ health端点中。
访问地址:http://localhost:8761/health
可查看如下
{ "hystrix": { "openCircuitBreakers": [ "StoreIntegration::getStoresByLocationLink" ], "status": "CIRCUIT_OPEN" }, "status": "UP" }
此时可以断掉服务提供方,稍后查看
断路器打开
其中health的查看,需要添加
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
3.3、Hystrix度量流
启用Hystrix指标流包括对弹簧启动启动器执行器的依赖。这会将/hystrix.stream公开为管理端点。访问具体接口,能够查看消息
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
后期可以使用Dashboard查看
同样Feign也支持Hystrix
代码地址:https://github.com/bjlhx15/spring-cloud/tree/master/microservice-comsumer-movie-ribbon-with-hystrix