(此次创建的Demo小案例都是基于springBoot【2.0.0.M3】,springCloud【Finchley.M2】创建的,读者若是为了演示正常,请务必保持版本一致)
我们知道服务降级也是对网站访问的一种保护,对于用户而言也是一种友好的体验,所以服务的降级保护对于我们来说显得尤为重要,下面我们通过一个简单的demo进行演示
1)创建项目,创建过程就省略了,可以参见项目【SpringCloud 之 异步消息 RabbitMQ的集成以及简单实用】,这次我们我们就是用上次演示的案例,在此基础上进行修改拓展
2)pom文件中引入相关依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
3)启动类添加注解
@SpringBootApplication
@EnableDiscoveryClient
@EnableCircuitBreaker
其实这里我们呢可以用一个注解代替,那就是【@SpringCloudApplication】,我们点击查看这个注解,发现这一个注解已近包含了上面的三个注解,所以我们这里可以直接使用【@SpringCloudApplication】这一个注解
4)新建一个我们测试的方法
@RestController
public class HystrixController {
@HystrixCommand(fallbackMethod = "fallback")
@GetMapping("/getProductInfoList")
public String getProductInfoList(){
//方便演示,这里直接使用RestTemplate的方式
RestTemplate restTemplate=new RestTemplate();
String result = restTemplate.postForObject("http://localhost:8080/product/listForOrder",
Arrays.asList("157875227953464068"), String.class);
return result;
}
//降级之后具体处理的业务方法
public String fallback(){
return "请求太热情,请稍后再试";
}
}
可以看到上面我们请求了 http://localhost:8080/product/listForOrder 这个远程的服务,在这个服务需要自己提前准备好。
我们一次启动项目,启动我们的product服务和我们的order服务
5)访问,当我们启动成功之后,访问我们新建的服务 http://localhost:8090/getProductInfoList 是可以访问到的
当我们停止掉远程服务product之后再次访问直接走我们的降级业务方法
我们还可以使用默认配置的方式
@RestController
@DefaultProperties(defaultFallback = "defaultFallback")
public class HystrixController {
@HystrixCommand
@GetMapping("/getProductInfoList")
public String getProductInfoList(){
RestTemplate restTemplate=new RestTemplate();
String result = restTemplate.postForObject("http://localhost:8080/product/listForOrder",
Arrays.asList("157875227953464068"), String.class);
return result;
}
//降级的业务方法
public String defaultFallback(){
return "默认请求方式:请求太热情,请稍后再试";
}
}
6)服务的超时如何设置?
@HystrixCommand(commandProperties = {
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "3000")
})
这样配置之后只要在三秒内服务都会等待请求,三秒之后就会走服务降级的方法
7)上面说完服务的讲降级,那么如何配置服务的熔断呢?
circuitBreaker,也叫做断路器,是Hystrix熔断机制采用的原理,下面是断路器的机理图,可以看到一共会有三种状态:
【closed】,【open】,【Half open】
简单说明一下断路器原理:
当断路器确定是否需要打开统计一些请求和错误数据的时候,是有一个时间范围的,这个时间范围就是时间窗口,当断路器打开(Open状态)对主逻辑进行熔断之后,Hystrix会启动一个休眠时间窗,在这个时间窗内,降级逻辑成为临时的主逻辑,当休眠时窗到期,断路器将进入半开状态(Half Open),释放一次请求到原来点额主逻辑上,如果此次请求正常返回,那么断路器将闭合(Closed),主逻辑恢复;如果此次请求依然有问题,断路器依然进行打开状态(Open);休眠时间窗重新计时
那么如何配置呢?详见如下:
@HystrixCommand(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"), //错误率
})
结合上面原理详细说明一下配置参数含义:
开启熔断机制:
@HystrixProperty(name = "circuitBreaker.enabled", value = "true"), //设置熔断
当断路器确定开启并开始统计一些请求和错误数据的时候,会开启一个时间窗,
@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "10000"), //休眠时间窗
我们设置了10秒。然后配置的如下参数,
@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "10"), //请求数达到后才计算
@HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "60"), //错误率
在这10秒时间范围内,当请求数量达到十个及以上,并且这十个请求中有百分之60以上(也就是说10个请求由7个是错误的)的错误率时候,我们的降级逻辑会变为临时的主逻辑,当休眠时窗到期,断路器将进入半开状态(Half Open),释放一次请求到原来点额主逻辑上,如果此次请求正常返回,那么断路器将闭合(Closed),主逻辑恢复;如果此次请求依然有问题,断路器依然进行打开状态(Open);休眠时间窗重新计时
8)如何使用Hystrix的Dashboard ? Dashboard主要是我们可以通过界面对 服务的熔断降级的请求进行直观的分析和查看
,如何使用呢?
首先我们需要引入相关依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>
然后启动添加注解【@EnableHystrixDashboard】
最后配置文件在原有的基础上配置
management:
context-path: /
启动项目我们访问 http://localhost:8090/hystrix 可以看到如图界面
修改好我们的项目访问路径点击【Monitor Stream】
下面我们用postman模拟连续发出500个请求,看一下界面侦查请求的效果:
postman连续发送500个请求准备就绪
点击发送我们看一下 Dashboard的界面效果: