Hystrix是什么?

Hystrix是一个断路器,主要作用是服务熔断。

我举个例子,比如我想访问服务A,但是服务A依赖服务B,服务B依赖服务C...这种多个服务之间依赖调用称为扇出(就像一把折扇缓缓打开一样)

倘若某个服务反应的时间很长,或者服务不可用了,那么对服务A的调用会占用系统越来越多的资源,直至系统崩溃。

这就是所谓的,当发生雪崩时,没有一片雪花是无辜的。

我们当然不能允许这种情况的发生,当某个服务出现问题的时候,我必须进行服务熔断,这个时候我们的断路器Hystrix诞生了。

Hystrix服务熔断

新建Hystrix项目

我们现在的provider项目有三个,分别是8001,8002,8003.我们当然可以在provider已有的项目上直接加上hystrix功能,但是我还是想做一个对比,所以我们新建一个项目吧,就叫provider-hystrix-8001,对比一下

新建项目过程不多叙述,然后把provider-8001的内容,Java代码,yml,pom文件复制过来即可。稍微修改一点

修改yml

复制过来的yml,我们只需要修改instance-id,就是自定义的那个status的名称,我们改成

  1. instance-id: provider-hystrix-8001 #这个是修改Eureka界面的Status名称

Maven的pom.xml添加hystrix引用

在provider-hystrix-8001项目的pom文件中,加入hystrix的引用

  1. <dependency>
  2. <groupId>org.springframework.cloud</groupId>
  3. <artifactId>spring-cloud-starter-hystrix</artifactId>
  4. <version>1.4.6.RELEASE</version>
  5. </dependency>

修改Controller

修改一个Controller的代码

  1. package com.atguigu.springcloud.controller;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.web.bind.annotation.PathVariable;
  4. import org.springframework.web.bind.annotation.RequestMapping;
  5. import org.springframework.web.bind.annotation.RequestMethod;
  6. import org.springframework.web.bind.annotation.RestController;
  7. import com.atguigu.springcloud.entities.Dept;
  8. import com.atguigu.springcloud.service.DeptService;
  9. import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
  10. @RestController
  11. public class DeptController
  12. {
  13. @Autowired
  14. private DeptService service = null;
  15. @RequestMapping(value = "/dept/get/{id}", method = RequestMethod.GET)
  16. //一旦调用服务方法失败并抛出了错误信息后,会自动调用@HystrixCommand标注好的fallbackMethod调用类中的指定方法
  17. @HystrixCommand(fallbackMethod = "processHystrix_Get")
  18. public Dept get(@PathVariable("id") Long id)
  19. {
  20. Dept dept = this.service.get(id);
  21. if (null == dept) {
  22. throw new RuntimeException("该ID:" + id + "没有没有对应的信息");
  23. }
  24. return dept;
  25. }
  26. public Dept processHystrix_Get(@PathVariable("id") Long id)
  27. {
  28. return new Dept().setDeptno(id).setDname("该ID:" + id + "没有没有对应的信息,null--@HystrixCommand")
  29. .setDb_source("no this database in MySQL");
  30. }
  31. }

这里的Controller代码删了其他的,只保留了一个get方法,加了一个@HystrixCommand(fallbackMethod = "processHystrix_Get")注解,意思在在抛出异常的时候会去找processHystrix_Get这个方法解决,运行eureka集群,运行Hystrix提供者,测试一下

我们胡乱输入数字,在没有数据的情况下,果然去找了Hystrix断路器指定的方法,这样很快就返回了一个数据,起码不会报错,异常,或者加载很久没答案。

Hystrix服务降级

所谓的服务降级,就是为了保证一个访问量很高的服务的正常运行,暂时让一些不重要的服务暂停。而暂停的服务在有用户访问的时候要给出提示,这样用户就不会一直去访问已经暂停的服务,也就不会有大的服务器压力了。

说一个我们上面写的服务熔断的代码,如下图,很明显,我们写了一个get方法就加了一个Hystrix的注解,那我写了100个方法,加100次注解?这很麻烦,所以我们要使用Spring的AOP面向切面编程,解决这个问题

注意:服务降级是客户端的事,和服务端没什么关系

修改api项目

在api项目下新建一个service包,然后建一个接口,如下:

  1. package com.atguigu.springcloud.service;
  2. import java.util.List;
  3. import org.springframework.cloud.netflix.feign.FeignClient;
  4. import org.springframework.web.bind.annotation.PathVariable;
  5. import org.springframework.web.bind.annotation.RequestMapping;
  6. import org.springframework.web.bind.annotation.RequestMethod;
  7. import com.atguigu.springcloud.entities.Dept;
  8. /**
  9. *
  10. * @Description: api工程,根据已经有的DeptClientService接口
  11. 新建
  12. 一个实现了FallbackFactory接口的类DeptClientServiceFallbackFactory
  13. */
  14. //@FeignClient(value = "MICROSERVICECLOUD-DEPT")
  15. @FeignClient(value = "MICROSERVICECLOUD-DEPT",fallbackFactory=DeptClientServiceFallbackFactory.class)
  16. public interface DeptClientService
  17. {
  18. @RequestMapping(value = "/dept/get/{id}", method = RequestMethod.GET)
  19. public Dept get(@PathVariable("id") long id);
  20. @RequestMapping(value = "/dept/list", method = RequestMethod.GET)
  21. public List<Dept> list();
  22. @RequestMapping(value = "/dept/add", method = RequestMethod.POST)
  23. public boolean add(Dept dept);
  24. }

