golang 微服务中的断路器 hystrix 小案例

news2024/12/26 23:38:15

上次我们分享了 Hystrix 具体流程,作为断路器实现,我们如何将 hystrix 用在我们的项目代码中呢?

我们可以简单的将 hystrix-go 下载下来

go get github.com/afex/hystrix-go/hystrix

代码会放到我们的 GOPATH 中,的 pkg 下面,例如我的 window 路径是这样的

go\pkg\mod\github.com\afex\hystrix-go@v0.0.0-20180502004556-fa1af6a1f4f5\hystrix

代码目录是酱紫的:

我们来看一下基本代码逻辑,屡一下:

初始化配置

hystrix.ConfigureCommand(CircuitBreakerName, hystrix.CommandConfig{
		Timeout:                1000, 
		MaxConcurrentRequests:  5,
		RequestVolumeThreshold: 3,
		SleepWindow:            2000,
		ErrorPercentThreshold:  20,
	})

可以看到 \go\pkg\mod\github.com\afex\hystrix-go@v0.0.0-20180502004556-fa1af6a1f4f5\hystrix\settings.go

中会有这个结构体定义的默认值

解释一下上述默认值代表的意思

  • Timeout

指的是,命令执行的超时时间

远程调用逻辑执行超过该时间将被强制执行超时,就进行失败回滚中 , 默认是 1000 毫秒

  • MaxConcurrentRequests

最大并发请求数

表示每个 hystrix 命令最大执行的并发协程,用于进行流量控制和资源隔离

当同种的 hystrix 执行的并发数量超过了该值,请求将会直接进入到失败回滚逻辑中,并被标记为拒绝请求上报

  • RequestVolumeThreshold

最小请求阈值

只有滑动窗口时间内的请求数量超过该值,断路器才会执行对应的判断逻辑

在低请求量的时候,断路器是不会发生效应的,即时这些请求全部失败,因为他只要没有超过这个值,就不会触发

  • SleepWindow

超时窗口时间,指的是断路器打开 SleepWindow 时长后,进入半开状态

重新允许远程调用的发生,试探下游服务是否恢复正常

如果接下来的请求都是成功的,那么断路器会关闭,否则就会重新打开

  • ErrorPercentThreshold

指的是,错误比例阈值

当滑动窗口时间内的错误请求频率超过这个值的时候,断路器也会打开

小案例

我们写一个小案例,来使用这个hystrix

  • 配置 hystrix

  • new 一个 hystrix , NewStreamHandler
hystrixStreamHandler := hystrix.NewStreamHandler()
hystrixStreamHandler.Start()
  • 开一个 http 服务器,来专门来访问 掘金主页
  • 使用 wrk 性能测试工具来 打一下 我们的 服务器
    • wrk -c200 -t8 -d40 --latency http://127.0.0.1:9999/juejin

这个性能测试指令的意思是:

  • 开启 200个连接
  • 8个线程
  • 测试 40 s

性能测试小工具的使用可以查看文章 :性能测试小工具 wrk 可以怎么用

package main

import (
	"errors"
	"fmt"
	"github.com/afex/hystrix-go/hystrix"
	"github.com/gin-gonic/gin"
	"net/http"
)

// http  /juejin 具体执行的逻辑

func CircuitBreakerTest(ctx *gin.Context) {
	hystrix.Do("xiaomotong", func() error {
		ctx.Next()
		code := ctx.Writer.Status()
		if code != http.StatusOK {
			return errors.New(fmt.Sprintf(" 状态码是 : %d", code))
		}
		return nil

	}, func(err error) error {
		if err != nil {

			fmt.Printf("断路器检测到错误: %s\n", err.Error())
			// 返回熔断错误
			ctx.JSON(http.StatusServiceUnavailable, gin.H{
				"msg": err.Error(),
			})
		}
		return nil
	})
}

// 整个包的初始化, 初始化 hystrix
func init() {
	hystrix.ConfigureCommand("xiaomotong", hystrix.CommandConfig{
		Timeout:                1000,
		MaxConcurrentRequests:  5,
		RequestVolumeThreshold: 5,
		SleepWindow:            5000,
		ErrorPercentThreshold:  20,
	})
}

