SpringCloud--5.Hystrix服务熔断

1.服务雪崩

多个微服务之间调用的时候,假设微服务A调用微服务B和微服务C,微服务B和微服务C又调用其他的微服务,这就是所谓的"扇出"、如果扇出的链路上某个微服务的调用响应时间过长或者不可用,对微服务A的调用就会占用越来越多的系统资源,进而引|起系统崩溃,所谓的“雪崩效应"。对于高流量的应用来说,单一的后端依赖可能会导致所有服务器上的所有资源都在几秒中内饱和。比失败更糟糕的是,这些应用程序还可能导致服务之间的延迟增加,备份队列,线程和其他系统资源紧张,导致整个系统发生更多的级联故障,这些都表示需要对故障和延迟进行隔离和管理,以便单个依赖关系的失败,不能取消整个应用程序或系统。我们就需要:弃车保帅。

2.什么是Hystrix?

Hystrix是一个用于处理分布式系统的延迟和容错的开源库, 在分布式系统里,许多依赖不可避免的会调用失败,比如超时,异常等,Hystrix能够保证在一个依赖出问题的情况下, 不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性。
“断路器”本身是一种开关装置, 当某个服务单元发生故障之后,通过断路器的故障监控(类似熔断保险丝), 向调用方返回一个服务预期的,可处理的备选响应(FallBack) ,而不是长时间的等待或者抛出调用方法无法处理的异常,这样就可以保证了服务调用方的线程不会被长时间,不必要的占用,从而避免了故障在分布式系统中的蔓延,乃至雪崩。

3.Hystrix能干嘛?

●服务降级
●服务熔断
●服务限流
●接近实时的监控

官网地址:Hystrix官网

4.服务熔断

(1)什么是服务熔断
熔断机制是对应雪崩效应的一种微服务链路保护机制。当扇出链路的某个微服务不可用或者响应时间太长时,会进行服务的降级,进而熔断该节点微服务的调用,快速返回错误的响应信息。 当检测到该节点微服务调用响应正常后恢复调用链路。在SpringCloud框架里熔断
机制通过Hystrix实现。Hystrix会监控微服务间调用的状况,当失败的调用到一定阈值,缺省是5秒内20次调用失败就会启动熔断机制。熔断机制的注解是**@HystrixCommand**。
(2)使用Hystrix
新创建一个服务,内容和前面的三个服务提供者一样,但是我们增加熔断功能
1)新创建一个服务模块spring-cloud-provider-dept-hystrix,内容spring-cloud-provider-dept一样
在这里插入图片描述
2)导入maven依赖

<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-hystrix</artifactId>
            <version>1.4.6.RELEASE</version>
</dependency>

3)配置文件不用动,编写熔断方面的内容,以其中一个api为例

@HystrixCommand(fallbackMethod = "queryDeptById_Hystrix")//fallbackMethod这个api的服务失败后调用的备用方法
    @GetMapping("dept/get/{id}")
    public Dept queryDeptById(@PathVariable("id") int id){
        Dept dept=service.queryDeptById(id);
        if (null==dept)
            throw new RuntimeException("不存在id= "+id+" 的信息");
        return dept;
    }
    //queryDeptById备选方案
    public Dept queryDeptById_Hystrix(@PathVariable("id") int id){
        return new Dept()
                .setDeptno(id)
                .setDname("未找到Dname->null")
                .setDb_source("未找到Db_source->null  @Hystrix");//可以这样写是因为对pojo开启了链式编程的注解
    }

4)启动类开启熔断功能:使用 @EnableCircuitBreaker

@SpringBootApplication
@EnableEurekaClient //这个服务启动后就自动注册到eureka中
@EnableDiscoveryClient //服务发现
@EnableCircuitBreaker//对熔断的支持
public class ProviderDept_8001_Hystrix {
    public static void main(String[] args) {
        SpringApplication.run(ProviderDept_8001_Hystrix.class,args);
    }
}

5)测试
我们启动spring-cloud-eureka、spring-cloud-provider-dept02、spring-cloud-provider-dept-hystrix、spring-cloud-consumer-dept-feign这几个服务进行测试
以数据库中存在的1为例:
在这里插入图片描述
数据库中不存在的id 7为例
在这里插入图片描述
如果我们不用熔断,那么在查询id为7的时候,前端页面就会出现异常信息

5.服务降级