再新建一个类,用于服务降级的提示

  1. package com.atguigu.springcloud.service;
  2. import java.util.List;
  3. import org.springframework.stereotype.Component;
  4. import com.atguigu.springcloud.entities.Dept;
  5. import feign.hystrix.FallbackFactory;
  6. @Component
  7. public class DeptClientServiceFallbackFactory implements FallbackFactory<DeptClientService>
  8. {
  9. @Override
  10. public DeptClientService create(Throwable throwable)
  11. {
  12. return new DeptClientService() {
  13. @Override
  14. public Dept get(long id)
  15. {
  16. return new Dept().setDeptno(id).setDname("该ID:" + id + "没有没有对应的信息,Consumer客户端提供的降级信息,此刻服务Provider已经关闭")
  17. .setDb_source("no this database in MySQL");
  18. }
  19. @Override
  20. public List<Dept> list()
  21. {
  22. return null;
  23. }
  24. @Override
  25. public boolean add(Dept dept)
  26. {
  27. return false;
  28. }
  29. };
  30. }
  31. }

修改客户端的yml文件

服务降级是客户端的事,所以找到consumer-feign-80子项目,修改yml文件,添加如下内容:

  1. feign:
  2. hystrix:
  3. enabled: true

测试服务降级

启动eureka集群,启动provider随意一个服务都行,启动consumer-feign-80,然后在客户端我们输入已有的数据的时候是正常的

现在,我把provider服务关闭,只剩下eureka和consumer,再访问试试

我访问的地址没变,很明显,我的服务降级之后是有提示的,这样客户端就知道服务降级,目前这个服务暂时关闭了,就不会去一直刷新服务,也不会去投诉了。对服务器的压力也小了。

Hystrix Dashboard

Hystrix Dashboard各种配置

Hystrix Dashboard是一个监控系统,能反映出我们的微服务调用的次数

我们新建一个项目,用来对微服务进行监控,项目名就叫:

consumer-hystrix-dashboard-9001

监控项目的yml文件,指定个端口号就行

  1. server:
  2. port: 9001

项目的主方法,要加上@EnableHystrixDashboard注解

最后是Maven的pom文件,我们需要引入的相关的内容如下:

  1. <dependency>
  2. <groupId>org.springframework.cloud</groupId>
  3. <artifactId>spring-cloud-starter-hystrix</artifactId>
  4. </dependency>
  5. <dependency>
  6. <groupId>org.springframework.cloud</groupId>
  7. <artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
  8. </dependency>

Hystrix Dashboard测试安装是否成功

现在可以直接运行这个监控项目,看看有没有成功的安装,运行浏览器输入

http://localhost:9001/hystrix 你会发现出来一个头戴刺帽儿的白熊logo,这就表明了,我们安装是成功了的

Hystrix Dashboard使用

安装成功了,接下来使用Hystrix Dashboard来监控我们的服务

想要监控其他的项目,其他的项目必须有下面的引用,这个就是监控所需要的

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-actuator</artifactId>
  4. </dependency>

我们启动eureka集群,启动provider-dept-hystrix-8001,启动consumer-hystrix-dashboard

访问Hystrix服务提供者

Single Hystrix App: http://hystrix-app:port/hystrix.stream

这句话说的很清楚,访问有Hystrix的服务,后面加上/hystrix.stream 就可以看到信息

我们在浏览器输入:http://localhost:8001/hystrix.stream

你会发现出来的是ping的空白,如下图:

这是正常的,毕竟还没有人访问你的微服务啊,没访问哪来的信息,我们在浏览器输入http://localhost:8001/dept/get/1,我们自己去调用一下,然后再看http://localhost:8001/hystrix.stream这个信息流的监控页面,可以发现

有了,但是看不懂啊,没关系,Hystrix Dashboard的真正用法是在这个页面的,我们回到监控的项目http://localhost:9001/hystrix,然后输入我们的服务的地址,再起个名称就可以了,如图:

把刚才数据流的地址复制过来,再起个标题,2秒刷新一次,点击确定,如图:

这不就成了,这个咋看,首先记住口诀:7色1圈1线。

7色1圈1线

这个是看Hystrix Dashboard的口诀,记住了再看,解释一下

首先7色如下图,代表的是服务的访问程度

7色就是这7个颜色的小点,每种颜色右边有对应的单词解释,反正越后面越糟糕

