Spring Cloud Hystrix
Hystrix也是基于Netflix,它具有服务降级,服务熔断,线程隔离,请求缓存,请求合并以及服务监控等功能。
使用步骤:
1.引用
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
- 在启动类上使用
@EnableCircuitBreaker
或者@EnableHystrix
,在Spring Cloud项目中,启动类可以使用@SpringCloudApplication
其中包含了@SpringBootApplication
,@EnableDiscoveryClinet
和@EnableCircuitBreaker
也就是说,SpringCloud本身就包含了熔断器。 - 在使用的Service中使用
@HystrixCommand
来表示服务降级方法。如:
@HystrixCommand(fallbackMethod = "fallback")
public String consumer() {
return restTemplate.getForObject("http://eureka-client/dc", String.class);
}
Hystrix 依赖隔离
Hystrix通过舱壁模式实现了线程池隔离,它会为每一个HystrixCommand
提供一个线程池,这样可以保证在我们有使用@HystrixCommand
出现高延迟的情况,也不会影响其他的服务调用,因为他们各用线程池。
好处:
- 保护自身,不会受依赖的其他服务影响
- 降低接入风险,新服务不稳定的情况,不会影响本身
- 当依赖服务正常后,它的线程池会被清理并立即恢复健康
- 当依赖服务配置错误,,线程池会快速的反应出此问题(通过失败次数、延迟、超时、拒绝等指标的增加情况)
- 当依赖服务出现大性能问题,线程池的监控指标信息会反映变化
- 每个线程池都提供了内置的并发实现,可以利用它为同步的依赖服务构建异步的访问
信号量隔离
如果在实际应用中,发现线程池隔离会影响性能,可以使用信号量隔离,但是在使用信号量隔离,需要保证依赖服务本身的高可用,使用方法就是在配置中增加execution.isolation.strategy = SEMAPHORE
信号量默认是10,这个数量也是可以再配置中修改的。
Hystrix的隔离是和服务降级同时存在的,也就是说在我们使用@HystrixCommand
时就已经包含的依赖隔离。
Hystrix 熔断器
熔断器相当于我们的保险丝,它在以下时间会触发:
- 快照时间窗:统计近10秒的请求和错误数据
- 请求总数下限:在快照时间窗内,必须要满足请求总数下限,默认20
- 错误百分比下限:在快照时间窗内,超过了请求总数下限,且发生了16次异常,超过50%。默认50%
作用当熔断器未打开时,假设我们的服务超时为3秒,那么通常每个请求过来出现超时都需要等待3秒。当熔断器打开时,服务降直接使用降级,不需要等待3秒,而是直接返回fallback。这时Hystrix会启动一个休眠时间窗,它用来表示在某一时间段之后,将一部分请求放给主逻辑,用来尝试请求返回是否正常,如果正常关闭熔断器,如果不正常重新计时。
Hystrix Dashboard
Dashboard用来对Hystrix的各种指标进行监控。
使用步骤:
- 引用
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
2.启动类增加@EnableHystrixDashboard
它包含三种监控方式:
- 默认集群监控,通过URL
http://turbine-hostname:port/turbine.stream
开启,实现对默认集群的监控 - 制定集群监控,通过URL
http://turbine-hostname:port/turbine.stream?cluster=[clusterName]
开启,实现对clusterName集群的监控 - 单独应用监控,通过URL
http://hystrix-app:port/hystrix.stream
开启,实现对具体某个服务实例的监控
针对集群监控需要整合turbine目前这里还不能使用,这里对之前已经使用了@EnableCircuitBreaker
的服务进行监控,直接在Dashboard首页输入http://localhost:port/hystrix.stream
,在监控首页有Delay
用来表示每隔多少时间进行一次轮询。Title
监控的服务标题。
- 实心圆,通过颜色表示健康程度,绿黄橙红依次递减,大小和流量成正比。
- 曲线,两分钟的流量变化
Turbine
监控集群Hystrix
使用步骤:
- 引用
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-turbine</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
- 启动类增加
@EnableTurbine
- 配置增加
# 注册中心地址
eureka.client.serviceUrl.defaultZone=http://localhost:1001/eureka/
# 指定需要收集监控信息的服务名
turbine.app-config=eureka-consumer-ribbon-hystrix
# 集群名称
turbine.cluster-name-expression="default"
#可以让同一主机上的服务通过主机名与端口号的组合来进行区分,默认情况下会以host来区分不同的服务,这会使得在本地调试的时候,本机上的不同服务聚合成一个服务来统计。
turbine.combine-host-port=true
通过消息代理收集聚合
Spring Cloud 在整合Turbine使用了消息代理的收集,也就是说我们可以将所有需要收集的监控信息都输出到消息代理中,然后Turbine再从消息代理异步的获取监控信息,在程序员DD的博客中使用了RabbitMQ大家可以去看看。
使用步骤:
- 引用
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-turbine-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
这个amqp
中已经依赖了spring-cloud-starter-turbine-strean
和spring-cloud-starter-stream-rabbit
2. 启动类使用@EnableTurbineStream
3. 配置增加
#Turbine管理端口
management.port=8990
eureka.client.serviceUrl.defaultZone=http://localhost:1001/eureka/
- 修改之前Hystrix服务,在pom中引用上
amqp