SpringCloud(四)Hystrix服务降级、熔断、监控页面

news2024/11/28 2:29:37

一、服务熔断

官方文档:https://cloud.spring.io/spring-cloud-static/spring-cloud-netflix/1.3.5.RELEASE/single/spring-cloud-netflix.html#_circuit_breaker_hystrix_clients

我们知道,微服务之间是可以进行相互调用的,那么如果出现了下面的情况会导致什么问题?

由于位于最底端的服务提供者E发生故障,那么此时会直接导致服务ABCD全线崩溃,就像雪崩了一样。 

这种问题实际上是不可避免的,由于多种因素,比如网络卡顿、系统故障、硬件问题等,都存在一定可能,会导致这种极端的情况发生。因此,我们需要寻找一个应对这种极端情况的解决方案。

为了解决分布式系统的雪崩问题,SpringCloud提供了Hystrix熔断器组件,他就像我们家中的保险丝一样,当电流过载就会直接熔断,防止危险进一步发生,从而保证家庭用电安全。可以想象一下,如果整条链路上的服务已经全线崩溃,这时还在不断地有大量的请求到达,需要各个服务进行处理,肯定是会使得情况越来越糟糕的。

我们来详细看看它的工作机制。

1.服务降级

服务降级,注意一定要区分开服务降级和服务熔断的区别,服务降级并不会直接返回错误,而是可以提供一个补救措施,正常响应给请求者。这样相当于服务依然可用,但是服务能力肯定是下降了的。

我们就基于借阅管理服务来进行讲解,我们不开启用户服务和图书服务,表示用户服务和图书服务已经挂掉了。

这里我们导入Hystrix的依赖(此项目已经停止维护,SpringCloud依赖中已经不自带了,所以说需要自己单独导入):

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

接着我们需要在启动类添加注解开启:

@SpringBootApplication
@EnableFeignClients
@EnableHystrix   //启用Hystrix
public class BorrowApplication {
    public static void main(String[] args) {
        SpringApplication.run(BorrowApplication.class, args);
    }
}

那么现在,由于用户服务和图书服务不可用,所以查询借阅信息的请求肯定是没办法正常响应的,这时我们可以提供一个备选方案,也就是说当服务出现异常时,返回我们的备选方案:

BorrowController


@RestController
@RequestMapping("/borrow")
public class BorrowController {

    @Resource
    private BorrowService borrowService;

    //使用@HystrixCommand来指定备选方案
    @HystrixCommand(fallbackMethod = "onError")
    @GetMapping("/getBorrowById/{uid}")
    public UserBorrowDto getBorrowById(@PathVariable("uid") Integer uid){
        return borrowService.getUserBorrowDtoByUid(uid);
    }

    //备选方案,这里直接返回空列表了
    //注意参数和返回值要和上面的一致
    public UserBorrowDto onError(Integer uid){
        return new UserBorrowDto(null, Collections.emptyList());
    }
}

可以看到,虽然我们的服务无法正常运行了,但是依然可以给浏览器正常返回响应数据: 

 

 服务降级是一种比较温柔的解决方案,虽然服务本身的不可用,但是能够保证正常响应数据。

2.服务熔断

熔断机制是应对雪崩效应的一种微服务链路保护机制,当检测出链路的某个微服务不可用或者响应时间太长时,会进行服务的降级,进而熔断该节点微服务的调用,快速返回”错误”的响应信息。当检测到该节点微服务响应正常后恢复调用链路。

实际上,熔断就是在降级的基础上进一步升级形成的,也就是说,在一段时间内多次调用失败,那么就直接升级为熔断。

加入两条语句打印

    //使用@HystrixCommand来指定备选方案
    @HystrixCommand(fallbackMethod = "onError")
    @GetMapping("/getBorrowById/{uid}")
    public UserBorrowDto getBorrowById(@PathVariable("uid") Integer uid){
        System.out.println("正常执行方法");
        return borrowService.getUserBorrowDtoByUid(uid);
    }

    //备选方案,这里直接返回空列表了
    //注意参数和返回值要和上面的一致
    public UserBorrowDto onError(Integer uid){
        System.out.println("服务器错误,进入备选方法");
        return new UserBorrowDto(null, Collections.emptyList());
    }
}

