SpringCloud中Hystrix服务熔断+服务降级+Dashboard流监控--狂神说

工具:idea
详细了解博客连接:https://blog.csdn.net/weixin_43591980/article/details/106255
视频链接:https://www.bilibili.com/video/BV1jJ411S7xr

服务熔断(服务端)

分布式系统面临的问题
复杂分布式体系结构中的应用程序有数十个依赖关系,每个依赖关系在某些时候将不可避免的失败!
服务雪崩:
多个微服务之间调用的时候,假设微服务A调用微服务B和微服务C,微服务B和微服务C又调用其他的微服务,这就是所谓的“扇出”、如果扇出的链路上某个微服务的调用响应时间过长或者不可用,对微服务A得到调用就会占用越来越多的系统资源,进而引起系统崩溃,这就是所谓的“雪崩效应”。
对于高流量的应用来说,单一的后端依赖可能会导致所有服务器上的所有资源都在几秒钟内饱和。比失败更糟糕的是,这些应用程序还可能导致服务之间的延迟增加,备份队列,线程和其他系统资源紧张,导致整个系统发生更多的联级故障,这些都表示对故障和延迟进行隔离和管理,以便单个依赖关系的失败,不能取消整个应用程序或系统。
所以我们得“弃车保帅”。
在这里插入图片描述

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

Hystrix能干嘛

  • 服务降级:在可能的情况下回退并优雅地降级。如果有一段时间点,A这个服务被N个客户访问,而B、C这两个服务很闲,就关闭B、C这两个服务,先让A这个服务度过难关。如果有客户访问B、C两个服务,那就告诉客户不能访问。
    在这里插入图片描述

  • 服务熔断:熔断制机,主要用于应对雪崩效应的一种保护机制。指的是为了保全整体牺牲局部。

  • 服务限流:为了不让软件系统奔溃,系统中通常会限流。比如一个景点,为了不把景点撑瀑,管理部门会在外面限制景点进入人数,技术原理–令牌桶算法。

  • 接近实时的监控:实现近乎实时的监控、警报和操作控制

  • ……

官网资料:https://github.com/Netflix/Hystrix/wiki

服务熔断
熔断机制是对应雪崩效应的一种微服务链路保护机制。
当扇出链路的某个微服务不可用或者响应时间太长,会进行服务降级,进而熔断该节点微服务的调用,快速返回错误的响应信息。当检测到该节点微服务调用响应正常后恢复调用链路。在SpringCloud框架里熔断机制通过Hystrix实现。Hystrix会监控微服务调用的状况,当失败的调用到一定阈值,缺省是5秒内20次调用失败就会启动熔断机制。熔断机制的注解是@HystrixCommand。

将8001复制一份,改一下名称。主启动类也改一下名称,区分开来。
在这里插入图片描述

改application.yml
在这里插入图片描述

要使用hystrix配置的话,导入依赖。springcloud-provider-dept-hystrix-8001中的pom文件

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

DeptController

package com.springcloud.controller;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.springcloud.pojo.Dept;
import com.springcloud.service.DeptService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
//提供restful服务
@RestController
public class DeptController {
    @Autowired
    private DeptService deptService;
//调用hystrixGet
@HystrixCommand(fallbackMethod = "hystrixGet")
    @GetMapping("/dept/get/{id}")
    public Dept get(@PathVariable("id") Long id){
        Dept dept = deptService.queryById(id);
        if (dept == null){
            throw new RuntimeException(("找不到该用户或信息无效"));
        }
        return dept;
    }
    //备选方案  链式写法
    public Dept hystrixGet(@PathVariable("id") Long id){
        return new Dept()
                .setDeptno(id)
                .setDname("不存在该用户或信息无法找到")
                .setDb_source("no this datasource in MySQL");
    }

}

但是这里会有报错的情况。
在这里插入图片描述

可以在备选方案下面写上一个注解,待看完源码之后就可以删除掉@Accessors这个注解
在这里插入图片描述
源码信息:
在这里插入图片描述
首先这个@Accessors注解的含义:
fluent的中文含义是流畅的,设置为true,则getter和setter方法的方法名都是基础属性名,且setter方法返回当前对象
chain的中文含义是链式的,设置为true,则setter方法返回当前对象。
prefix的中文含义是前缀,用于生成getter和setter方法的字段名会忽视指定前缀(遵守驼峰命名)。
所以就是说用void的setter方法在这里并不行。

找到springcloud-api中的Dept实体类,添加以下三个字段的实体类,报错即可解决
在这里插入图片描述

在springcloud-provider-dept-hystrix-8001的主启动类DeptProviderHystrix_8001添加注解
在这里插入图片描述

启动7001、7002集群、springcloud-provider-dept-80中的DeptProviderHystrix_8001、springcloud-consumer-dept-hystrix-feign中的FeignDeptConsumer_80
在这里插入图片描述
但这是不完善的写法,服务很容易会崩。

修改springcloud-provider-dept-80中的SpringCloudRule和DeptController
在这里插入图片描述

停掉hystrix-8001,启动8001,然后服务崩掉之后就会报错500。

服务降级(客户端)

