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

一、服务熔断

官方文档: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 {@Resourceprivate 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 {@Overridepublic 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 {@Resourceprivate 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.hqwc.cn/news/27564.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何创建 Spring Boot 项目

目录 一、Spring Boot 项目的创建 1. 安装 Spring Boot Helper 插件 2. 创建 Spring Boot 项目 3. 项目目录详解 4. 运行 Spring Boot 项目 二、Spring Boot 的优点 前言 Spring Boot 的意思就是 Spring Boot 脚手架的意思&#xff0c;已经总结完成 Spring 的学习&#x…

js计算数组中每个元素出现的次数

tip&#xff1a;空值合并运算符&#xff08;??&#xff09;是一个逻辑运算符&#xff0c;当左侧的操作数为 null 或者 undefined 时&#xff0c;返回其右侧操作数&#xff0c;否则返回左侧操作数。reduce() 方法对数组中的每个元素按序执行一个提供的 reducer 函数&#xff0…

华为鲲鹏920 aarch64 版本 Ambari HDP 下载地址

声明&#xff1a;为有效缓解各位同行兄弟们的痛&#xff0c;特推出此文 本文能够适配兼容 华为鲲鹏920 aarch64 版本&#xff0c;仅限 CentOS7、openEuler20.03-LTS 操作系统 以下是详细下载地址 1、CentOS7 aarch64版本 CentOS7 aarch64 https://mirrors.huaweicloud.com/…

【HCIA】10.VLAN间通信

VLAN间通信的解决方法 使用路由器的物理接口 路由器三层接口作为网关&#xff0c;转发本网段前往其它网段的流量。路由器三层接口无法处理携带VLAN Tag的数据帧&#xff0c;因此交换机上联路由器的接口需配置为Access。路由器的一个物理接口作为一个VLAN的网关&#xff0c;因此…

考虑充电负荷空间可调度特性的分布式电源与电动汽车充电站联合配置方法(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

从源码理解Scala中函数reduceRight的计算过程

水善利万物而不争&#xff0c;处众人之所恶&#xff0c;故几于道&#x1f4a6; 以List集合为例&#xff0c;进行reduceRight()的计算过程分析&#xff0c;总体分为两部分&#xff0c;一部分是看最顶层特质的那个通用的reduceRight方法&#xff0c;另一部分是讲直接混入的特质的…

数据结构顺序表,实现增删改查

一、顺序表结构体定义 #define MAXSIZE 8 //定义常量MAXSIZE&#xff0c;表示数据元素的最大个数为8 typedef int datatype; //重定义int类型&#xff0c;分别后期修改顺序表中存储的数据类型 typedef struct {int len; //顺序表长度datatype data[MAXSIZE…

Mysql 备份与还原

目录 一、数据备份的重要性 二、数据库备份类型 2.1 物理备份 2.&#xff12; 逻辑备份 三、常见的备份方法 3.1 物理冷备 3.2 专用备份工具 mysqldump 或 mysqlhotcopy 3.3 启用二进制日志进行增量备份 3.4 第三方工具备份 四、MySQL完全备份 五、数据库完全备份分类…

【学会动态规划】不同路径 II(6)

目录 动态规划怎么学&#xff1f; 1. 题目解析 2. 算法原理 1. 状态表示 2. 状态转移方程 3. 初始化 4. 填表顺序 5. 返回值 3. 代码编写 写在最后&#xff1a; 动态规划怎么学&#xff1f; 学习一个算法没有捷径&#xff0c;更何况是学习动态规划&#xff0c; 跟我…

算法提高-动态规划-背包问题

背包问题 01背包AcWing 423. 采药AcWing 1024. 装箱问题AcWing 1022. 宠物小精灵之收服AcWing 278. 数字组合AcWing 1023. 买书AcWing 426. 开心的金明 完全背包AcWing 1021. 货币系统AcWing 532. 货币系统 多重背包AcWing 1019. 庆功会单调队列优化AcWing 6. 多重背包问题 III…

Kubernetes - HPA-VPA - metrics介绍和安装 - HPA实验

目录 参考文章&#xff1a;(97条消息) Kubernetes-自动扩展器HPA、VPA、CA_hpa vpa_SRE运维充电站的博客-CSDN博客 HPA VPA 官方网址&#xff1a;autoscaler/vertical-pod-autoscaler at master kubernetes/autoscaler GitHub HPA和VPA进行扩缩容的区别&#xff1a; me…

【JavaEE】HTTP请求的构造

目录 1、通过form表单构造HTTP请求 2、通过JS的ajax构造HTTP请求 3、Postman的安装和简单使用 常见的构造HTTP请求的方式有一下几种&#xff1a; 直接通过浏览器的地址栏&#xff0c;输入一个URL&#xff0c;就可以构造一个GET请求HTML中的一些特殊标签&#xff0c;也会触发…