当前位置:首页 > 技术分析 > 正文内容

springcloud实战:服务间通信OpenFeign熔断

ruisui883个月前 (02-03)技术分析19

Spring Cloud OpenFeign熔断

前面讲述了服务之间的相互通信,通过注解的形式,OpenFeign 的声明式HTTP客户端很容易做到不同服务之间的相互调用。

我们的服务最终会部署在服务器上,由于各种原因,服务难免会发生故障,这时其他服务将无法调用故障服务,可能会一直卡在那里,导致用户体验差。针对这个问题,我们需要对服务接口进行错误处理,一旦发现无法访问,立即返回并报错,即捕捉到异常后立刻以可读化的字符串的形式返回到前端。

基于以上问题,业界提出了熔断器模型。在Spring Cloud 中,我们可以采用SpringCloud NetflixHystrix实现熔断器。在OpenFeign集成熔断器之前,我们应对Hystrix有一定了解,因此本节先介绍Hystrix,并将其集成到OpenFeign 中。

Spring Cloud Netflix Hystrix简介

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 的配置,读者应该会更加明白:



HystrixMetricsStreamServletHystrixMetricsStreamServlet
com. netflix.hystrix.contrib.metrics.eventstream.HystrixMetricsStreamServlet


HystrixMetricsStreamServlet/hystrix.stream

其实Spring Boot内部提供了
HystrixMetricsStreamServlet类,该类的作用就是做Hystrix监控,因此需要定义该Servlet 的URL端点,而Spring Boot框架没有XML配置文件,因此需要通过编码的形式增加URL端点。

重启test工程,继续上述操作,并访问前面集成了熔断器的接口地址
localhost:9999/testHystrix,可以看到图11-6所示的界面。

我们多次调用上述接口,可以清晰地看到监控信息,TestHystrixCommand表示当前请求得接口信息,包括响应时间、请求次数等;Thread Pools表示当前请求线程池信息,包括队列总数、线程池大小等。

OpenFeign集成 Hystrix熔断器

读者对Hystrix有了大致的了解,就可以将其运用到OpenFeign中,提升系统的稳定性。接下来,我们就来集成Hystrix。

(1)11.3节的代码中的OpenFeign 默认自带熔断器,但它在Spring Cloud中是默认关闭的,我们可以在配置文件中开启它(可以写到公共的eurekaclient.yml 中 ):

#开启熔断器
feign:
hystrix:
enabled: true

(2)新建TestserviceErrorFeign类并实现TestServiceFeign接口:

@Component
public class TestServiceErrorFeign implements TestServiceFeign {
@Override
public String test() {
return“服务器异常!";
}
}

由于OpenFeign是定义的接口,上述代码其实就是创建一个类并实现该接口对应的方法,这段代码的含义就是当服务无法正常调用或调用超时,打印“服务器异常!”字符串。

(3)在TestserviceFeign 的注解中指定fallback,如:

@Feignclient(value = "test",fallback = TestServiceErrorFeign.class,configuration =
MyFeignConfiguration.class)

只实现openFeign还不够,还需要通过fallback指定具体的实现类。

(4)测试熔断器。

停止 test工程,继续11.2节中的测试,可以看到浏览器打印出了“服务器异常!”字符串。

小结

本节介绍了Spring Cloud Netflix Ribbon和Spring Cloud OpenFeign,通过两者的对比,推荐读者使用OpenFeign,此组件也是在微服务应用中运用最广泛的组件之一。通过OpenFeign,我们可以轻松实现服务间的通信,极大地降低系统的耦合性。通过OpenFeign的负载均衡,提升系统间调用的稳定性和并发数,利用其集成的熔断器,使应用的稳定性进一步提升。

本文给大家讲解的内容是springcloud实战:服务间通信,OpenFeign熔断

  1. 下篇文章给大家讲解的是springcloud实战:服务链路追踪Sleuth;
  2. 觉得文章不错的朋友可以转发此文关注小编;
  3. 感谢大家的支持

扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/1203.html

标签: feign 使用
分享给朋友:

“springcloud实战:服务间通信OpenFeign熔断” 的相关文章

Git 分支管理策略与工作流程

(预警:因为详细,所以行文有些长,新手边看边操作效果出乎你的预料)团队开发中,遵循一个合理、清晰的Git使用流程,是非常重要的。否则,每个人都提交一堆杂乱无章的commit,项目很快就会变得难以协调和维护。看完这篇文章后,涉及GIT的工作中就会减少因为规范问题导致工作出错,当然如果你现在暂时还未有合...

摄影后期必看 | PS插件camera raw 16.4教程 | 范围蒙版

范围蒙版Camera Raw 【蒙版】模块中提供了三个范围蒙版工具,可以通过特定的范围来创建蒙版。此次新增的【范围蒙版】大大加强了acr插件对局部调整的能力。点击下拉小箭头可以看到【颜色范围】,可用于快速选择想要编辑的颜色。快捷键:Shift + C【明亮度范围】,可用于快速选择想要调整的明亮度。快...

前端路由简介以及vue-router实现原理

作者:muwoo 来源:https://zhuanlan.zhihu.com/p/37730038后端路由简介路由这个概念最先是后端出现的。在以前用模板引擎开发页面时,经常会看到这样http://www.xxx.com/login 大致流程可以看成这样:浏览器发出请求服务器监听到80 端口(或443...

基于 vue3.0 小程序拖拽定制

今天给大家分享一个使用Vue3编写的自由DIY小程序页面。mbDIY 一款基于vue3.x构建的可拖拽定制小程序模板。支持新建页面、自由拖拽模块、复制/移动、自定义模块样式等功能。整个项目分为页面、模块、控件三大部分。模块里面的组件可拖拽至主面板区,编辑后保存即可预览效果。快速安装# 克隆项目 gi...

thinkphp8+vue3微信小程序商城,发布公众号App+SAAS+多商户

项目介绍三勾小程序商城基于thinkphp8+vue3+element-ui+uniapp打造的面向开发的小程序商城,方便二次开发或直接使用,可发布到多端,包括微信小程序、微信公众号、QQ小程序、支付宝小程序、字节跳动小程序、百度小程序、android端、ios端。支持主题色+自定义头部导航+自定义...

three.js cannon.js物理引擎之齿轮动画

今天继续说一说cannon.js物理引擎,并用之前已经学习过的知识实现一个小动画,知识点包括ConvexPolyhedron多边形、Shape几何体、Body刚体、HingeConstraint铰链约束等等知识。因为我之前用纯three.js 的THREEBSP实现过一个静态的齿轮,现在就想配合ca...