func main() {
	hystrixStreamHandler := hystrix.NewStreamHandler()

	hystrixStreamHandler.Start()

	go http.ListenAndServe(":9999", hystrixStreamHandler)
	r := gin.Default()
	gin.SetMode(gin.ReleaseMode)

	r.GET("/juejin", func(c *gin.Context) {

		_, err := http.Get("https://juejin.cn/")
		if err != nil {
			c.JSON(http.StatusInternalServerError, gin.H{"msg": err.Error()})
			return
		}

		c.JSON(http.StatusOK, gin.H{"msg": "success"})
	}, CircuitBreakerTest)

	r.Run(":9999")
}

使用 wrk 工具,打了之后,我们可以看到服务器的打印效果如下:

出现上述打印,说明,已经达到了最大并发请求数

继续往下看

看到如上错误,说明断路器已经打开了,这个时候来的请求一律拒绝,就不会再去访问 掘金的网站了

等待 SleepWindow 超时窗口时间后,会进入到半开状态,这个时候,若再有请求,并且全都成功,那么断路器就会关闭掉

具体的源码分析,我们可以下篇娓娓道来

今天就到这里,学习所得,若有偏差,还请斧正

欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

好了,本次就到这里

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

我是阿兵云原生,欢迎点赞关注收藏,下次见~

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

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

相关文章

用vue-full-calendar实现酒店预定管理展示

文章目录 前言一、关于vue-full-calendar二、使用步骤1. 引入库2. 使用库3. 开始编码4. 实际效果图展示5. 点击弹窗展示6. 弹窗展示效果图 总结 前言 近些天有位做酒店业务朋友问到我,有没有前端比较好用的预定日历查看插件,实际上我也没有研究过&#…

【板栗糖GIS】——如何良好的导出并批量管理kindle上的笔记

【板栗糖GIS】——如何良好的导出并批量管理kindle上的笔记 目录 1.将Kindle Mate安装到电脑上 2. 将kindle通过usb线连接到电脑。 3. 打开Kindle Mate软件,按F2自动导入笔记 4. 选择导出方式 5. 笔记修饰 1.将Kindle Mate安装到电脑上 下载地址:…

网络安全保姆级教程,别再说你学不会了

开始,在选择软件系统方面。很多人会纠结于是使用Linux还是Windows或者Mac系统。 虽然Linux系统看起来很酷,但对于新手来说并不是很友好。 同样,Windows系统也可以通过使用虚拟机装靶机进行学习。所以,直接用window,学…

【Windows安全】授权初探:访问控制基础及应用

▒ 目录 ▒ 🛫 导读需求开发环境 1️⃣ 常见名词及缩写汇总主体对象权限(规则) 2️⃣ 常见概念访问控制及安全级别访问令牌(Access tokens)特权 (Privilege) - 线程相关的安全描述符(Security Descriptors,SD)访问控制…

批判马斯洛需求层次模型

再次批判马斯洛需求层次模型,有啥缺陷? 趣讲大白话:文化不同,心理不同 【趣讲信息科技182期】 **************************** 每个民族的文化心理结构都不一样 常常低估文化对人的影响 有一门心理学分支,文化心理学 专…

(转载)免疫优化算法在物流配送中心选址中的应用(matlab实现)

12.1 理论基础 12.1.1 物流中心选址问题 随着世界经济的快速发展以及现代科学技术的进步,物流业作为国民经济的一个新兴服务部门,正在全球范围内迅速发展。物流业的发展给社会的生产和管理、人们的生活和就业乃至政府的职能以及社会的法律制度等都带来…

Vue前端压缩图片后上传,拍照上传最佳实践

文章目录 一、前言二、使用shrinkpng进行图片压缩2.1 安装依赖包2.2 引入包2.3 开始编码 总结 一、前言 最近有一个需求,通过手机拍照后上传图片到服务器,大家应该都知道,现在的手机像素实在是太高了,随便拍一张都是10M以上&…

移动应用架构同React Native、Flutter有什么关系?

