转自:https://www.jianshu.com/p/f40acb0d01b2
一、Hystrix的概述
Hystrix 是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统中,许多依赖不可避免的会调用失败,比如
超时,异常等,Hystrix能够保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障,以提高分布式系统的
弹性。
"断路器"本身是一种开关装置,当某个服务单元发生故障后,通过断路器的故障监控,向调用方返回一个符合预期的,可
处理的备选响应(FallBack),而不是长时间的等待或者抛出调用方法无法处理的异常,这样就保证了服务调用方的线程不会被长
时间、不必要的占用,从而避免了故障在分布式系统中的蔓延,乃至雪崩。
Hystrix 在 GitHub上的源码地址:https://github.com/Netflix/Hystrix/wiki/How-To-Use
二、作用
(1)、服务熔断:
熔断机制是应对雪崩效应的一种微服务链路保护机制。当扇出链路的某个微服务不可用或者响应时间太长时,会进行服务
的降级,进而熔断该节点微服务的调用,快速返回"错误"响应信息。当检测到该节点微服务调用响应正常后恢复调用链路。在
SpringCloud框架里熔断机制通过Hystrix实现。Hystrix会监控微服务间调用状况,当失败的调用到一定阈值,默认是5秒内
20次调用失败就会启动熔断机制。熔断机制的注解是:@HystrixCommand。
(2)、服务降级:
整体资源快不够了,忍痛将某些服务先关掉,待度过难关之后,再开启回来。
● 服务降级处理是在客户端实现完成的,与服务端没有关系。
● SpringCloud的底层是Spring,Spring有两个重要的技术就是IOC和AOP(面向切面编程),把主业务和异常处理
分开,把异常处理使用织入的方式,实现异常处理与业务的解耦,把分散的fallback方法集中在
● 步骤:
①、写一个接口:
/**
* @Description: Feign的使用-定义接口,fallbackFactory--> 服务降级,统一处理fallback
* @Author: zlj
* @CreateDate: 2018/6/22 14:53
* @Version: 1.0.0
*/
@FeignClient(value = "MICROSERVICECLOUD-DEPT",
fallbackFactory = DeptClientServiceFallbackFactory.class)
public interface DeptClientService {
@PostMapping("/dept/add")
boolean add(Dept dept);
@GetMapping("/dept/get/{id}")
Dept get(@PathVariable("id") Long id);
@GetMapping("/dept/list")
List<Dept> list();
}
②、写一个fallback类,用来统一处理fallback:
@Component //不要忘记添加该注解
public class DeptClientServiceFallbackFactory implements FallbackFactory<DeptClientService> {
@Override
public DeptClientService create(Throwable throwable) {
return new DeptClientService() {
@Override
public boolean add(Dept dept) {
return false;
}
@Override
public Dept get(Long id) {
return new Dept().setDeptno(id).setDb_source("no this database in MySQL").
setDname("该ID: " + id + "没有对应信息 - null -Hystrix");
}
@Override
public List<Dept> list() {
return null;
}
};
}
}
③、pom.xml 中添加以下内容,开启feign的hyxtrix功能:
feign:
hystrix:
enable: true
④、主配置类:
/**
* Feign的使用
*/
@EnableEurekaClient
@EnableFeignClients
@EnableAutoConfiguration(exclude = {HibernateJpaAutoConfiguration.class,
DataSourceAutoConfiguration.class})
@SpringBootApplication
public class Application_feign {
public static void main(String[] args) {
SpringApplication.run(Application_feign.class, args);
}
}
⑤、如果服务提供者down掉了,但是我们做了服务降级处理,让客户端在服务端不可用时也会获得提示信息而不会挂起耗死服务器,
所以再访问时,页面会显示以下fallback指定的信息:
{"deptno":1,"dname":"该ID: 1没有对应信息,Consumer客户端提供的降级信息,此刻服务Provider已经关闭",
"db_source":"no this database in MySQL"}
(3)、服务限流
(4)、接近实时的监控
三、@EnableHystrix注解与@EnableCircuitBreaker注解的区别
(1)、查看源码可知,@EnableHystrix注解的作用和@EnableCircuitBreaker注解的作用一样,@EnableHystrix注解对
@EnableCircuitBreaker注解进行了封装;
(2)、@EnableHystrix注解的底层源码:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@EnableCircuitBreaker
public @interface EnableHystrix {
}
四、Hystrix 和 Feign 的超时时间问题
Hystrix的默认超时时间是1秒。默认开启超时机制。
Hystrix 超时时间需要大于 Feign 超时时间,否则 Feign 重试会失效
#熔断器启用
feign:
hystrix:
enabled: true
#请求处理的超时时间
ribbon.ReadTimeout: 12
#请求连接的超时时间
ribbon.ConnectTimeout: 10
#断路器的超时时间,下级服务返回超出熔断器时间,即便成功,消费端消息也是TIMEOUT,所以一般断路器的超时时间需要大于ribbon的超时时间。
hystrix:
command:
default:
execution:
timeout:
enabled: true
isolation:
thread:
#服务的返回时间大于ribbon的超时时间,会触发重试
#默认=1000,太小
timeoutInMilliseconds: 60 # Hystrix 超时时间需要大于 Feign 超时时间,否则 Feign重试会失效
feign的重试机制:
feign默认是通过自己包下的Retryer进行重试配置,默认是5次
五、HystrixDashboard
HystrixDashboard是对微服务监控的可视化界面展示
1)、pom.xml文件:
服务提供者必须要导入一下依赖:
<!-- actuator 监控信息完善 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
HystrixDashboard 模块需要导入的依赖有:
<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>
2)、实心圆:共有两种含义,它通过颜色的变化代表了实例的健康程度,它的健康程度从:
绿色 < 黄色 < 橙色 < 红色 递减。
该实心圆除了颜色的变化之外,它的大小也会根据实例的请求流量发生变化,流量越大,该实心圆就越大。
所以通过实心圆的展示,就可以在大量的实例中快速的发现故障实例和高压力实例。
3)、曲线:用来记录2分钟内流量的相对变化,可以通过它来观察到流量的上升和下降趋势。
作者:紫雨杰
链接:https://www.jianshu.com/p/f40acb0d01b2
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。