目录
Hystrix是什么,能干什么?
- 分布式系统容易出现的问题
- Hystrix是什么?
- Hystrix能干什么?
服务降级,服务熔断,服务限流,接近实时的监控
Hystrix的服务熔断
- 服务熔断是什么?
- 构建带有Hystrix断路器的服务提供者。 注意:要在服务消费者上建立Hystrix
2.1 先导入Hystrix断路器的依赖,在服务
2.2 在Controller类中的某一个需要服务熔断的方法上增加 @HystrixCommand注解。
2.3 在服务提供者的主启动类上添加启动注解==@EnableCircuitBreaker注解==
2.4 测试:
先启动Eureka,启动服务提供者,启动服务消费者
Hystrix 的服务降级
什么是服务降级?
服务降级是在服务消费者端,实现过程
服务降级处理是在客户端实现完成的,与服务端没有关系
整体资源快不够了,忍痛将某些服务单元先关掉,关闭后还要返回一些可处理的备选方法,待渡过难关,再开启回来,
使用步骤:
1、在api层创建一个一个降级服务,并实现FallbackFactory接口,且泛型为Feign的调用接口
切记,必须在类上方加上@Component注解
@Component
public class UserClientService implements FallbackFactory<UserService> { //Feign调用的接口
@Override
public UserService create(Throwable throwable) {
//构建匿名
return new UserService() {
@Override
public User findById(Integer id) {
return new User(id,"该ID:"+id+"没有对应的数据","Hystrix此服务以关闭");
}
@Override
public List<User> findAll() {
return null;
}
};
}
}
2、在api的接口中(此处我的分布式项目中使用的是Feign的调用方法)
@FeignClient(value = "MICROSERVICE-PRODUCT",fallbackFactory = UserClientService.class) //指明服务关闭后,会返回方法的类的字节码
public interface UserService {
@GetMapping("/product/findone/{id}")
public User findById(@PathVariable("id") Integer id);
@GetMapping("/product/list")
public List<User> findAll();
}
3、在消费者模块的配置文件yml中
feign: #开启服务熔断服务降级
hystrix:
enabled: true
4、测试
开启eureka的集群,提供者,Feign的消费者,然后进行测试
当我们的整体资源不快够用,需要关闭提供该服务,又不想整体资源因依赖这个服务而发生级联效应,我们使用了上面的技术进行了服务降级处理,
当我们关闭此服务后
服务熔断和服务降级的区别
两者其实从有些角度看是有一定的类似性的:
目的很一致,都是从可用性可靠性着想,为防止系统的整体缓慢甚至崩溃,采用的技术手段;
最终表现类似,对于两者来说,最终让用户体验到的是某些功能暂时不可达或不可用;
粒度一般都是服务级别,当然,业界也有不少更细粒度的做法,比如做到数据持久层(允许查询,不允许增删改);
自治性要求很高,熔断模式一般都是服务基于策略的自动触发,降级虽说可人工干预,但在微服务架构下,完全靠人显然不可能,开关 预置、配置中心都是必要手段;
两者的区别也是明显的:
触发原因不太一样,服务熔断一般是某个服务(下游服务)故障引起,而服务降级一般是从整体负荷考虑;
管理目标的层次不太一样,熔断其实是一个框架级的处理,每个微服务都需要(无层级之分),而降级一般需要对业务有层级之分(比如降级一般是从最外围服务开始)
总结:
分布式项目中,有数十个依赖关系,每个依赖关系在某些时候不可避免地失败,
服务雪崩:当A调用微服务B,B调C,和其他微服务,这是扇出,当扇出链路上某个微服务调用响应时间过长或者不可用,对微服务的A的调用就会占用越来越多的系统资源,导致系统崩溃,所谓的雪崩效应
服务熔断:一般是某个服务异常引起的,相当于“保险丝”,当某个异常条件被触发,直接熔断整个服务,不是等到此服务超时
服务降级:降级一般是从整体负荷考虑,当某个服务熔断之后,服务器将不再被调用,客户端可自己准备一个本地的fallback回调,返回一个缺省值,虽然服务水平下降,当能用,比直接挂掉要强
springcloud是spring,采用AOP的思想,异常处理信息,我们某个服务的功能是每个方法,我们还可以使用AOP直接在api层通过接口设置服务降级
Hystrix的服务监控和服务限流
Hystrix实现了准实时的调用监控
除了隔离依赖服务的调用以外,Hystrix还提供 了准实时的调用监控(Hystrix Dashboard),Hystrix会持续地记录所有通过
Hystrix发起的请求的执行信息,并以统计报表和图形的形式展示给用户,包括每秒执行多少请求多少成功,多少失败等。
Netflix通过hystrix-metrics-event-stream项目实现了对以上指标的监控。Spring Cloud也提供了Hystrix Dashboard的整合,
对监控内容转化成可视化界面。
服务监控实现步骤
- 建立服务消费者
- 修改pom文件
- 消费者application.yml文件
- 服务消费者主启动类上添加 @EnableHystrixDashboard注解
- 所有服务提供者都需要监控依赖配置
- 启动微服务,启动监控,启动Eureka,启动服务提供者,成功访问以下地址出现该页面表示成功。
在9001的监控界面输入要监控的微服务(http://localhost:8001/hystrix.stream)
会看到以下监控内容
(1)Deplay 该参数用来控制服务器上轮询监控信息的延迟时间,默认是2000毫秒,可以通过配置该属性来降低客户端的网络和cpu消耗。
(2)Title该参数对应了头部标题Hystrix Stream之后的内容,默认会使用哦具体监控实例的URL,可疑通过配置该信息来展示更合适的标题。
实心圆:共有两种含义。它通过颜色的变化代表了实例的健康程度,它的健康程度从 绿色 > 黄色 > 橙色 > 红色 递减;
该实心圆除了颜色的变化之外,它的大小也会根据实例的请求流量发生变化,流量越大实心圆就越大,所以通过该实心圆的展示,就可以在大量实例中快速的发现故障实例和高压力实例。
<5> 说明