概述
服务降级→进而熔断→恢复调用链路(勉强能认为是降级的一种,但比降级要严重)
熔断机制是应对雪崩效应的一种微服务链路保护机制。当扇出链路的某个微服务出错不可用或者响应时间太长时,会进行服务的降级,进而熔断该节点微服务的调用,快速返回错误的响应信息。当检测到该节点微服务调用响应正常后,恢复调用链路。
开放,半开,关闭三种状态。
对cloud-provider-hystrix-payment8001进行改造
首先是service,添加一下内容:
@HystrixCommand(fallbackMethod = "paymentCircuitBreaker_fallback",commandProperties = {
@HystrixProperty(name="circuitBreaker.enabled",value="true"),//是否开启断路器
@HystrixProperty(name="circuitBreaker.requestVolumeThreshold",value="10"),//请求次数 @HystrixProperty(name="circuitBreaker.sleepWindowInMilliseconds",value="10000"),//时间范围 @HystrixProperty(name="circuitBreaker.errorThresholdPercentage",value="60"),//失败率达到多少后跳闸
})
public String paymentCircuitBreaker(@PathVariable("id") Integer id){
if(id<0){
throw new RuntimeException(("*********id 不能负数"));
}
String serialNumber = IdUtil.simpleUUID();
return Thread.currentThread().getName()+"t"+"调用成功,流水号为"+serialNumber;
}
public String paymentCircuitBreaker_fallback(@PathVariable("id") Integer id){
return "id不能为负数,请稍后再试"+id;
}
Controller添加以下内容:
//服务熔断
@GetMapping("/payment/circuit/{id}")
public String paymentCircuitBreaker(@PathVariable("id") Integer id){
String result = paymentService.paymentCircuitBreaker(id);
return result;
}
输入http://localhost:8001/payment/circuit/1, 显示正常:
hystrix-PaymentService-1 调用成功,流水号为d98451c4661c49d89b5b75701ae225d9
http://localhost:8001/payment/circuit/-2,调用降级方法:
id不能为负数,请稍后再试-2
疯狂刷新http://localhost:8001/payment/circuit/-2,再调用
http://localhost:8001/payment/circuit/1,会显示成
id不能为负数,请稍后再试1,过段时间才会显示成
hystrix-PaymentService-1 调用成功,流水号为cd336b2d44814bc79fa840c55e19e335
这是一个慢慢恢复的过程
总结:
熔断打开:在固定时间内(Hystrix默认是10秒),接口调用出错比率达到一个阈值(Hystrix默认为50%),会进入熔断开启状态。进入熔断状态后,后续对该服务接口的调用不再经过网络,直接执行本地的fallback方法。
熔断关闭:服务没有故障时,熔断器所处的状态,对调用方的调用不做任何限制。
半熔断状态:在进入熔断开启状态一段时间之后(Hystrix默认是5秒),熔断器会进入半熔断状态。部分请求根据规则调用当前服务,如果请求成功且符合规则则认为当前服务恢复正常,关闭熔断
涉及到断路器的三个重要参数:
1、circuitBreaker.sleepWindowInMilliseconds
断路器的快照时间窗,也叫做窗口期。可以理解为一个触发断路器的周期时间值,默认为10秒(10000)。
2、circuitBreaker.requestVolumeThreshold
断路器的窗口期内触发断路的请求阈值,默认为20。换句话说,假如某个窗口期内的请求总数都不到该配置值,那么断路器连发生的资格都没有。断路器在该窗口期内将不会被打开。
3、circuitBreaker.errorThresholdPercentage
断路器的窗口期内能够容忍的错误百分比阈值,默认为50(也就是说默认容忍50%的错误率)。打个比方,假如一个窗口期内,发生了100次服务请求,其中50次出现了错误。在这样的情况下,断路器将会被打开。在该窗口期结束之前,即使第51次请求没有发生异常,也将被执行fallback逻辑。
服务限流(等高级篇讲解alibaba的sentinel再说)
工作流程可以去github上看:
How it Works · Netflix/Hystrix Wiki · GitHub
The following sections will explain this flow in greater detail:
1 Construct a HystrixCommand or HystrixObservableCommand Object
2 Execute the Command
3 Is the Response Cached?
4 Is the Circuit Open?
5 Is the Thread Pool/Queue/Semaphore Full?
6 HystrixObservableCommand.construct() or HystrixCommand.run()
7 Calculate Circuit Health
8 Get the Fallback
9 Return the Successful Response
How To Use · Netflix/Hystrix Wiki · GitHub
工作流程图:
熔断和降级的区别(摘自网络)
故事的背景是这样的:由于小强在工作中碰到一些问题,于是想请教一下业界大牛小壮。于是发生了下面的两个场景:
小强在拿起常用手机拨号时发现该手机没有能够拨通,所以就拿出了备用手机拨通了某A的电话,这个过程就叫做降级(主逻辑失败采用备用逻辑的过程)。
由于每次小壮的解释都属于长篇大论,不太容易理解,所以小强每次找小壮沟通的时候都希望通过常用手机来完成,因为该手机有录音功能,这样自己可以慢慢消化。由于上一次的沟通是用备用电话完成的,小强又碰到了一些问题,于是他又尝试用常用电话拨打,这一次又没有能够拨通,所以他不得不又拿出备用手机给某A拨号,就这样连续的经过了几次在拨号设备选择上的“降级”,小强觉得短期内常用手机可能因为运营商问题无法正常拨通了,所以,再之后一段时间的交流中,小强就不再尝试用常用手机进行拨号,而是直接用备用手机进行拨号,这样的策略就是熔断(常用手机因短期内多次失败,而被暂时性的忽略,不再尝试使用)。
Hystrix图形化Dashboard构建
以报表和仪表盘形式呈现
构建模块cloud-consumer-hystrix-dashboard9001
Pom相比之前加入以下内容:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>
主启动类:
@SpringBootApplication
@EnableHystrixDashboard
public class HystrixDashboardMain9001 {
public static void main(String[] args) {
SpringApplication.run(HystrixDashboardMain9001.class,args);
}
}
要想图形化监控,务必记得加入
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
启动项目,输入:
http://localhost:9001/hystrix, 图形化页面出现后即代表成功
接着为了实现监控,修改8001
在主启动类加入:
//必须配,不然会报错
@Bean
public ServletRegistrationBean getServlet(){
HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet();
ServletRegistrationBean registrationBean = new ServletRegistrationBean(streamServlet);
registrationBean.setLoadOnStartup(1);
registrationBean.addUrlMappings("/hystrix.stream");
registrationBean.setName("HystrixMetricsStreamServlet");
return registrationBean;
}
启动项目,在图形化页面内输入:http://localhost:8001/hystrix.stream
Delay为2000,title为T3
点击monitor即可开启监控
以上为58-64集的内容
最后
以上就是温柔河马为你收集整理的尚硅谷SpringCloud2020简单学习记录(个人用)58-64集的全部内容,希望文章能够帮你解决尚硅谷SpringCloud2020简单学习记录(个人用)58-64集所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复