服务熔断保护实践--Hystrix

概述

微服务有很多互相调用的服务,构成一系列的调用链路,如果调用链路中某个服务失效或者网络堵塞等问题,而有较多请求都需要调用有问题的服务时,这是就会造成多个服务的大面积失效,造成服务“雪崩”效应。

服务“雪崩”的根本原因在于服务之间的强依赖,为了预防服务“雪崩”这一问题,可以做好服务隔离、服务熔断降级、服务限流。

服务隔离:当某个服务故障时,不波及其他模块,不影响整体服务。

服务熔断:当下游服务因为请求压力过大造成响应慢或响应失败时,上游服务为了保护系统,暂时切断对下游服务的调用,直接返回一个降级的内容,从而保全整体系统。

服务限流:限制系统的输入和输出达到保护系统的目的,例如:限制请求速率,超出的请求不处理或者暂缓处理或降级处理。

本文介绍的服务熔断组件是Hystrix。

本文的操作是在 微服务负载均衡实践 的基础上进行。

环境说明

jdk1.8

maven3.6.3

mysql8

spring cloud2021.0.8

spring boot2.7.12

idea2022

步骤

在请求的接口类使用hystrix的服务熔断
1.添加依赖

在order-service里添加依赖

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

在spring cloud 的2021.0.8版本里,找不到netflix-hystrix了,引入依赖需要单独添加版本号

2.激活hystrix

在order-service启动类上方添加注解@EnableHystrix注解

