SpringCloud笔记六:Hystrix

[TOC]

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的名称,我们改成

 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的代码

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

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

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

Hystrix服务降级

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

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

<table><tr><th bgcolor=yellow>注意:服务降级是客户端的事,和服务端没什么关系</th></tr></table>

修改api项目

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

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

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

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

修改客户端的yml文件

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

1feign: 2 hystrix: 3 enabled: true

测试服务降级

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

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

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

Hystrix Dashboard

Hystrix Dashboard各种配置

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

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

consumer-hystrix-dashboard-9001

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

1server: 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线,就是这条线

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

我们来访问服务http://localhost:8001/dept/get/1,刷刷刷,刷个十几次,再看看这条线

我刷了20次,看看,线有升降,小圈变色了,也变大了。

总结

Hystrix断路器算是介绍完毕了,我总结一下:

  1. 我们学习了服务熔断,这个很简单就是把服务停止了。
  2. 我们学习了Hystrix的服务降级,目的是为了保证重要的服务先用资源,不重要的服务使用AOP的方法提示个暂时不可用,降低服务器压力。后续还是要开启这些服务的。
  3. 我们学习了Hystrix Dashboard服务监控,口诀7色1圈1线

防盗链接:本博客由蜀云泉发表

点赞
收藏

评论区

加载中...

相关推荐

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

Spring Cloud Alibaba:Sentinel实现熔断与限流

一、什么是SentinelSentinel,中文翻译为哨兵,是为微服务提供流量控制、熔断降级的功能,它和Hystrix提供的功能一样,可以有效的解决微服务调用产生的“雪崩效应”,为微服务系统提供了稳定性的解决方案。随着Hystrix进入了维护期,不再提供新功能,Sentinel是一个不错的替代方案。通常情况下,Hystrix采用线程池对服务的调用

Hystrix的介绍和简单使用

这周在看项目的相关代码时,接触到了Hystrix,因此查询了相关资料学习了下。一、什么是Hystrix  Hystrix是Netflix针对微服务分布式系统的熔断保护中间件,当我们的客户端连接远程的微服务时,有两种情况需要考虑:首先,如果远程系统当机了我们怎么办?其次,我们如何管理对远程微服务的调用性能,以保证每个微服务以最小延迟最快性能

Hystrix——让你的服务更稳一点

摘要:1、为什么要用Hystrix在分布式服务环境下,服务之间的调用关系变得错综复杂,你是否担心依赖的服务延迟导致自己的服务也被拖跨呢?是否在苦苦思考如何优雅的对依赖服务进行异步调用呢?是否希望当流量高峰时自动进行...

SpringCloud之Hystrix服务降级(七)

Hystrix设计原则1.防止单个服务的故障,耗尽整个系统服务的容器(比如tomcat)的线程资源,避免分布式环境里大量级联失败。通过第三方客户端访问(通常是通过网络)依赖服务出现失败、拒绝、超时或短路时执行回退逻辑2.用快速失败代替排队(每个依赖服务维护一个小的线程池或信号量,当线程池满或信号量满,会立即拒绝服务而不会排队等待)和优雅的服

SpringCloud 微服务 (十五) 服务容错 Hystrix

壹工作中的微服务架构,某个服务通常会被多个服务调用或者多层调用完成需求,如果某个服务不可用,导致一个系统功能不可用或者服务直接没用了的情况,这种情况称为雪崩效应有A服务调用B服务,B服务调用C服务,如果B服务调用C服务出了问题,那么B服务会一直重试,等待会将资源耗尽,结果B服务也不可用,导致A服务调用B服务的时候,也出问题,这样的话,ABC服务都