概念
断路器本身是一种开关装置,概念来自电学,当线路中有电器发生短路时,及时切断故障电路防止线路过载、发热导致火灾等。
分布式系统架构中,当某个微服务出现故障后,通过断路器的故障监控,向调用方返回一个错误响应而不是长时间的等待,这样可以避免某个线程被长时间占用不释放,导致服务器雪崩的可能。SpringCloud Hystrix
是基于Netfix Hystrix做的二次开发,该框架目标在于通过控制那些访问远程服务、系统和第三方库的节点,从而对延迟和故障提供强大的容错能力。
依赖
消费者工程引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
启动类注解@EnableCircuitBreaker
来开启断路器功能(也可以用@EnableHystrix,但不常用)
查看注解源码发现,可以用@SpringCloudApplication
来替代以下三个注解
@SpringBootApplication
@EnableDiscoveryClient //开启注册与发现,eureka
@EnableCircuitBreaker // 开启熔断,Hystrix
以上说明一个SpringCloud应用应包含服务发现和断路器。
Hystrix应用
服务消费方通过@HystrixCommand
注解来指定回调方法,回调方法用来返回错误信息。
为避免问题服务请求过多导致系统不可用,Hystrix采用舱壁模式
,为每个配置@HystrixCommand注解的服务分配一个线程池,这也是线程隔离的方式。
@Autowired
RestTemplate restTemplate;
@HystrixCommand(fallbackMethod = "demoFallback", commandKey = "demoKey")
public String hello() {}
通过断开服务提供者某个节点来测试,是否返回回调方法的返回值。
异常以及请求缓存待研究
Hystrix的核心注解@HystrixCommand,用来封装具体的依赖服务调用逻辑,fallback
是Hystrix命令执行失败时使用的后备方法,用来实现服务的降级处理逻辑。服务降级逻辑中,我们需要一个通用的响应结果,并且该结果的处理逻辑应当从缓存或静态逻辑来处理,而不是依赖网络请求来获取。
监控大盘
Springcloud不仅能够优雅的整合Hystrix,而且提供了仪表盘组件,它主要用来实时监控Hystrix的各项指标信息,通过观察实时监控,我们可以快速发现系统中存在的问题。主要是针对消费者进行监控:
引入依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
<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>
可以通过注解@EnableHystrixDashboard
来启动监控大盘功能。
通过首页可以看到Hystrix提供三种监控方式:
- 监控默认集群
- 监控指定集群
- 监控某个服务实例,这种方式没有多大实际用处
开启turbine
生产中,会用Turbine
和Hystrix Dashbord
配合来实现对集群的监控,Turbine用来汇集监控信息,并将聚合后的信息提供给Hystrix Dashboard来集中展示和监控。部署Turbine服务,引入依赖:
<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
开启Turbine
并在application.properties加入配置
spring.application.name=turbine-test
server.port=8989
management.port=8090
eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka/
turbine.app-config=MY-CONSUMER #指定需要收集监控信息的服务名
turbine.cluster-name-expression="default"
turbine.combine-host-port=true
查看监控如图