前言
在微服务架构中,每个单元单独部署,服务之间远程调用,实现信息交互,那么问题来了!
当A服务调用B服务时响应太慢或者由于因为网络故障造成延迟或调用失败会怎样?
大量请求到达,请求堆积,导致电耗用者线程挂起,从而引发调用者也无法响应发生故障,以此类推,可能会导致整个微服务系统瘫痪
为了解决这种问题,微服务架构中引入一种叫做熔断器的服务保护机制
SpringCloud Hystrix实现了熔断器,线程隔离等一系列服务保护机制,它具备服务降级,服务熔断,线程和信号隔离,请求缓存,请求合并以及服务监控等强大的功能
Hystrix服务熔断
1.添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
<version>1.2.5.RELEASE</version>
</dependency>
2.消费者服务引导类添加@EnableCircuitBreaker开启断路器
3.消费者服务方法添加注解设置回调方法
4.Hystrix默认超时时间是1000毫秒,响应超过此时间就会触发断路器,可通过配置默认时间
Hystrix服务降级
解释一下: 当服务熔断之后,提供的服务不会再被调用,由调用方自行设置回调代表服务返回
Hystrix异常处理
当调用方或者被调用方出现异常也会触发熔断,并且通过Throwable可获取异常参数信息
问题来了
如果我不想服务降级处理,而是想把异常直接抛给用户怎么办呢?
在@HystrixCommand中添加参数忽略异常,如下图
Hystrix自定义请求服务熔断
1.定义一个类继承HystrixCommand,如下图
2.消费者服务方法如下
3.测试(略)
Hystrix自定义请求同步与异步调用
Hystrix仪表盘监控
解释一下: 监控Hystrix的实时运行状态,看到Hystrix的各项指标信息,从而快速发现系统问题并解决
为其单独创建一个服务
1.创建工程,添加依赖
<!--仪表盘功能起步依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
<version>1.4.5.RELEASE</version>
</dependency>
2.引导类添加注解@EnableHystrixDashboard
3.添加配置文件,搭建完成后如下图
4.查看访问
5.在需要监控的服务添加依赖
<!--服务监控依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--hystrix熔断器起步依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
<version>1.4.4.RELEASE</version>
</dependency>
6.配置文件添加权限
#springboot的监控端点访问权限,*表示全部可以访问
management.endpoints.web.exposure.include=*
7.启动注册中心服务,消费者服务和仪表盘服务
先访问消费者服务下面任意接口(否则一直打印ping),再访问http://localhost:9002/actuator/hystrix.stream