熊喵君的博客

Thinking will not overcome fear but action will.

OpenSSH Certificate 证书最佳实践

How Do We USE OpenSSH Certificate Properly?

0x00 前言 针对零信任安全领域的 SSH 服务器安全管控,OpenSSH 的证书体系绝对是最佳的安全选择。上一篇文章 证书(Certificate)的那些事 简单介绍了 OpenSSH 的证书体系。本文针对 OpenSSH Certificate 的应用做一个系统的梳理。大概涉及到如下几个方面,本文中 Certificate 代指 OpenSSH 证书: Certificat...

Golang 并发模型:Pipelines and cancellation

Channel 的经典应用(基础)

0x00 前言 Go Concurrency Patterns: Pipelines and cancellation 一文介绍了 Golang 的最经典的并发及控制模型:Pipeline(流水线模型),基于 Channel 的生产者消费者模型。本文即整理及总结。 文中给出了几个典型 goroutine 的并发及控制场景: Squaring numbers:计算平方数 Fa...

开源限流组件分析(二):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 不再⾃⼰单独创建对象,⽽是从对象池中获取出⼀...