这篇博客主要整理
Netflix创建了一个名为Hystrix的库,它实现了断路器模式。在微服务体系结构中,通常有多个服务调用层
(微服务Hystrix仪表盘样例)
较低级别的服务中的服务故障可能导致级联故障一直到用户。 当对特定服务的调用大于circuitBreaker.requestVolumeThreshold(默认值:20个请求)并且在由metrics.rollingStats.timeInMilliseconds定义的滚动窗口中,failue百分比大于circuitBreaker.errorThresholdPercentage(默认值:> 50%)(默认值:10秒) 电路打开,不进行调用。在错误和开放电路的情况下,开发人员可以提供一个退路【即开发人员提供服务降级】。
Hystrix回退可防止级联故障
开放式电路可以阻止级联故障,并且可以让不堪重负或失败的服务时间得到治愈。 后备可以是另一个受Hystrix保护的调用,静态数据或理智的空值。 回退可能会被链接,因此第一个回退会使一些其他业务调用反过来又回到静态数据。
org.springframework.cloud
spring-cloud-starter-hystrix
具体实例:
@SpringBootApplication
//开起断路器
@EnableCircuitBreaker
public class Application {
public static void main(String[] args) {
new SpringApplicationBuilder(Application.class).web(true).run(args);
}
}
@Component
public class StoreIntegration {
//fallbackMethod中定义服务降级方法,此方法和正常调用方法参数必须一致
@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库提供【com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand】。 Spring Cloud在连接到Hystrix断路器的代理中自动包装带有该注释的Spring bean。 断路器计算何时打开和关闭电路,以及在发生故障时该怎么做。
要配置@HystrixCommand,可以将commandProperties属性与@HystrixProperty注释列表一起使用.
例如:
如果您希望某些线程本地上下文传播到@HystrixCommand,则默认声明将不起作用,因为它在线程池中执行该命令(如果超时)。 您可以使用某些配置切换Hystrix以使用与调用者相同的线程,或者通过要求它使用不同的“隔离策略”来直接在注解中使用。
//配置服务降级和线程隔离策略
@HystrixCommand(fallbackMethod = "stubMyService",
commandProperties = {
@HystrixProperty(name="execution.isolation.strategy", value="SEMAPHORE")
}
)
连接断路器的状态也暴露在调用应用程序的/health端点中。
{
"hystrix": {
"openCircuitBreakers": [
"StoreIntegration::getStoresByLocationLink"
],
"status": "CIRCUIT_OPEN"
},
"status": "UP"
}
要启用Hystrix度量标准流,需要添加spring-boot-starter-actuator。 这会将/hystrix.stream公开为管理端点。访问后返回json数据,浏览器不断刷新以获取实时的监控数据。
org.springframework.boot
spring-boot-starter-actuator
Hystrix的主要优点之一是它收集的关于每个HystrixCommand的指标集。 Hystrix仪表板以高效的方式显示每个断路器的运行状况。
具体样例如上
Hystrix超时和Ribbon客户端
使用包装Ribbon客户端的Hystrix命令时,您需要确保Hystrix超时被配置为比配置的Ribbon超时要长,包括可能进行的任何潜在重试。例如,如果您的Ribbon连接超时是1秒,而Ribbon客户端可能会重试三次请求,那么Hystrix超时应该略多于3秒。
org.springframework.cloud
spring-cloud-starter-hystrix-dashboard
要运行Hystrix仪表板,要在SpringBoot主类上添加@EnableHystrixDashboard注解启用仪表板。 然后,您访问/hystrix并将仪表板指向Hystrix客户端应用程序中的单个实例/hystrix.stream端点。如下:
注意:
连接到使用HTTPS的/hystrix.stream端点时,JVM必须信任服务器使用的证书。 如果证书不可信,则必须将证书导入JVM,以便Hystrix仪表板生成成功连接到流端点。
查看单个实例,Hystrix数据在系统整体运行状况方面不是很有用。 Turbine是一个应用程序,它将所有相关的/hystrix.stream端点聚合到一个组合的/turbine.stream中,以便在Hystrix仪表板中使用。 个别实例位于Eureka。启动Turbine需要在SpringBoot主类添加@EnableTurbine,还需要引入相关的maven依赖。
org.springframework.cloud
spring-cloud-netflix-turbine
turbine.appConfig是配置一个eureka服务的列表,turbine将使用它来查找实例。然后使用类似于以下内容的URL在Hystrix仪表板中使用turbine:http://my.turbine.sever:8080 / turbine.stream?cluster = CLUSTERNAME(如果名称为“default”,则可以省略cluster参数)[如下图访问http://ip:port/hystrix,url中输入http://ip:port/turbine.stream]。群集参数必须与turbine.aggregator.clusterConfig一致。turbine.aggregator.clusterConfig配置必须为大写
turbine:
aggregator:
clusterConfig: CUSTOMERS
//配置需要监控的服务名,多个用逗号隔开
appConfig: customers
clusterName可以通过Turb.clusterNameExpression中的SPEL表达式进行自定义,默认值为appName。
要为所有应用程序使用“默认”群集,您需要一个字符串文字表达式(带单引号,如果它也在YAML中,则使用双引号进行转义)
application.yaml
turbine:
appConfig: customers,stores
clusterNameExpression: "'default'"
在某些环境中,从所有分布式Hystrix命令中提取度量标准的经典Turbine模型不起作用[如微服务与Turbine网路不同]。 在这种情况下,您可能希望让Hystrix命令将指标推送到Turbine,而Spring Cloud通过消息传递实现这一点。 您需要在客户端上执行的操作是为spring-cloud-netflix-hystrix-stream和您选择的spring-cloud-starter-stream- *添加相关消息带来依赖,如rabbitmq和kafka。
在服务器端只需创建一个Spring Boot应用程序并使用@EnableTurbineStream进行注释,默认情况下它将出现在端口8989上(将您的Hystrix仪表板指向该端口,任何路径)。 您可以使用server.port或turbine.stream.port自定义端口。 如果在类路径上也有spring-boot-starter-web和spring-boot-starter-actuator,那么你可以打开执行器通过提供不同的management.port,在单独的端口(默认情况下使用Tomcat)上的端点[即通过设置management.port提供单独的访问端口,供仪表板访问]。然后,您可以将Hystrix仪表板指向Turbine Stream Server而不是单独的Hystrix流。 如果Turbine Stream在myhost上的端口8989上运行,则将http:// myhost:8989放入Hystrix仪表板的流输入字段中。
Spring Cloud提供了spring-cloud-starter-netflix-turbine-stream,它具有运行Turbine Stream服务器所需的所有依赖关系 - 只需添加您选择的Stream绑定器,例如: spring-cloud-starter-stream-rabbit。 您需要Java 8来运行应用程序,因为它是基于Netty的。
微信公众号:
JAVA程序猿成长之路
分享资源,记录程序猿成长点滴。专注于Java,Spring,SpringBoot,SpringCloud,分布式,微服务。