@EnableHystrix
public class OrderApplication {

3.降级处理

修改OrderController类

(1)在OrderController添加降级方法

/*** 降级方法*  和需要受到保护的方法的 返回值一致、方法参数一致*/
public Product orderFallBack(Long id){Product product = new Product();product.setProductName("触发降级方法");return product;
}

(2)在需要受到保护的方法上使用@HystrixCommand配置

/*** 使用注解配置熔断保护*   fallbackmethod:配置熔断之后的降级方法*/
@HystrixCommand(fallbackMethod = "orderFallBack")
@RequestMapping(value = "/buy/{id}", method = RequestMethod.GET)
public Product findById(@PathVariable Long id){

4.模拟网络延迟

在product-service的服务方法,添加2秒睡眠时间

		try {Thread.sleep(2000l);//模拟网络延迟} catch (InterruptedException e) {throw new RuntimeException(e);}

5.Hystrix配置

order-service的application.yml中添加如下配置

hystrix:command:default:execution:isolation:strategy: ExecutionIsolationStrategy.SEMAPHORE #信号量隔离#strategy: # ExecutionIsolationStrategy.THREAD 线程池隔离thread:timeoutInMilliseconds: 2000 #默认的连接超时时间1秒,若1秒没有返回数据,自动的触发降级逻辑circuitBreaker:requestVolumeThreshold: 5 #触发熔断的最小请求次数,默认20 /10秒sleepWindowInMilliseconds: 10000 #熔断多少秒后去尝试请求 默认 5   打开状态的时间errorThresholdPercentage: 50 #触发熔断的失败请求最小占比,默认50%

6.测试

启动eureka、product、order服务

浏览器访问

http://localhost:9002/order/buy/1

因为product服务方法里模拟请求网络延迟,设置有2s的睡眠时间,加上到数据库请求数据的一些耗时过程,总的请求时间将大于2s,而线程超时时间设置为2s,所以会触发降级方法。

把线程超时时间调大,例如:调整为6秒

重新启动order-service,浏览访问测试,能正常访问到数据。

7.统一的降级方法

如果每个方法都写一个降级方法,方法多的时候,很麻烦,可以统一指定降级方法。

修改OrderController类,添加统一降级方法

	/*** 指定统一的降级方法*   注意方法没有参数*/public Product defaultFallBack(){Product product = new Product();product.setProductName("触发统一的降级方法");return product;}

在OrderController类上方添加@DefaultProperties注解

@DefaultProperties(defaultFallback = "defaultFallBack")
public class OrderController {

修改findById方法上方的@HystrixCommand注解,将
@HystrixCommand(fallbackMethod = "orderFallBack")
改为
@HystrixCommand

修改order-service的application.yml配置,将线程超时时间改为2000

重启order服务

测试

触发了统一的降级方法,说明统一的服务降级方法生效。

Feign结合hystrix的服务熔断
1.复制服务

复制order-service得到order-service-feign_hystrix(注意:在idea里直接复制会有问题。在文件资源管理器里复制才不会出现问题。

修改order-service-feign_hystrix的pom.xml,修改artifactId为如下

<artifactId>order-service-feign_hystrix</artifactId>

在父工程pom.xml添加一个模块

<module>order-service-feign_hystrix</module>

在order-service-feign_hystrix服务操作

2.feign中开启hystrix及相关配置

修改order-service-feign_hystrix服务application.yml在Fegin中开启hystrix

# 在feign中开启hystrix熔断
feign:circuitbreaker:enabled: true

修改 端口号及服务名称

server:port: 9003
spring:application:name: service-order-feign_hustrix

hystrix设置

hystrix:command:default:execution:isolation:thread:timeoutInMilliseconds: 2000 #默认的连接超时时间1秒,若1秒没有返回数据,自动的触发降级逻辑circuitBreaker:enabled: truerequestVolumeThreshold: 5errorThresholdPercentage: 10sleepWindowInMilliseconds: 10000
3.接口实现类中实现降级逻辑

编写接口实现类,编写熔断降级方法

package org.example.order.feign;import org.example.order.entity.Product;
import org.springframework.stereotype.Component;@Component
public class ProductFeginClientCallBack implements ProductFeignClient{/*** 降级方法*/@Overridepublic Product findById(Long id) {Product product = new Product();product.setProductName("触发Feign熔断降级方法");return product;}
}
4.接口注解申明降级类

修改ProductFeignClient接口类

@FeignClient添加使用降级的方法所在的类 fallback = ProductFeginClientCallBack.class

@FeignClient(name = "service-product", fallback = ProductFeginClientCallBack.class)
public interface ProductFeignClient {/*** 配置需要调用的微服务接口* @return*/@RequestMapping(value = "/product/{id}", method = RequestMethod.GET)Product findById(@PathVariable("id") Long id);
}
5.注释或删除之前的Hystrix相关代码

注释或删除启动类的@EnableHystrix注解

//@EnableHystrix
public class OrderApplication {

注释或删除OrderController之前的Hystrix相关的内容

6.启动及测试

启动eureka、product、order(9003)服务

浏览器访问

http://localhost:9003/order/buy/1

请求响应时间超过线程时间限制,触发了Feign熔断降级方法。

修改order的application.yml配置文件,设置线程超时时间为6000毫秒

重启order(9003)服务

浏览器访问

返回时间小于设置的超时时间,不触发降级方法,返回正常数据。

Feign实现服务熔断总结:

1.配置添加开启服务熔断,并设置hystrix超时参数

2.添加ProductFeignClient接口的实现类,在实现类里实现降级逻辑。

3.在ProductFeignClient接口类中的注解声明降级类

hystrix监控

如何才能了解断路器中的状态呢?hystrix监控可以做到这一点。

在order-service操作

1.导入依赖
        <!--监控--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId><version>2.2.10.RELEASE</version></dependency>

2.启用HystrixDashboard监控

在启动类上方添加@EnableHystrixDashboard注解

@EnableHystrixDashboard
public class OrderApplication {

3.启动服务

启动eureka、product、order服务

4.初步测试

浏览器访问

http://localhost:9002/hystrix

http://localhost:9002/actuator

返回的数据格式化后,如下:

{"_links": {"self": {"href": "http://localhost:9002/actuator","templated": false},"health": {"href": "http://localhost:9002/actuator/health","templated": false},"health-path": {"href": "http://localhost:9002/actuator/health/{*path}","templated": true}}
}

6.修改配置

修改order服务的application.yml

给actuator暴露端点

# 给actuator暴露端点
management:endpoints:web:exposure:include: "*"

注意:隔离设置为线程池隔离

hystrix:command:default:execution:isolation:
#          strategy: SEMAPHORE #信号量隔离strategy: THREAD #线程池隔离

 配置允许的主机

hystrix:dashboard:proxy-stream-allow-list: localhost
7.测试

重启order服务

浏览器访问

http://localhost:9002/actuator/hystrix.stream

正常可以看到持续输出ping: 

浏览器访问

http://localhost:9002/hystrix

在Hystrix Dashboard页面输入框中,填写

http://localhost:9002/actuator/hystrix.stream

点击Monitor Stream

此时Circuit和Threads Pools都是loading状态,还没有具体数据

访问一次9002的服务

http://localhost:9002/order/buy/1

查看hystrix的dashboard,有数据了。

 

访问多次

http://localhost:9002/order/buy/1

看到监控页面,有折线图,表示触发熔断的情况

各指标的含义

断路器的三种状态:Closed、Open、Half Open

Closed(关闭):

    所有请求都可以正常访问

Open(开启)

    所有请求都会进入降级方法中

Half Open(半开)

    维持Open状态一段时间(5s)后,断路器进入半开状态,尝试释放一个请求到远程微服务,如果服务访问正常,断路器就进入Closed状态,如果不能访问,继续保存Open状态5s。

完成!enjoy it!

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

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

相关文章

【C语言】优化通讯录管理系统

大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家优化上一篇的通讯录&#xff0c;如果你觉得我写的还不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 目录 一. 前言二. 动态通讯录2.1 通讯录结构体2.2 初始化通讯录2.3 增加联系人2.4 销毁通讯…

Redis原理-IO模型和持久化

高性能IO模型 为什么单线程Redis能那么快 一方面&#xff0c;Redis 的大部分操作在内存上完成&#xff0c;再加上它采用了高效的数据结构&#xff0c;例如哈希表和跳表&#xff0c;这是它实现高性能的一个重要原因。另一方面&#xff0c;就是 Redis 采用了多路复用机制&#…

HTML简单实现v-if与v-for与v-model

Vue启动&#xff01;&#xff01; 首先VIewModel将View和Model连接一起&#xff0c;Model的数据改变View的数据也变 使用Visual Studio Code 启动Vue需要vue.js插件和导入CDN(包) vue.js插件&#xff1a;CTRL shift x 在搜索栏搜 索vue.js安装即可 CDN&#xff1a; http…

orb-slam3编译手册(Ubuntu20.04)

orb-slam3编译手册&#xff08;Ubuntu20.04&#xff09; 一、环境要求1.安装git2.安装g3.安装CMake4.安装vi编辑器 二、源代码下载三、依赖库下载1.Eigen安装2.Pangolin安装3.opencv安装4.安装Python & libssl-dev5.安装boost库 三、安装orb-slam3四、数据集下载及测试 写在…

k8s集群升级

目录 1. 部署cri-docker &#xff08;所有集群节点&#xff09; 2. 升级master节点 3. 升级worker节点 4. 部署containerd 1. 部署cri-docker &#xff08;所有集群节点&#xff09; k8s从1.24版本开始移除了dockershim&#xff0c;所以需要安装cri-docker插件才能使用docker …

MySQL6:索引使用原则,联合索引,联合主键/复合主键,覆盖索引、什么是回表?索引条件下推,索引的创建与使用,索引的创建与使用,索引失效

MySQL6&#xff1a;索引使用原则&#xff0c;联合索引&#xff0c;联合主键/复合主键&#xff0c;覆盖索引、什么是回表&#xff1f;索引条件下推&#xff0c;索引的创建与使用&#xff0c;索引的创建与使用&#xff0c;索引失效 索引使用原则列的离散(sdn)度 联合索引创建联合…

Harbor私有镜像仓库搭建

本文基于&#xff1a;https://zhuanlan.zhihu.com/p/143779176 1.环境准备 IP&#xff1a;192.168.10.136/24 操作系统:centos7 2.安装Docker、Docker-compose 2.1安装Docker-CE $ wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.re…

数据库简史:多主数据库架构的由来和华为参天引擎的机遇

注&#xff1a;本文发表后&#xff0c;收到了很多后台反馈&#xff0c;其中关于大型机的早期成就不容省略。微调重发本文&#xff0c;纯属个人观点&#xff0c;错谬之处&#xff0c;仍然期待指正。 2023年10月13日&#xff0c;在北京举办的“2023金融业数据库技术大会"上&…

redis6.0源码分析:跳表skiplist

文章目录 前言什么是跳表跳表&#xff08;redis实现&#xff09;的空间复杂度相关定义 跳表&#xff08;redis实现&#xff09;相关操作创建跳表插入节点查找节点删除节点 前言 太长不看版 跳跃表是有序集合zset的底层实现之一&#xff0c; 除此之外它在 Redis 中没有其他应用。…

电力巡检/电力抢修行业解决方案:AI+视频技术助力解决巡检监管难题

一、行业背景 随着国民经济的蓬勃发展&#xff0c;工业用电和居民用电需求迅速增加&#xff0c;电厂、变电站、输电线路高负荷运转&#xff0c;一旦某个节点发生故障&#xff0c;对生产、生活造成巨大的影响。目前电力行业生产现场人员、设备较多&#xff0c;而生产监督员有限…

基于vue小红书平台用户数据分析与可视化

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…

【马蹄集】—— 搜索专题

搜索专题 目录 MT2238 数的增殖MT2239 二维矩阵中的最长下降序列MT2240 传染病MT2241 循环空间BD202303 第五维度 MT2238 数的增殖 难度&#xff1a;黄金    时间限制&#xff1a;1秒    占用内存&#xff1a;128M 题目描述 给定一个数 n ( n < 1000 ) n (n<1000) n…

Java I/O (输入/输出)

1.流的概念 流是一种有序的数据序列&#xff0c;根据操作类型&#xff0c;可以分为输入流和输出流两种。I/O流&#xff08;输入输出&#xff09;提供了一条通道程序&#xff0c;可以使用这条通道把源中的字节序列送到目的地。 1.1 输入流&#xff1a; 程序从指向源的输入流中读…

51单片机汽车胎压大气气压测量仪仿真设计_数码管显示(代码+仿真+设计报告+讲解)

51单片机汽车胎压大气气压测量仪仿真设计_数码管显示 (代码仿真设计报告讲解) 仿真原版本&#xff1a;proteus 7.8 程序编译器&#xff1a;keil 4/keil 5 编程语言&#xff1a;C语言 设计编号&#xff1a;S0018 目录 51单片机汽车胎压大气气压测量仪仿真设计_数码管显示功…

技术分享| anyRTC低延时直播优化

直播系统就是把活动现场的音频或视频信号经数字压缩后&#xff0c;传送到直播多媒体服务器(CDN)上&#xff0c;在互联网上供广大网友或授权特定人群收听或收看。而随着技术的日益更新&#xff0c;人民对于直播的互动性&#xff0c;实时性要求更高了&#xff0c;传统的直播少则几…

React-表单受控绑定和获取Dom元素

一、表单受控组件 1.声明一个react状态 说明&#xff1a;useState const [value,setValue]useState("") 2.核心绑定流程 2.1绑定react状态 <div><input value{value}type"text"></input> 2.2绑定onChange事件 说明&#xff1a;e.…

队列(Queue)概念+通过单、双链表来模拟队列+环形队列+OJ面试题(用队列实现栈、用栈实现队列、设计环形队列)

文章目录 队列(Queue)一、 概念1.尾进头出 二、模拟队列1.单链表实现队列1.1 设置结点1.2 入队offer1.3出队 poll1.4 empty方法&#xff0c;peek方法&#xff0c;getUsedSize方法 2.双链表实现队列2.1 创建结点2.2 入队列2.3 出队列2.4 peek、size、isEmpty方法 三、环形队列1.…

vivo自研AI大模型即将问世,智能手机行业加速迈向AI时代

当前&#xff0c;以大模型为代表的人工智能技术已发展为新一轮科技革命和产业变革的重要驱动力量&#xff0c;被视作推动经济社会发展的关键增长极。 AI大模型潮起&#xff0c;千行百业走向百舸争流的AI创新应用期&#xff0c;前沿信息技术向手机、PC、车机等消费级终端加速渗…

AJAX原理及介绍

文章目录 AJAX&#xff08;Asynchronous Javascript And Xml&#xff09;传统请求及缺点AJAX概述XMLHttpRequest对象AJAX GET请求AJAX GET请求的缓存问题AJAX POST请求基于JSON的数据交换基于XML的数据交换AJAX乱码问题AJAX的异步与同步AJAX代码封装AJAX实现省市联动AJAX跨域问…

[Unity][VR]透视开发系列3-Passthrough应用的真机测试方法

【视频讲解】 视频讲解地址请关注我的B站。 专栏后期会有一些不公开的高阶实战内容或是更细节的指导内容。 B站地址: https://www.bilibili.com/video/BV1Zg4y1w7fZ/ 我还有一些免费和收费课程在网易云课堂(大徐VR课堂): https://study.163.com/provider/480000002282025/…