一开始的时候,会正常地去调用Controller对应的方法findUserBorrows,发现失败然后进入备选方法,但是我们发现在持续请求一段时间之后,没有再调用这个方法,而是直接调用备选方案,这便是升级到了熔断状态。

我们可以继续不断点击,继续不断地发起请求:

可以看到,过了一段时间之后,会尝试正常执行一次findUserBorrows,但是依然是失败状态,所以继续保持熔断状态。

所以得到结论,它能够对一段时间内出现的错误进行侦测,当侦测到出错次数过多时,熔断器会打开,所有的请求会直接响应失败,一段时间后,只执行一定数量的请求,如果还是出现错误,那么则继续保持打开状态,否则说明服务恢复正常运行,关闭熔断器。

我们可以测试一下,开启另外两个服务之后,继续点击:

 

可以看到,当另外两个服务正常运行之后,当再次尝试调用findUserBorrows之后会成功,于是熔断机制就关闭了,服务恢复运行。

总结 

 二、OpenFign实现降级

Hystrix也可以配合Feign进行降级,我们可以对应接口中定义的远程调用单独进行降级操作。

比如我们还是以用户服务挂掉为例,那么这个时候肯定是会远程调用失败的,也就是说我们的Controller中的方法在执行过程中会直接抛出异常,进而被Hystrix监控到并进行服务降级。

而实际上导致方法执行异常的根源就是远程调用失败,所以我们换个思路,既然用户服务调用失败,那么我就给这个远程调用添加一个替代方案,如果此远程调用失败,那么就直接上替代方案。那么怎么实现替代方案呢?我们知道Feign都是以接口的形式来声明远程调用,那么既然远程调用已经失效,我们就自行对其进行实现,创建一个实现类,对原有的接口方法进行替代方案实现:
 

package com.example.service.client;

import com.example.entity.User;
import org.springframework.stereotype.Component;

@Component
public class UserFallbackClient implements UserClient {
    @Override
    public User getUserById(Integer uid) {
        User user = new User();
        user.setName("我是补救措施");
        return user;
    }
}

实现完成后,我们只需要在原有的接口中指定失败替代实现即可:

//声明为userservice服务的HTTP请求客户端
@FeignClient(value = "userservice",fallback = UserFallbackClient.class)
public interface UserClient {

    //路径保证和其他微服务提供的一致即可
    @GetMapping("/user/getUserById/{uid}")
    User getUserById(@PathVariable("uid") Integer uid);
}

现在去掉BorrowController@HystrixCommand注解和备选方法:

@RestController
@RequestMapping("/borrow")
public class BorrowController {

    @Resource
    private BorrowService borrowService;


    @GetMapping("/getBorrowById/{uid}")
    public UserBorrowDto getBorrowById(@PathVariable("uid") Integer uid){
        return borrowService.getUserBorrowDtoByUid(uid);
    }

}

最后我们在配置文件中开启熔断支持:


feign:
  circuit breaker:
    enabled: true

 

可以看到,现在已经采用我们的替代方案作为结果。

三、监控页面部署 

除了对服务的降级和熔断处理,我们也可以对其进行实时监控,只需要安装监控页面即可,这里我们创建一个新的项目,导入依赖:

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

接着添加配置文件:

server:
  port: 8900
hystrix:
  dashboard:
    # 将localhost添加到白名单,默认是不允许的
    proxy-stream-allow-list: "localhost"

接着创建主类,注意需要添加@EnableHystrixDashboard注解开启管理页面:

@SpringBootApplication
@EnableHystrixDashboard
public class HystrixDashBoardApplication {
    public static void main(String[] args) {
        SpringApplication.run(HystrixDashBoardApplication.class, args);
    }
}

启动Hystrix管理页面服务,然后我们需要在要进行监控的服务中添加Actuator依赖:

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

Actuator是SpringBoot程序的监控系统,可以实现健康检查,记录信息等。在使用之前需要引入spring-boot-starter-actuator,并做简单的配置即可。

然后在配置文件中配置Actuator添加暴露:

management:
  endpoints:
    web:
      exposure:
        include: '*'

