Spring Cloud集成了Netflix开源的Hystrix组件,该组件实现了熔断器模型,能够让我们很方便地实现熔断器。
在实际项目中,一个请求经常会调用多个服务,如果较底层的服务出现故障,将会发生连锁反应,这对于一个大型项目是灾难性的。因此,为了避免连锁反应的发生,当特定的服务不可用达到阈值( Hystrix默认5秒20次)时,我们需要利用 Hystrix组件打开熔断器。
Hystrix提供了熔断、隔离、监控等功能,当一个或多个服务同时出现问题时,可以保证系统依然可用。
Spring Cloud Netflix Hystrix的使用
===============================
在本书搭建框架的时候,读者就已经接触到了Hystrix组件,对于Spring Cloud微服务工程来说,会默认开启熔断器。我们在应用程序入口类中都加入了@SpringCloudApplication 注解,该注解内部包含了@EnableCircuitBreaker注解,它的作用就是启用熔断器。因此,每个基于Spring Cloud的微服务工程都必须添加spring-cloud-starter-netflix-hystrix依赖。
下面我们就通过一个简单的例子感受一下Hystrix的魅力。
在test工程创建一个TestHystrixCommand类并编写以下代码:
public class TestHystrixCommand extends HystrixCommand{
public TestHystrixcommand (string groupKey)i
super(HystrixcommandGroupKey.Factory.asKey(groupKey));
}
@override
protected String run() {
//模拟HTTP请求成功return“请求成功!";
)
@override
protected String getFallback( {
return“服务器异常!“;
}
}
在上述代码中,我们自定义的TestHystrixCommand类继承了HystrixCommand类并实现了run和getFallback方法。其中 HystrixCommand就是Hystrix组件提供的用于调用服务( run)和处理异常( getFallback)的类。我们在run方法中直接返回了一个字符串,主要目的是模拟请求,在实际中,该方法体应该实现真正的HTTP网络请求,当服务调用超时或不可用时就会调用getFallback方法。
接下来编写控制器方法以调用HystrixCommand类,在TestController中增加以下代码:
@RequestMapping(“testHystrix”)
public string testHystrix ({
TestHystrixcommand hystrixCommand = new TestHystrixCommand(“test”);return hystrixCommand.execute();
)
我们提供了一个接口并实例化TestHystrixCommand类,通过 execute方法进行调用。当调用hystrix接口时,如果服务正常返回,则Hystrix 不做任何处理,一旦服务不可用,Hystrix就会开启熔断器,并进行异常处理,调用getFallback方法返回。
启动test工程,通过postman访问地址 http:/localhost:9999/testHystrix ,出现如图11-2所示的界面。
这说明此时服务正常返回。我们将run方法改成以下代码:
try {
//模拟HTTP请求超时Thread.sleep(10800);}catch (Exception e){
e.printStackTrace();}
return“请求成功!";
我们模拟了请求时间为10秒,再次访问上述地址,可以看到postman打印出了“服务器异常!”字样。说明,HystrixCommand在请求服务时已然超时,因而调用了getFallback方法。
Hystrix除了支持熔断,它还提供了监控功能,并提供了可视化的Web界面。在 common 工程加入以下依赖就可以访问其Web界面:
org.springframework.cloud
spring-cloud-starter-netflix-hystrix-dashboard
要访问Hystrix的仪表盘,还需要在应用的人口类Application中添加@EnableHystrixDashboard注解。分别启动register、config、test工程,可以看到控制台已映射了/hystrix地址,如图11-3所示。
图中的地址是Hystrix的仪表盘Web界面地址。在浏览器中输入地址localhost:9999/hystrix,就会看到如图11-4所示的界面。
该界面第一个文本框下有三排文字,我们得知,Hystrix Dashboard有3种监控模式。
-
默认集群监控:通过输人地址 http:turbine-hostname:port/turbine.stream开启。
-
自定义集群监控:通过输人地址 http:turbine-hostname:port/turbine.stream?cluster=[clusterName]对指定的集群名进行监控。
-
单体应用监控:通过输入地址 http://hystrix-app:port/hystrix.stream开启,可以对某个具体的服务进行监控。
该界面还有两个参数信息,具体如下。
-
Delay:控制服务器上轮询监控信息的延迟时间,默认为2000毫秒,可以通过配置该属性来降低客户端的网络和CPU消耗。
-
Title:没有任何功能,只是可以自定义仪表盘展示的标题信息。
在文本框中输入localhost:9999/hystrix.stream,正常情况下,按下 Enter键后会出现以下图11-5所示的界面。
因为在Spring Boot 2.0以后,Hystrix默认不会加载 hystrix.stream端点,需要通过编码形式添加hystrix.stream端点,代码如下:
@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;
}
通过配置一个Bean,该Bean返回ServletRegistrationBean对象,通过addurlMappings方法将hystrix.stream端点添加到URL映射中,并指定Servlet名。如果将上述代码换为读者更加熟悉的web.xml 的配置,读者应该会更加明白:
</ description>
HystrixMetricsStreamServletHystrixMetricsStreamServlet
com. netflix.hystrix.contrib.metrics.eventstream.HystrixMetricsStreamServlet</ servlet-class>
HystrixMetricsStreamServlet/hystrix.stream
</ servlet-mapping>
其实Spring Boot内部提供了HystrixMetricsStreamServlet类,该类的作用就是做Hystrix监控,因此需要定义该Servlet 的URL端点,而Spring Boot框架没有XML配置文件,因此需要通过编码的形式增加URL端点。
重启test工程,继续上述操作,并访问前面集成了熔断器的接口地址 localhost:9999/testHystrix,可以看到图11-6所示的界面。
我们多次调用上述接口,可以清晰地看到监控信息,TestHystrixCommand表示当前请求得接口信息,包括响应时间、请求次数等;Thread Pools表示当前请求线程池信息,包括队列总数、线程池大小等。
OpenFeign集成 Hystrix熔断器
======================
读者对Hystrix有了大致的了解,就可以将其运用到OpenFeign中,提升系统的稳定性。接下来,我们就来集成Hystrix。
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
写在最后
还有一份JAVA核心知识点整理(PDF):JVM,JAVA集合,JAVA多线程并发,JAVA基础,Spring原理,微服务,Netty与RPC,网络,日志,Zookeeper,Kafka,RabbitMQ,Hbase,MongoDB,Cassandra,设计模式,负载均衡,数据库,一致性哈希,JAVA算法,数据结构,加密算法,分布式缓存,Hadoop,Spark,Storm,YARN,机器学习,云计算…
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
,RabbitMQ,Hbase,MongoDB,Cassandra,设计模式,负载均衡,数据库,一致性哈希,JAVA算法,数据结构,加密算法,分布式缓存,Hadoop,Spark,Storm,YARN,机器学习,云计算…
[外链图片转存中…(img-WhDImmPe-1713419073869)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!