上一篇介绍了负载均衡的配置方法,做负载均衡是为了保证高可用性,但是有时候服务提供者挂掉了,比如服务A调用了服务B,服务B又调用了服务C,然后有一天服务C的所有节点都挂掉了,这时服务B就会因为C异常而在不停地等待,服务A又会因为服务B没响应在不断地等待,结果请求来得越来越多,使得整个系统雪崩式地出现异常。

为了防止这种情况的出现,我们需要给服务做一些保护的措施,当服务B调用服务C在一定时间内出现同样的异常,比如在5秒内出现了20次,那么后面服务B就不要再去调用服务C了,它已经出现问题了,你自己另找办法吧(比如执行另一个方法或者直接返回错误)。

Hystrix就是用来做熔断的,它类似于我们家庭电路的保险丝,当服务提供者出现异常导致无法调用,就会把消费者到提供者这条链路给断掉,不让客户端一直等待,保护整个系统。

断路器功能是在服务消费者上实现的,上一篇介绍了ribbon和feign两种消费服务方式,本篇也会在分别在这两种方式上实现。我们仍然在之前的项目添加断路器的功能。

一、在Ribbon中使用断路器

1.1、添加ribbon依赖

在service-consumer-ribbon的pom文件添加Hystrix的依赖

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>

1.2、开启断路器

在启动类添加@EnableHystrix注解

1.3、提供断路方法

修改RibbonConsumerService类如下

@Service
public class RibbonConsumerService {
@Autowired
private RestTemplate restTemplate; @HystrixCommand(fallbackMethod = "indexError")
public String index(String uid) {
return restTemplate.getForObject("http://SERVICE-PROVIDER/callServiceProvider?uid=" + uid, String.class);
} public String indexError(String uid) {
return uid + ",你好,服务提供者出错了,直接返回错误信息";
}
}

就是添加了一个当断路后调用的方法,然后在原来的index方法加上@HystrixCommand注解,意思就是先调用远程的http方法,如果失败就会去调用indexError方法,起到了断路的作用

1.4、测试

分别启动单节点注册中心、单节点服务消费者和ribbon消费者三个项目,访问http://localhost:8080/index?uid=ribbon,可以看到返回了

服务8770的消息:用户ribbon调用了此服务

然后把服务提供者停止,再次访问http://localhost:8080/index?uid=ribbon,可以看到返回的是

ribbon,你好,服务提供者出错了,直接返回错误信息

说明断路器起作用了

二、在Feign中使用断路器

2.1、启动断路器功能

Feign自带断路器的,但是在Greenwich版本中默认是关闭的,先在service-consumer-feign的application.properties中添加以下配置

feign.hystrix.enabled=true

2.2、提供断路方法

创建一个类FeignConsumerServiceImpl实现FeignConsumerService接口

@Component
public class FeignConsumerServiceImpl implements FeignConsumerService { @Override
public String index(String uid) {
return uid + ",你好,服务提供者出错了,直接返回错误信息";
}
}

然后在原来的接口的注解加上fallBack属性,值就是断路器类

@FeignClient(value = "service-provider", fallback = FeignConsumerServiceImpl.class)
public interface FeignConsumerService { @RequestMapping("/callServiceProvider")
String index(@RequestParam("uid") String uid);
}

2.3、测试

测试方法和ribbon的一样,就不再赘述了

三、Hystrix Dashboard

Hystrix断路器还提供了实时监控后台给我们使用——Hystrix Dashboard。

3.1、创建看板module

新建一个module,名称为hystrix-dashboard,添加Spring Web和Hystrix DashBoard依赖,如下:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>

启动类添加@EnableHystrixDashboard注解

3.2、修改服务消费者

我们先在ribbon消费者中添加Spring Boot Actuator依赖,如下

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

接着在application.properties中添加一下配置

management.endpoints.web.exposure.include=*

因为在Spring Boot 2.X Actuator暴露的端口只有info和health两个端点,我们先把所有的端点都开放

3.3、启动&测试

依次启动注册中心、服务提供者、服务消费者和Hystrix Dashboard,然后访问http://localhost:8888/hystrix,就可以看到Hystrix的界面了

在界面上我们可以看到断路器支持默认集群、指定集群和单应用,我们这里只演示单应用的用法。

在中间输入http://localhost:8080/actuator/hystrix.stream,然后点击Monitor Stream按钮,可以看到当前的调用情况

因为我们还没有调用任何的服务提供者,所以这里没有数据显示。连续访问http://localhost:8080/index?uid=ribbon后可以看到监控页面出现调用的数据

比如这里的数据是8次成功,0次超时、错误率0.0%,这里的数字说明对应着右上角不同颜色的提示说明,Circult的状态为Closed。我们把服务提供者停止,然后连续访问http://localhost:8080/index?uid=ribbon,当服务提供者出错率达到一定程度(默认是5秒出错20次),断路器就会熔断,Circult的状态变为Open

feign中的用法也是一样的,就不再重复。

四、总结

断路器相关的内容介绍到这里,下一篇介绍网关。

源码已经上传到github:https://github.com/spareyaya/spring-cloud-demo/tree/master/chapter4

最新文章

  1. VB.NET设置控件和窗体的显示级别
  2. IE6/IE7中li底部4px空隙的Bug
  3. WPF自定义控件与样式(12)-缩略图ThumbnailImage /gif动画图/图片列表
  4. SQL语句 - 数据操作
  5. json学习系列(4)-JSONString对象的optXXX方法的使用
  6. vim学习与理解
  7. HTML 页面载入 Flash 插件的几种方法
  8. java 获取系统变量(环境变量和环境变量)
  9. 使用WCF扩展记录服务调用时间
  10. 【2017-03-31】JS-DOM操作:操作属性、彩虹导航栏、定时器、操作内容、创建元素并添加、操作相关元素
  11. Excel图表-&quot;DNA&quot;图
  12. 自定义TextView跑马灯
  13. 201521123106 《Java程序设计》第14周学习总结
  14. Unity3D学习(七):Unity多重采样抗锯齿设置无效的解决办法
  15. 【Android Studio安装部署系列】十八、Android studio更换APP应用图标
  16. ORACLE的impdp和expdp命令
  17. 以前没有写笔记的习惯,现在慢慢的发现及时总结是多么的重要。 这一篇文章主要关于java多线程一些常见的疑惑点。因为讲解多线程的书籍和文章已经很多了,所以我也不好意思多说,嘻嘻嘻、大家可以去参考一些那些书籍。我这个文章主要关于实际的一些问题。同时也算是我以后复习的资料吧,。还请大家多多指教。 同时希望多结交一些技术上的朋友。谢谢。
  18. centos6 安装python3.5后pip无法使用的处理
  19. centos下添加epel源
  20. bootstrap switch样式修改与多列等间距布局

热门文章

  1. spring boot 与 Mybatis整合(*)
  2. No input file specified.问题的解决
  3. 取消本地SVN文件夹与服务器的关联
  4. 你管这破玩意叫CPU?
  5. 浅析DDD——领域驱动设计的理解
  6. Educational Codeforces Round 96 (Rated for Div. 2)
  7. Java中对象池的本质是什么?(实战分析版)
  8. Linux利用nc命令脚本批量检测服务器指定端口是否开放
  9. 064.Python开发虚拟环境
  10. Jmeter(四十八) - 从入门到精通高级篇 - Jmeter监控服务器性能(详解教程)