SpringCloud之Hystrix(服务熔断与降级)
讲Hystrix之前我们先来了解一下降级和熔断以及服务雪崩效应
一.降级
1.抛弃非核心业务,保障核心页面的正常运行
.
2.服务器忙
,请稍后再试
,不让客户端等待立刻返回一个友好的提示
,fallback
1>程序运行异常
2>调用超时
3>服务熔断出发服务降级
4>线程池
/信号量打满也会导致服务降级
二.熔断
1.类比保险丝超过最大功率后熔断一样, 服务器达到最大访问处理量之后,拒绝再接受服务,
被拒绝的请求直接调用服务降级方法,返回友好提示
1.正常服务访问
2.遭遇异常
/超时等意外情况,服务降级
3.多次请求处理无果进而熔断
4.熔断时间到,尝试恢复调用链路
三.服务雪崩效应原因
服务雪崩
1.多个服务之间调用的时候,假设微服务A调用微服务B和微服务C,微服务B和微服务C又调用了其他微服务,这就是所谓的“扇出”
2.如果扇出的链路上某个微服务的调用响应时间过长或者不可用,对微服务A的调用就会占用越来越多的系统资源,
进而引起系统的崩溃, 所谓的“雪崩效应”
四.Hystrix简介
Hystrix是一个用于处理分布式系统的延时和容错的开源库,在分布式系里,许多依赖不可避免的会调用失败,比如超时,异常等,Hystrix能够保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性
五.实现原理
1:正常请求时,正常处理
2:在一个时间窗内(默认
10s),请求处理异常超过一定比例(默认
50%),执行熔断
3:再有请求调用的时候,将不会调用主逻辑,而是直接调用降级fallback,通过断路器,实现自动的发现错误,
并将主逻辑切换为降级逻辑,减少响应延迟的效果
4:原来的主逻辑如何恢复(hystrix 会自动恢复)
1.代码
@HystrixCommand(fallbackMethod
= "saveFallback")
@GetMapping("/save/{userId}/{productId}")
public Order
save(@PathVariable Long userId
, @PathVariable Long productId
) {
log
.info("OrderController-save.....");
return new Order();
}
public Order
saveFallback(@PathVariable Long userId
, @PathVariable Long productId
) {
System
.out
.println("降级处理");
return new Order();
}
启动类
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
@EnableCircuitBreaker
public class OrderMain8090 {
public static void main(String
[] args
) {
SpringApplication
.run(OrderMain8090
.class, args
);
}
}
2.application.yml
server:
port: 8100
spring:
application:
name: hystrix
-dashboard8100
eureka:
client:
registerWithEureka: true
fetchRegistry: true
serviceUrl:
defaultZone: http
://localhost
:8761/eureka/
3.依赖
<dependency>
<groupId>org.springframework.cloud
</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix
</artifactId>
</dependency>
六.Hystrix之断路器Dashboard监控仪表盘
1.Dashboard监控仪表盘是什么?
除了隔离依赖服务调用以为,Hystrix还提供了准实时的调用监控(Hystrix DashBoard) Hystrix会持续的几率所有通过Hystrix发起的请求的执行信息,并以统计报表和图形的形式展示给用户,包括每秒执行多少请求,多少是成功的,多少是失败的等, Netflix通过Hystrix-metrics-event-stream项目实现对上面指标的监控。SpringCloud也提供了Hystrix Dashboard的整合,对监控内容转化成可视化界面
2.启动时的页面
3.监控单服务的页面:
4.代码
@SpringBootApplication
@EnableHystrixDashboard
public class DashBoard8100 {
@Bean
public ServletRegistrationBean
servletRegistrationBean(){
HystrixMetricsStreamServlet streamServlet
= new HystrixMetricsStreamServlet();
ServletRegistrationBean registrationBean
= new ServletRegistrationBean(streamServlet
);
registrationBean
.setLoadOnStartup(1);
registrationBean
.addUrlMappings("/hystrix.stream");
registrationBean
.setName("HystrixMetricsStreamServlet");
return registrationBean
;
}
public static void main(String
[] args
) {
SpringApplication
.run(DashBoard8100
.class, args
);
}
}
5.application.yml
server:
port: 8090
spring:
application:
name: order
-server
eureka:
client:
registerWithEureka: true
fetchRegistry: true
serviceUrl:
defaultZone: http
://localhost
:8761/eureka/
instance:
lease-renewal-interval-in-seconds: 1
lease-expiration-duration-in-seconds: 2
management:
endpoints:
web:
exposure:
include: ["health","info","hystrix.stream"]
6.依赖
<dependency>
<groupId>org.springframework.cloud
</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client
</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot
</groupId>
<artifactId>spring-boot-starter-web
</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud
</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix-dashboard
</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot
</groupId>
<artifactId>spring-boot-starter-actuator
</artifactId>
</dependency>
七.小结
1.Hystrix提供了熔断、隔离、Fallback、cache、监控等功能
2.使用Hystrix走降级操作时
,记得降级方法的参数类型
,参数个数
,参数顺序都要与贴了fallbackMethod注解的方法中的参数列表相同
3.Hystrix仪表盘可以用来实时监控
[Hystrix
]其他服务的各项指标信息的
4.使用Hystrix仪表盘需要注意yml中配置监控配置
,Hystrix中的依赖
(dashboard
)与需要监控服务中的依赖
(actuator
)不同
5.并且使用Hystrix仪表盘时需要在启动类中的配置这个registrationBean bean