熊喵君的博客

Thinking will not overcome fear but action will.

开源限流组件分析(二):Golang-time/rate 限速算法实现分析

分析 Golang 标准库提供的令牌桶限流器

0x00 前言 这篇文章来分析下标准库 time/rate 的使用及实现细节,此库同样基于令牌桶(Token Bucket)实现了限流。 0x01 time/rate 的使用 创建限流器 使用 NewLimiter(r Limit, b int) 创建限速器,令牌桶容量为 b。初始化状态下桶是满的,即桶里装有 b 个令牌,以后再以每秒往里面填充 r 个令牌。有两种特例: 允许...

微服务基础之限流(RateLimit)

限流的基础概念

0x00 微服务中的限流 本篇博客来介绍下微服务中的服务限流(Ratelimit),它是保证服务稳定的基础组件之一。其他类似的概念还有服务熔断。微服务中的限流主要指业务代码的逻辑限流。 通常,限流策略相较于熔断,使用的更为广泛一些,因为限流的同时可以对其他(被限制)服务请求进行排队处理,而不是像熔断策略直接拒绝掉这些被限制的请求。当然了,简单的处理方式就是被限制的流量,可以根据具体的业...

开源限流组件分析(三):JuJu-Ratelimit 限速算法实现分析

分析一款基于令牌桶实现的限速算法

0x00 前言 这篇文章来分析下 juju-ratelimit 的使用及实现细节,这个 Golang 的项目基于 Token Bucket 实现了限流。核心的逻辑就两点: (初始化)生产令牌桶 消费令牌的接口 0x01 核心结构 Clock 结构 对 time 相关接口的封装,主要提供产生当前时间 // Clock represents the passage of...

微服务基础之熔断保护(Breaker)

熔断器机制基础

0x00 前言 什么是熔断器 / Breaker?    熔断器是为了当依赖的服务已经出现故障时,主动阻止对依赖服务的请求(通常情况下是执行本地的服务降级办法,亦或直接返回错误),从而保证自身服务的正常运行不受依赖服务影响,防止雪崩效应。 在实现上,它的思路是在调用方 Caller 增加一种 “避让” 机制,当下游出现异常时能够停止(熔断)对下游的继续请求,当等待一段时间后缓慢放...

理解 Hystrix-go 中的 RollingCount 实现

0x00 前言   Hystrix-go 中实现接口错误率计算的数据结构,是一个非常典型的 RollingCount + 滑动窗口实现的计数桶(更专业一点的称呼:时间序列数据库)。这篇文章来分析下其代码实现。其主要的功能 实现代码 在此。 0x01 滑动窗口    默认的统计控制器 DefaultMetricCollector 保存着熔断器的所有状态,成功次数(successes),调用...

一个 Http(s) 反向代理(网关)的实现分析

如何使用几百行代码实现一个高可用的反向代理服务

0x00 前言 本篇文章主要是对先前阅读过一篇关于 http-gateway 实现的文章的总结:Let’s Create a Simple Load Balancer With Go 的小结。 0x01 目标拆解 我们从要实现的功能及目标出发,来拆解一个 高可用 的(反向代理)网关,需要支持哪些功能? 从架构图来看,我们将网关划分为控制平面(control plane...

Kratos 源码分析:分析 Warden 框架 Dynamic-WRR 负载均衡算法的实现

Warden 框架中的 WRR 算法代码分析

0x00 前言 回顾下在先前的文章 gRPC 源码分析之官方 Picker 实现 中,分析过实现自定义 gRPC Balancer 算法的三个步骤: 注册 Balancer 的名字 实现 PickerBuild 及 Builder() 方法,用于当 resolver 解析器发生解析变更时(后端节点增删)时,更新 Picker 使用的 LoadBalance-Pool 实现 P...

Golang 中的 sync.Pool 使用

调优系列:Golang 优化系列之临时对象池

0x00 前言 当多个 goroutine 都需要创建同⼀个对象的时候,如果 goroutine 数过多,导致对象的创建数⽬剧增,进⽽导致 GC 压⼒增大。形成并发⼤ --> 占⽤内存⼤ --> GC 缓慢 --> 处理并发能⼒降低 --> 并发更⼤这样的恶性循环。 在这个时候,需要有⼀个对象池,每个 goroutine 不再⾃⼰单独创建对象,⽽是从对象池中获取出⼀...

Golang 中网络编程开源项目汇总(持续更新)

我们可以从开源项目中学习到什么(二)

Tcp脚手架 Zinx:基于Golang轻量级TCP并发服务器框架 link:Go语言网络层脚手架 gnet:gnet 是一个高性能、轻量级、非阻塞的事件驱动 Go 网络框架。 Web 相关 WSP:golang webserver framework, simple and flexible PUSH 长连接 connsvr:golang 实现的长连接服务...

Golang 高性能 LocalCache:BigCache 设计与分析

如何在 Golang 构建一个高性能的本地缓存

0x00 前言 通常在 Golang 中,缓存的实现离不开如下几种: 原生 map sync.Map 基于以上二者封装的复合型 map 前两者的缺点也很明显: 当 map 中存在大量 keys 时,GC 扫描 map 产生的停顿将不能忽略(针对 map 中存储指针或数据类型底层也是由指针实现这样的场景) 加锁的粒度 基于较新版本的 Golang(大于 1...