(1)概念
服务降级:当服务器压力剧增的情况下,根据实际业务情况及流量,对一些服务和页面有策略的不处理或换种简单的方式处理,从而释放服务器资源以保证核心交易正常运作或高效运作。
如果还是不理解,那么可以举个例子:假如目前有很多人想要给我付钱,但我的服务器除了正在运行支付的服务之外,还有一些其它的服务在运行,比如搜索、定时任务和详情等等。然而这些不重要的服务就占用了JVM的不少内存与CPU资源,为了能把钱都收下来(钱才是目标),我设计了一个动态开关,把这些不重要的服务直接在最外层拒掉,这样处理后的后端处理收钱的服务就有更多的资源来收钱了(收钱速度更快了),这就是一个简单的服务降级的使用场景。
这其实是在客户端进行操作的,从客户端就限制进入服务端的请求。

(2)使用Hystrix进行服务降级
既然是客服端的问题,我们就从客户端开始,这里的客服端使用的是Feign,而不是Ribbon+restTemplate
1)我们先在spring-cloud-api模块下编写一个类,做一些FallBack的操作,即备份的操作:

/**
 * FallBackFactory
 * 服务降级
 */
@Component
public class DeptClientFallBackFactory implements FallbackFactory {
    @Override
    public DeptClientService create(Throwable throwable) {
        return new DeptClientServiceImpl();
    }

    /**
     * 这个DeptClientServiceImpl实现了DeptClientService,
     * 因为上面DeptClientFallBackFactory需要返回一个备份处理类,
     * 所以就写在这儿就可以了,就不用另外创建一个类(静态内部类)
     */
    static class DeptClientServiceImpl implements DeptClientService{
        @Override
        public List<Dept> queryAll() {
            return new ArrayList<Dept>();
        }

        @Override
        public Dept queryById(int id) {
            return new Dept()
                    .setDeptno(id).setDname("没有相关信息")
                    .setDb_source("没有相关信息");
        }

        @Override
        public boolean addOne(Dept dept) {
            return false;
        }

}
}

2)之前讲过@FeignClient的一些参数,里面有关于fallback的一些属性,这里设置一下
在这里插入图片描述
3)修改配置,开启hystrix
在这里插入图片描述
4)测试:开启spring-cloud-eureka、spring-cloud-provider-dept(这个是没有开启熔断的)、spring-cloud-consumer-dept-feign三个测试即可

正常的id为1的数据
在这里插入图片描述
现在我们关闭服务提供者:spring-cloud-provider-dept,再从客户端获取同样的数据看看
在这里插入图片描述
数据就变成了我们设置的信息

6.DashBoard监控

这是一个监控页面,我们只需要导入依赖,设置端口号,启动服务即可。
1)创建新module:spring-cloud-consumer-hystrix-dashboard
2)导入依赖

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

3)端口9001

server:
  port: 9001

4)开启注解**@EnableHystrixDashboard**,启动服务
注意服务提供着需要有监控的依赖,由于之前导了,就不用导了:

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

5)接下来,我们想要监控spring-cloud-provider-dept-hystrix这个服务提供者,所以要配置一个特定的servlet:
注册一个servlet:

//注册一个servlet
    @Bean
    public ServletRegistrationBean hystrixMetricsStreamServlet(){
        ServletRegistrationBean bean=new ServletRegistrationBean(new HystrixMetricsStreamServlet());
        bean.addUrlMappings("/actuator/hystrix.stream");
        return bean;
    }

6)启动服务:spring-cloud-eureka、spring-cloud-consumer-hystrix-dashboard、spring-cloud-provider-dept-hystrix
7)访问 http://localhost:9001/hystrix
在这里插入图片描述
8)填写信息
在这里插入图片描述
9)监控结果:我们猛点几次请求http://localhost:8001/dept/get/1,访问服务器就会得到这个结果
在这里插入图片描述
介绍一下图的意思:
实心圆:共有两种含义,它通过颜色的变化代表了实例的健康程度 从绿色<黄色<橙色<红色递减
该实心圆除了颜色的变化之外,它的大小也会根据实例的请求流量发生变化,流量越大,该实心圆就越大,所以通过该实心圆的展示,就可以在大量的实例中快速发现故障实例和高压力实例。
曲线:用来记录2分钟内流量的相对变化,可以通过它来观察到流量的上升和下降趋势!

完整信息:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值