熊喵君的博客

Thinking will not overcome fear but action will.

Kratos 源码分析:CGI 框架 BM (一)

分析基于 gin 改造的框架 blademaster:基础

0x00 前言 blademaster 是 Kratos 提供的 HTTP 框架,参考 gin 实现,但剥离了 gin 中的若干代码。其官方介绍是:基于 gin 二次开发,具有快速、灵活的特点,可以方便的开发中间件处理通用或特殊逻辑,Bm 基础库默认实现了 Log/Tracing/Metrics/BBR-Limiter 等,此外还提供了带熔断器的 Client 实现,非常实用。 0x...

基于 Golang 实现的负载均衡网关:gobetween 分析(一)

分析一款 Golang 实现的四层代理 CLB:主要逻辑

0x00 前言 前面分析过一款简单的反向代理实现:一个 Http(s) 网关的实现分析,这篇文章分析一款商用的 LB 开源项目:gobetween。它是一款 Pure-Golang 实现的四层代理网关,文档在此,本文来探索下其实现及核心的源码分析。 For a long time all of us have been using “traditional” load bala...

Golang 标准库:net/http 分析(一)

net/http 客户端之 transport 分析

0x00 前言 net/http 实现了 HTTP 客户端和服务端,分别对应 http.RoundTripper 和 http.Handler 两个接口。 http.RoundTripper:用来表示执行 HTTP 请求的接口,调用方将请求作为参数可以获取请求对应的响应 http.Handler 主要用于 HTTP 服务器响应客户端的请求 http.RoundTrippe...

分布式限流:基于 Redis 实现

基于 Redis 实现的分布式限流方案总结

0x00 前言 本文梳理下基于 Redis 实现的分布式限流的策略和算法。这里主要关注 分布式 的场景,主要的实现算法有如下几类: 计数器限流 固定时间窗口限流 滑动时间窗口限流 漏桶限流 令牌桶限流 0x01 Why Redis && Lua? 在一个分布式系统中,存在多个微服务提供服务。所以当瞬间的流量同时访问同一个资源,如何让计数器在分...

gRPC 客户端长连接机制实现及 keepalive 分析

如何实现针对 gRPC 客户端的自动重连机制

0x00 前言 HTTP2 是一个全双工的流式协议, 服务端也可以主动 ping 客户端, 且服务端还会有一些检测连接可用性和控制客户端 ping 包频率的配置。gRPC 就是采用 HTTP2 来作为其基础通信模式的,所以默认的 gRPC 客户端都是长连接。 有这么一种场景,需要客户端和服务端保持持久的长连接,即无论服务端、客户端异常断开或重启,长连接都要具备重试保活(当然前提是两方...

Golang Web/RPC 框架中的设计模式

装饰器模式及 Pipeline 模式回顾

0x00 前言 这篇文章想聊聊,在使用 gRPC 和 Gin 框架中,理解到的设计模式。主要有下面几个: 装饰器模式 Pipeline 模式 0x01 基础回顾 1、 装饰器模式 装饰器模式,是一种动态地往一个类中添加新的行为的设计模式。就功能而言,修饰模式相比生成子类更为灵活,这样可以给某个对象而不是整个类添加一些功能。 看起来像洋葱一样, 洋葱内部最嫩最核心的时...

Golang TCP 并发服务器框架:Zinx

一个基于 Golang 轻量级 TCP 并发服务器框架分析

0x00 前言 zinx的开发文档基本上描述的很详细了,对初学者比较友好。笔者先前基于reactor模型实现过一个TCP网络框架tcpframe,要点是: 多进程模型 Reactor反应堆模式,基于事件驱动的循环 基于TLV的协议通信,避免粘包 本文就以上面3个维度分析下zinx网络框架的实现的核心思路。 0x01 zinx的架构 0x02 代码分析...

Go-redis with Metrics:关键指标采集

魔改 go-redis 实现 Metrcis + Prometheus 关键指标上报

0x00 前言 本文总结下,工作中使用 go-redis 库的一些高级用法。 0x01 回调钩子 WrapProcess V7 版本之前提供了 WrapProcess 和 WrapProcessPipeline 方法,用于在 RedisAPI 执行方法前后进行自定义处理,下面的例子中,使用 time.Since() 来计算 Redis 操作的耗时代码: 注意:err := ol...

分布式一致性 hash 算法的实现分析

ketama 算法分析与应用

0x00 前言 在工作中,遇到过如下几种需要分布式一致的场景: 分布式一致的缓存系统 gRPC的基于一致性算法的loadbalance实现,某些业务场景下,需要尽可能使指定客户端的请求经由consistent-hash算法到达指定的服务器进行处理 分布式crontab中,如何实现多机运行独占性任务 consistent-hash 的应用场景 consistent-...

GoIM 源码分析(四):一些细节

GOIM

0x00 前言 0x01 数据结构:Ring Ring的使用场景 Ring本质上是一个环形缓冲区,其中保存的是空闲的protocol.Proto对象,主要用于长连接下TCP数据的拆包封包(每个连接都会初始化自己的Ring结构) 为什么要设计如此的结构呢?这里有个issue,思考下,长连接的场景,连接上不断有报文收发,使用一个可复用协议包体的数据结构是一个不错的优化手段(避免...