Netflix创建了一个名为Hystrix的库,用于实现断路器模式。在微服务架构中,通常有多层服务调用,如以下示例所示:
图13.1。微服务图
较低级别的服务中的服务故障可能导致级联故障一直到用户。当对特定服务的调用超过circuitBreaker.requestVolumeThreshold
(默认值:20个请求)并且故障百分比大于circuitBreaker.errorThresholdPercentage
(默认值:> 50%)在由metrics.rollingStats.timeInMilliseconds
(默认值:10秒)定义的滚动窗口中时,服务将断开并且不会再进行调用。在出现错误和断路的情况下,开发人员可以提供降级服务。
图13.2。Hystrix回退可防止级联故障
断路可以阻止级联故障,并使服务不堪重负或无法恢复。降级服务可以是另一个受Hystrix保护的调用,静态数据或合理的空值。降级服务可以形成一个链,以便第一个降级服务调用其他一些业务调用,也可能返回一些静态数据。
要在项目中包含Hystrix,请使用具有groud ID 为org.springframework.cloud
和artifact ID 为spring-cloud-starter-netflix-hystrix的starter
。有关使用当前Spring Cloud Release Train设置构建系统的详细信息,请参阅Spring Cloud Project页面。
以下示例显示了具有Hystrix断路器的最小Eureka服务器:
@SpringBootApplication
@EnableCircuitBreaker
public class Application {
public static void main(String[] args) {
new SpringApplicationBuilder(Application.class).web(true).run(args);
}
}
@Component
public class StoreIntegration {
@HystrixCommand(fallbackMethod = "defaultStores")
public Object getStores(Map parameters) {
//do stuff that might fail
}
public Object defaultStores(Map parameters) {
return /* something useful */;
}
}
@HystrixCommand
由名为“ javanica ”的Netflix contrib库提供。Spring Cloud在连接到Hystrix断路器的代理中自动包装带有该注释的Spring bean。断路器计算何时打开和关闭电路以及在发生故障时应采取的措施。
要配置@HystrixCommand,
您可以将commandProperties
属性与@HystrixProperty
注解列表一起使用。有关详细信息,请参见 此处 有关。可用属性的详细信息,请参阅Hystrix wiki。
如果您希望某些线程本地上下文传播到 @HystrixCommand
,则默认声明不起作用,因为它在线程池中执行该命令(如果超时)。您可以通过配置或直接在注解中切换Hystrix以使用与调用者相同的线程,方法是要求它使用不同的“ 隔离策略 ”。以下示例演示如何在注解中设置线程:
@HystrixCommand(fallbackMethod = "stubMyService",
commandProperties = {
@HystrixProperty(name="execution.isolation.strategy", value="SEMAPHORE")
}
)
...
如果您正在使用@SessionScope
或@RequestScope
,则同样适用。如果遇到运行时异常,表示无法找到作用域上下文,则需要使用相同的线程。
您还可以选择将hystrix.shareSecurityContext
属性设置为true
。这样做会自动配置Hystrix并发策略插件钩子,以便将SecurityContext从
主线程转换到HystrixCommand使用的线程。Hystrix不会注册多个Hystrix并发策略,因此可以通过声明自己的HystrixConcurrencyStrategy
为Spring bean来实现扩展机制。Spring Cloud在Spring上下文中查找您的实现,并将其包装在自己的插件中。
连接断路器的状态也暴露在调用应用程序的/health
端点中,如以下示例所示:
{
"hystrix": {
"openCircuitBreakers": [
"StoreIntegration::getStoresByLocationLink"
],
"status": "CIRCUIT_OPEN"
},
"status": "UP"
}
要启用Hystrix度量流,请包含依赖关系spring-boot-starter-actuator
和设置management.endpoints.web.exposure.include: hystrix.stream
。这样做会将/actuator/hystrix.stream作为
管理端点公开,如以下示例所示:
org.springframework.boot
spring-boot-starter-actuator
Hystrix的主要好处之一是它能收集每个HystrixCommand的度量指标。Hystrix仪表板以高效的方式显示每个断路器的运行状况。
图14.1。Hystrix仪表板