移动应用架构描述了设计和构建应用的模式与技术。 该架构可以提供构建应用时应遵循的路线图和最佳实践,构建一个结构合理的应用。 移动应用的常见层次结构包括用户界面层、业务逻辑层、数据访问层,但是随着跨平台开发框架的不断发展,以React…

从TCP协议到TCP通信的各种异常现象和分析

很多人总觉得学习TCP/IP协议没什么用,觉得日常编程开发只需要知道socket接口怎么用就可以了。如果大家定位过线上问题就会知道,实际上并非如此。如果应用在局域网内,且设备一切正常的情况下可能确实如此,但如果一旦出现诸如中间交…

Zigbee Install code的使用和CRC的计算

Zigbee Install code的使用和CRC的计算 前言什么是Install codes?Zigbee install codes的格式CRC算法信息:python演示:Install Code的使用:烧录Install codes到Silicon labs EFR32设备中去安装代码文件格式烧录Install codes:核查…

【学习笔记】【万字长文】linux三剑客学习笔记

前言 ​ 上班以后用到的服务器大多数是centos的,很多命令会用一部分但稍微复杂一点的只能问度娘了。 ​ 时间长了,还是没积攒下什么本事,每次都需要百度查找。 ​ 终于有时间整理一篇关于linux三剑客的笔记,作为记录方便以后查…

项目经验分享:LVGL编程举例

本文介绍如何在成功移植LVGL的基础之上,编写自己的LVGL GUI程序。 文章目录 1. LVGL组件简介与LVGL仿真1.1 LVGL组件1.2 LVGL仿真 2. 代码结构3. 编程目标4. 编程前的准备5. LVGL编程基础5.1 简单示例代码5.2 设置组件位置5.3 图片的显示5.4 组件的事件响应5.5 设置…

【P46】JMeter 响应断言(Response Assertion)

文章目录 一、响应断言(Response Assertion) 参数说明二、准备工作三、测试计划设计3.1、包括3.2、匹配3.3、相等3.4、字符串3.5、字符串3.6、或者 一、响应断言(Response Assertion) 参数说明 可以对 Jmeter 取样器的响应消息进…

0x10 会话服务 DiagnosticSessionControl

0x10 会话服务 相当是一种分类,通过控制会话模式,使用不同的服务。应始终只有一个诊断会话在服务器中处于活动状态。 服务器应在启动时始终启动默认的诊断会话。 如果没有启动其他诊断会话,则只要服务器通电,默认诊断会话就应该运…

Hudi(五)集成Flink(3)

12、离线compaction MOR表的compaction默认是自动打开的,策略是5个commits执行一次压缩。因为压缩操作比较耗费内存,和写流程放在同一个pipeline,在数据量比较大的时候(10w/sqps),容易干扰写流程&#xff0…

LLM:LoRA: Low-Rank Adaptation of Large Language Models

随着模型规模的不断扩大,微调模型的所有参数(所谓full fine-tuning)的可行性变得越来越低。以GPT-3的175B参数为例,每增加一个新领域就需要完整微调一个新模型,代价和成本很高。 为解决微调大规模语言模型到不同领域和…

西南交通大学智能监测 培训课程练习3

2023.05.31培训 task1:MybatisPlus的使用 task2:SpringMVC常用接口开发 task3:JSON、接口测试 task4:SpringMVC拦截器与过滤器 目录 一、MybatisPlus 1.1DO类 1.2Mapper接口 1.3编写测试类测试 1.4Mybatis和MybatisPlus 二、…

Verilog学习笔记(串口RS232,基于野火教程)

目录 一、串口简介 二、设计与实现 串口数据回环顶层模块设计 串口接收模块uart_rx 串口发送模块uart_tx 顶层模块rs32_top 三、上板验证 一、串口简介 其中SPI和I2C为同步通信接口,双方时钟频率相同。而UART属于异步通信接口,没有统一时钟&…

旅游网项目(SpringBoot2.7.1 + SpringMVC + Mybatis-Plus3.5.0)

技术选型 JAVA版本:JDK17 数据库:Mysql5.7Navicat 后端框架:SpringBoot3.0.6 SpringMVC Mybatis-Plus3.5.0 权限控制:SpringSecurity 前端框架:AdminLTE2 模板引擎:Thymeleaf 工具类:发…