还是这个图。A、B、C三个服务。一堆请求访问服务A,假如有一段时间段全部在访问A,资源快不够用了,忍痛把其他的一些服务关闭,等A度过难关。也就是说资源不够用,就忍痛关闭一些服务来达到服务降级的目的。避免雪崩,等难关度过之后再启动。
在这里插入图片描述

在springcloud-api中的service下添加一个类DeptClientServiceFallbackFactory
在这里插入图片描述

DeptClientServiceFallbackFactory

package com.springcloud.service;
import com.springcloud.pojo.Dept;
import feign.hystrix.FallbackFactory;
import org.springframework.stereotype.Component;
import java.util.List;
//降级
@Component
public class DeptClientServiceFallbackFactory implements FallbackFactory {
    @Override
    public DeptClientService create(Throwable throwable){
        return new DeptClientService() {
            @Override
            public Dept queryById(Long id) {
                //链式写法
                return new Dept()
                        .setDeptno(id)
                        .setDname("id=>"+id+"没用对应信息,客户端提供了降级信息,这个服务现在已经被关闭")
                        .setDb_source("无数据");
            }
            @Override
            public List<Dept> queryAll() {
                return null;
            }
            @Override
            public boolean addDept(Dept dept) {
                return false;
            }
        };
    }
}

springcloud-api下修改DeptClientService
在这里插入图片描述

在springcloud-consumer-dept-feign中修改application.yml文件
在这里插入图片描述

然后启动7001、7002、8001、feign-80
在这里插入图片描述

关闭一个服务后,再次访问:
在这里插入图片描述

简单总结:
服务熔断:(服务端),某个服务超时或者异常,会引起熔断,类似于保险丝
服务降级:(客户端),从整体网站请求负载考虑,当某个服务器熔断或者关闭之后,服务将不再被调用。但是能正常访问。此时在客户端我们可以准备一个失败回调,也就是FallbackFactory,返回一个默认值(缺省值),整体的服务水平下降了,不过还能访问, 比直接挂掉好。

Dashboard流监控

新建一个module,springcloud-consumer-hystrix-dashboard,将hystrix-8001中的pom文件拷贝进来之后还得加两个依赖

<!--hystrix依赖-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
    <version>2.2.9.RELEASE</version>
</dependency>
<!--hystrix的监控依赖dashboard-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
    <version>2.2.9.RELEASE</version>
</dependency>

Application.yml文件

server:
  port: 9001

主启动类:DeptConsumerDashboard_9001

package com.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.hystrix.dashboard.EnableHystrixDashboard;
//启动类
@SpringBootApplication
@EnableHystrixDashboard //开启监控
public class DeptConsumerDashboard_9001 {
    public static void main(String[] args) {
        SpringApplication.run(DeptConsumerDashboard_9001.class,args);
    }
}

目录结构图:
在这里插入图片描述

启动,访问http://localhost:9001/hystrix 中间如果有报错问题不大的话,看到这个页面证明成功
在这里插入图片描述

Springcloud-provider-dept-8001中pom文件,导依赖包

<!--hystrix依赖-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
    <version>2.2.9.RELEASE</version>
</dependency>

Springcloud-provider-dept-8001的启动类DeptProvider_8001

package com.springcloud;
import com.netflix.hystrix.contrib.metrics.eventstream.HystrixMetricsStreamServlet;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.context.annotation.Bean;
//启动类
@SpringBootApplication
@EnableEurekaClient  //开启注解,在服务启动后自动配置到7001中的EurekaServer_7001去
@EnableDiscoveryClient  //服务发现
public class DeptProvider_8001 {
    public static void main(String[] args) {
        SpringApplication.run(DeptProvider_8001.class,args);
    }
    //添加一个servlet
    //固定的代码
    @Bean
    public ServletRegistrationBean hystrixMetricsStreamServlet(){
        ServletRegistrationBean registrationBean = new ServletRegistrationBean(new HystrixMetricsStreamServlet());
        registrationBean.addUrlMappings("/actuator/hystrix.stream");//访问这个页面就可以被监控了
        return registrationBean;
    }
}

先启动7001、再9001、后dept-8001
先输入http://localhost:8001/actuator/hystrix.stream
然后复制路径,进入http://localhost:9001/hystrix 填写上面的地址栏
里面有很多个ping,这个是心跳,每访问一次7001或者7002或者7003就会ping一次
在这里插入图片描述
图中第一个红色方框是地址栏,第二个多少秒,跟实例的名称
在这里插入图片描述
点击Monitor Stream,跳转
在这里插入图片描述

每次请求,也就是相当于刷新一次,绿色的圆圈就变大一点,请求越频繁圆圈就越大
在这里插入图片描述

停止请求之后这个圆就慢慢变小。像心跳一样。
在这里插入图片描述
监控的本质:监控请求信息

图中有
一圈
实心圈:共有两种含义,他通过颜色的变化代表了实例的健康程度
健康程度从 绿色<黄色<橙色<红色 递减。除了颜色变化之外,它的大小也会根据实例的请求流量发生变化,流量越大,该实心圆就越大,所以通过该实心圆的展示,就可以在大量的实例中快速发现故障实例和高压力实例。
一线
曲线:用来记录2分钟内流量的相对变化,可以通过它来实现观察到流量的上升和下降趋势。
整图说明:
在这里插入图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值