接着我们打开刚刚启动的管理页面,地址为:http://localhost:8900/hystrix/

 在中间填写要监控的服务:比如借阅服务:http://localhost:8301/actuator/hystrix.stream,注意后面要添加/actuator/hystrix.stream,然后点击Monitor Stream即可进入监控页面:

可以看到5次访问都是正常的,所以显示为绿色,接着我们来尝试将图书服务关闭,这样就会导致服务降级甚至熔断,然后再多次访问此服务看看监控会如何变化: 

 

可以看到,错误率直接飙升到100%,并且一段时间内持续出现错误,中心的圆圈也变成了红色,在出现大量错误的情况下保持持续访问,可以看到此时已经将服务熔断,Circuit更改为Open状态,并且图中的圆圈也变得更大,表示压力在持续上升。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/769544.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

YUM报错:Could not retrieve mirrorlist

​​​​​​背景说明 ESXI新安装CentOS7&#xff0c;无法执行yum命令 报错内容解决方案 1.报错说明&#xff1a;问题在于yum无法获取CentOS的软件仓库地址&#xff0c;导致无法找到合法的baseurl2.检查网络连接&#xff1a;确保服务器可以访问互联网&#xff0c;以及能够解析D…

C++ CEF库 源码编译及使用(VS2019)

源码编译 官网下载源码 CEF Automated Builds

linux下mmdetection安装

linux下mmdetection安装 使用 MIM 安装 MMEngine 和 MMCV。安装 MMDetection 前提条件是配置了pytorch18的linux环境 参考流程&#xff1a;配置pycharm环境 拷贝pycharm环境为mmdet conda create -n mmdet --clone torch18进入 conda activate mmdet使用 MIM 安装 MMEngine …

量化基础 PTQ QAT

简介 固定bit下的量化始终无法在Accuracy和 (FLOPs & Parameters)之间达到一个非常细粒度的trade-off&#xff0c;所以就需要混合精度量化(Mixed-Precision Quantization, MPQ)来对模型实现进一步的高效压缩 混合精度量化区别于混合精度训练这个概念&#xff0c;后者指的是…

c基本数据类型

关键字 charshort intintlong intfloatdouble 常量和变量 常量&#xff1a;在程序运行过程中&#xff0c;其值不可改变的量变量&#xff1a;其值可以改变的量称为变量 字符数据 字符常量 直接常量&#xff1a;用单引号括起来&#xff0c;如&#xff1a;‘a’,‘b’.转义字…

7.4Java EE——Bean的作用域

一、singleton作用域 Spring支持的5种作用域 作用域名城 描述 singleton 单例模式。在单例模式下&#xff0c;Spring 容器中只会存在一个共享的Bean实例&#xff0c; 所有对Bean的请求&#xff0c;只要请求的id&#xff08;或name&#xff09;与Bean的定义相匹配&#xff0…

msvc2017x64编译器编译项目报错”编译器的堆空间不足“错误 的解决方法

开发日常软件的时候&#xff0c;因为项目较大&#xff0c;模块较多&#xff0c;编译时&#xff0c;报错”编译器编译空间不足“&#xff0c;且常规方法无法消除的问题。有 opengl模块 占用内存大 尝试 尝试1   按照常规的&#xff0c;在pro里面加大资源配置&#xff1a; CONF…

记录一下uniapp开发中遇到的一些问题

概述 最近码代码的时候遇到一些问题&#xff0c;这里自己记录总结一下&#xff0c;供大家参考&#xff0c;说得不对的地方希望大家指出 大概介绍一下我用到的内容 用HbuilderX新建一个uni-app项目 &#xff0c;vue版本选的2&#xff0c;爬坑轻松一点移动端ui框架选了uView&…

C 知识积累 回车与换行 Linux C 语法分析

目录 回车与换行一.知其然二.知其所以然 关键字&#xff0c;操作符和函数区别1&#xff1a;关键字2&#xff1a;操作符3&#xff1a;函数 命令行参数argv原码补码补码加法 Linux C 语法分析结构体指针类型函数宏定义其他 const语法整理 回车与换行 一.知其然 \n是换行&#x…