再看看1圈是什么

这就是一圈,一个小圆圈,这个圆圈啊反应着服务的使用程度,流量大小,这个圈可以变大,变色的,越大说明服务的访问流量越大,越变色说明服务的压力越大,颜色如下:

绿色<黄色<橙色<红色

绿色就ok,红色了你就赶紧想办法解决吧,服务熔断也行。

最后一个1线,就是这条线

这个代表着服务在最近时间段调用的次数,你可能会问,为啥是一条直线?因为你没访问服务啊

SpringCloud笔记六:Hystrix的更多相关文章

  1. SpringCloud中使用Hystrix

    1.  引言 一般而言,一个服务都是部署了多台机器的,那么在这种情况下,当其中一个服务挂了以后Hystrix是怎么处理的呢? 为了验证这个问题,我们准备两个服务:user-api 和 app-gate ...

  2. 《MFC游戏开发》笔记六 图像双缓冲技术:实现一个流畅的动画

    本系列文章由七十一雾央编写,转载请注明出处.  http://blog.csdn.net/u011371356/article/details/9334121 作者:七十一雾央 新浪微博:http:/ ...

  3. java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)

    java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...

  4. SpringCloud学习之Hystrix

    一.为什么要有断路器 在分布式系统当中,服务之间调用关系会随着业务的发展而变的复杂,一个服务可能依赖多个服务,服务之间层层依赖也是家常便饭的事情,如果一个服务的瘫痪很有可能导致整个系统的崩溃.比如说, ...

  5. Learning ROS for Robotics Programming Second Edition学习笔记(六) indigo xtion pro live

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...

  6. Python学习笔记六

    Python课堂笔记六 常用模块已经可以在单位实际项目中使用,可以实现运维自动化.无需手工备份文件,数据库,拷贝,压缩. 常用模块 time模块 time.time time.localtime ti ...

  7. Typescript 学习笔记六:接口

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  8. Django开发笔记六

    Django开发笔记一 Django开发笔记二 Django开发笔记三 Django开发笔记四 Django开发笔记五 Django开发笔记六 1.登录功能完善 登录成功应该是重定向到首页,而不是转发 ...

  9. python3.4学习笔记(六) 常用快捷键使用技巧,持续更新

    python3.4学习笔记(六) 常用快捷键使用技巧,持续更新 安装IDLE后鼠标右键点击*.py 文件,可以看到Edit with IDLE 选择这个可以直接打开编辑器.IDLE默认不能显示行号,使 ...

随机推荐

  1. Linux下使用yum安装软件命令

    1.yum list | grep 要下载的文件名字2.yum install 完整文件名字3.rpm -qa | grep 软件名字 //查看版本

  2. Handler,Looper,MessageQueue流程梳理

    目的:handle的出现主要是为了解决线程间通讯. 举个例子,android是不允许在主线程中访问网络,因为这样会阻塞主线程,影响性能,所以访问网络都是放在子线程中执行,对于网络返回的结果则需要显示在 ...

  3. Docker-Docker-compose应用

    Docker-compose是用来定义和运行多容器应用的工具,它是独立于docker存在的,需要单独安装.实际应用场景中,我们的应用可能被打包运行在不同的容器里面,例如一个常规的web应用可能会涉及到 ...

  4. [SQL Server] 时间处理:获取今天的00:00:00/获取今天的23:59:59

    获取今天的00:00:00 SELECT CONVERT(DATETIME,CONVERT(VARCHAR(10),GETDATE(),120)) 获取今天的23:59:59 1.SELECT DAT ...

  5. CG-CTF simple-machine

    运行一下,输入flag: 用ida打开: input_length和input_byte_804B0C0为重命名的变量:现在一个个看调用的函数. sub_8048526(): 这个函数使用了mmap分 ...

  6. ubuntu18.04修改网卡名称为eth0

    1.修改grub文件 vim /etc/default/grub 查找 GRUB_CMDLINE_LINUX="" 修改为 GRUB_CMDLINE_LINUX="net ...

  7. RocketMQ知识整理与总结

    1.架构 RocketMQ的master broker与master broker没有任何消息通讯,nameserver之间也同样没有消息通信 MQ历史 由数据结构队列发展而来 MQ使用场景    异 ...

  8. CentOS 7 系统下 GitLab 搭建

    参考地址:https://blog.csdn.net/t748588330/article/details/79915003 1. 安装:使用 GitLab 提供仓库在线安装 curl -sS htt ...

  9. video相关参数、操作和事件

    1.参数 video是h5的新特性(虽然新了很多年了),使得枯燥的页面有了很多生机.html代码示例: <video id="kingdom-video" src=" ...

  10. PyCharm选中文件夹新建时Directory与Python package的区别

    pycharm创建普通的directory和package时都是在硬盘上建立一个文件夹.但是建package时会在这个文件夹中自动地生成一个空的__init__.py文件.python的一个包是一个带 ...