断路器:Hystrix客户端
Netflix的创造了一个调用的库Hystrix实现了断路器图案。在微服务架构中,通常有多层服务调用。
断路器就比如家里面的保险丝,一但出现故障,就自动断开,避免造成火灾啥的。
微服务图
较低级别的服务中的服务故障可能导致用户级联故障。当对特定服务的呼叫达到一定阈值时(Hystrix中的默认值为5秒内的20次故障),电路打开,不进行通话。在错误和开路的情况下,开发人员可以提供后备。
Hystrix回退防止级联故障
开放式电路会停止级联故障,并允许不必要的或失败的服务时间来愈合。回退可以是另一个Hystrix保护的调用,静态数据或一个正常的空值。回退可能被链接,所以第一个回退使得一些其他业务电话又回到静态数据。
实战
目录结构
pom
<dependencies> |
启动类
在启动类上加上@EnableHystrix或者@EnableCircuitBreaker开启熔断
//开启熔断器
public class HystrixApplication {
public static void main(String[] args) {
SpringApplication.run(HystrixApplication.class, args);
}
}
服务类
重要的是要记住,HystrixCommand和fallback应该放在同一个类中,并且具有相同的方法参数。
//全局的降级操作,fallback的方法不能有参数
"failback") (defaultFallback =
public class HystrixService {
//回调函数的参数和原的一致
"failHystrix") (fallbackMethod =
public String getHystrix(String name){
return name + ": is ok";
}
public String failHystrix(String name){
return name + ": is fail";
}
public String failback(){
return ": is fail";
}
}
调用入口
|
熔断测试
正常调用
将service方法加入异常在次调用
//全局的降级操作,fallback的方法不能有参数
"failback") (defaultFallback =
public class HystrixService {
//回调函数的参数和原的一致
"failHystrix") (fallbackMethod =
public String getHystrix(String name){
int i = 1/0;
return name + ": is ok";
}
public String failHystrix(String name){
return name + ": is fail";
}
public String failback(){
return ": is fail";
}
}
已经走了降级返回的静态返回值。
全局测试:
全局是 不写fallbackMethod,会在@DefaultProperties的defaultFallback找对应的降级方法。
全局的回退方法不应该有任何参数,除了额外的参数以获得执行异常,不应抛出任何异常。下面按优先顺序降序列出的回退:
命令回退使用fallbackMethod属性定义@HystrixCommand
使用defaultFallback属性定义的命令默认回退@HystrixCommand
使用defaultFallback属性定义的类默认回退@DefaultProperties
//全局的降级操作,fallback的方法不能有参数
"failback") (defaultFallback =
public class HystrixService {
//回调函数的参数和原的一致
//@HystrixCommand
public String getHystrix(String name){
int i = 1/0;
return name + ": is ok";
}
public String failHystrix(String name){
return name + ": is fail";
}
public String failback(){
return ": is fail";
}
}
调用结果:
如果将回调方法加入@HystrixCommand,则回退方法也可以作为单独的Hystrix命令运行"failHystrix") (fallbackMethod =
public String getHystrix(String name){
int i = 1 / 0;
return name + ": is ok";
}
public String failHystrix(String name){
return name + ": is fail";
}
Hystrix 参数详解
hystrix.command.default和hystrix.threadpool.default中的default为默认CommandKey |
例如:"/getOrderPageList", method = RequestMethod.POST) (value =
(
fallbackMethod = "getOrderPageListFallback",
threadPoolProperties = { //10个核心线程池,超过20个的队列外的请求被拒绝; 当一切都是正常的时候,线程池一般仅会有1到2个线程激活来提供服务
"coreSize", value = "10"), (name =
"maxQueueSize", value = "100"), (name =
"queueSizeRejectionThreshold", value = "20")}, (name =
commandProperties = {
"execution.isolation.thread.timeoutInMilliseconds", value = "10000"), //命令执行超时时间 (name =
"circuitBreaker.requestVolumeThreshold", value = "2"), //若干10s一个窗口内失败三次, 则达到触发熔断的最少请求量 (name =
"circuitBreaker.sleepWindowInMilliseconds", value = "30000") //断路30s后尝试执行, 默认为5s (name =
})
public String getDemo(String name){
//do ..
return "this is ok";
}
public String fallBack(String name){
System.out.println("执行降级策略");
return "this is fail";
}
Hystrix的监控
Hystrix的主要优点之一是它收集关于每个HystrixCommand的一套指标。Hystrix仪表板以有效的方式显示每个断路器的运行状况。
依赖文件
<dependency> |
启动类
加入@EnableHystrixDashboard注解
public class HystrixApplication {
public static void main(String[] args) {
SpringApplication.run(HystrixApplication.class, args);
}
}
启动项目
上面截图是HystrixBoard的监控首页,该页面并没有什么监控信息。从1,2,3标号中可以知道HystrixBoard提供了三种不同的监控方式。
默认的集群方式:通过URL http://turbine-hostname:port/turbine.stream开启,实现对默认集群的监控。
指定的集群监控,通过URL http://turbine-hostname:port/turbine.stream?cluster=[clusterName]开启对clusterName的集群监控。
单体应用的监控,通过URL http://hystrix-app:port/hystrix.stream开启,实现对具体某个服务实例的监控。
Delay:改参数用来控制服务器上轮训监控信息的延迟时间,默认为2000毫秒,可以通过配置该属性来降低客户端的网络和CPU消耗。
Title:该参数对应了上图头补标题Hystrix Stream之后的内容,默认会使用具体监控实例的URL,可以通过该信息来展示更合适的标题。
输入 localhost:port/hystrix
输入熔断器所在的应用的host:ip/hystrix.stream 可以进入到监控页面,没有请求都是loading
发起一次请求hystrix
仪表盘显示了请求的监控,一个单应用的熔断监控就完成了。
下面是访问的时候的截图
Turbine
从个人实例看,Hystrix数据在系统整体健康方面不是非常有用。Turbine是将所有相关/hystrix.stream端点聚合到Hystrix仪表板中使用的/turbine.stream的应用程序。个人实例位于Eureka。运行Turbine就像使用@EnableTurbine注释(例如使用spring-cloud-starter-turbine设置类路径)注释主类一样简单。
public class TurbineApp {
public static void main(String[] args) {
SpringApplication.run(TurbineApp.class, args);
}
}
spring.application.name=hystrix-dashboard-turbine
server.port=8001
turbine.appConfig=node01,node02 #配置eureka的 哪些服务 表示监控eureka的哪些服务
turbine.aggregator.clusterConfig= default #聚合哪些集群 默认为default。可使用http://.../turbine.stream?cluster={clusterConfig之一}访问
turbine.clusterNameExpression= new String("default")
eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/
启动查看
访问 http://localhost:8001/turbine.stream
并且会不断刷新以获取实时的监控数据,说明和单个的监控类似,返回监控项目的信息。进行图形化监控查看,输入:http://localhost:8001/hystrix,输入: http://localhost:8001/turbine.stream,然后点击 Monitor Stream ,可以看到出现了俩个监控列表