智能电表远程抄表系统原理

智能电表远程抄表系统是现代智能电网建设的重要组成部分&#xff0c;它利用物联网技术实现电表数据的远程采集、传输和处理&#xff0c;提高了电力公司的抄表效率&#xff0c;同时也为用户提供了更加便捷、准确的用电服务。本文将从远程智能电表抄表系统的工作原理、特点、应用…

KDE项目近日发布了KDE Frameworks 5.108

导读KDE项目近日发布了KDE Frameworks 5.108&#xff0c;作为这个开源软件套件的最新版本&#xff0c;它由80多个Qt附加库组成&#xff0c;为KDE Plasma桌面环境和KDE应用程序提供常用功能。 KDE Frameworks 5.108在这里修复了Plasma桌面崩溃的问题&#xff0c;该问题发生在用中…

Openlayers layer 基础及重点内容讲解

图层就像是含有文字或图形等元素的图片,一张张按顺序叠放在一起,组合起来形成页面的最终效果。 在 openlayers 中,图层是使用 layer 对象表示的,主要有 WebGLPoints Layer、热度图(HeatMap Layer)、图片图层(Image Layer)、切片图层(Tile Layer)和 矢量图层(Vector Layer…

ShardingSphere分库分表实战之水平分表

&#x1f680; ShardingSphere &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&…

科东软件入选“四化”赋能重点平台

科东软件Intewell工业嵌入式实时操作系统成功入选广州市“四化”赋能重点平台名单 2023年7月14日&#xff0c;广州市工业和信息化局公布广州市“四化”赋能重点平台名单&#xff08;第二批&#xff09;&#xff0c;科东软件凭借国产化技术创新优势、成熟的数字化转型方案&#…

与 AI 数智助理 Kyligence Copilot 携手,共同挖掘数据的无限潜能

Kyligence 用户大会近日在上海顺利召开&#xff0c;会上 Kyligence 重磅发布了 AI 数智助理 Kyligence Copilot&#xff08;预览版&#xff09;。生成式 AI&#xff08;Generative AI&#xff09;正带来人机交互方式的革命&#xff0c;并将改变人类使用数据的习惯&#xff0c;K…

MyBatis学习笔记——1

MyBatis学习笔记——1 一、MyBatis概述1.1、框架1.2、三层架构1.4、了解MyBatis1.4、ORM思想 二、MyBatis入门程序2.1、Mybatis程序的编写2.2、MyBatis入门程序的一些小细节2.3、MyBatis事务管理机制深度解析2.4、在开发中junit是如何使用的2.5、Mybatis集成日志框架logback 三…

3.9 Bootstrap 分页

文章目录 Bootstrap 分页分页&#xff08;Pagination&#xff09;默认的分页分页的状态分页的大小 翻页&#xff08;Pager&#xff09;默认的翻页对齐的链接翻页的状态 分页 Bootstrap 分页 本章将讲解 Bootstrap 支持的分页特性。分页&#xff08;Pagination&#xff09;&…

PADS VX2.5学习

1、关于库的定义 PADS中的元件库分为四个文件 &#xff1a;*.ld9 *.ln9 *.pd9 *.pt9 即CAE、 LINES、PCB DECAL、PART TYPE。只有这四个文件都存在才是一个完整的库&#xff0c;才可以加载。 我们设计的电路所用到的元件必须在PADS logic和PADS layout中都存在&#xff0c;…

【正点原子STM32连载】第六十五章 UCOSII实验3-消息队列、信号量集和软件定时器摘自【正点原子】STM32F103 战舰开发指南V1.2

1&#xff09;实验平台&#xff1a;正点原子stm32f103战舰开发板V4 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id609294757420 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html# 第六…

【Linux系统编程】Linux调试器——gdb 的基本使用

文章目录 1. 准备工作及知识补充1.1 源文件和Makefile1.2 安装gdb并解决没有调式信息的问题debug和release的了解如何解决 2. gdb的基本使用2.1 显示代码2.2 设置、删除和查看断点2.3 禁用和启用断点2.4 逐语句和逐过程调式2.5 查看函数调用堆栈2.6 查看指定变量的值2.7 跳至指…