熊喵君的博客

Thinking will not overcome fear but action will.

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

分析 CGI 框架 blademaster:路由

0x00 前言 本篇文章看下 bm 框架的路由注册及搭配拦截器的路由调用的实现细节。先看下路由是如何注册的。 bm 框架的默认生成 模板: bm 默认创建的 Engine 对象及启动 initRouter 初始化路由的方法及路由(Group)的创建 bm 的 handler 方法 ping 和 howToStart 的定义( handler 方法默认传入 bm 的 Co...

gRPC 应用篇之客户端 Connection Pool

连接池的实现分析 && 是否需要 Tcp/gRPC 客户端连接池 ?&& 通用连接池的实现

0x00 连接池 之前分析过 go-redis 的连接池实现:Go-Redis 连接池(Pool)源码分析,在项目应用中,连接池的最大好处是减少 TCP 建立握手 / 挥手的时间,实现 TCP 连接复用,从而降低通信时延和提高性能。 通常一些高性能中间件都提供了内置的 TCP 连接池,如刚才说的 go-redis,go-sql-driver 等等,关于连接池,一个良好的设计是对用户屏...

基于 Golang 实现的延迟队列的设计与分析(一)

分析美图开源的延迟队列 lmstfy:架构与设计思路

0x00 前言 延迟队列(Delay Queue)任务相关的业务场景如下: 场景一: 在订单系统中,一个用户某个时刻下单之后通常有 30 分钟的时间进行支付,如果 30 分钟之内没有支付成功,那么这个订单需要关闭;此外在未过期之前的 N 分钟需要通知用户进行支付 场景二: 用户某个时刻通过手机远程遥控家里的智能设备,设置在指定的时间(后)进行工作。这时就可以将用户指令发送到延时队列...

基于 Golang 实现的延迟队列的设计与分析(二)

分析美图开源的延迟队列 lmstfy:数据结构与实现

0x00 前言 延迟队列(Delay Queue)任务相关的业务场景如下: 场景一: 在订单系统中,一个用户某个时刻下单之后通常有 30 分钟的时间进行支付,如果 30 分钟之内没有支付成功,那么这个订单需要关闭;此外在未过期之前的 N 分钟需要通知用户进行支付 场景二: 用户某个时刻通过手机远程遥控家里的智能设备,设置在指定的时间(后)进行工作。这时就可以将用户指令发送到延时队列...

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

分析 blademaster 中的拦截器实现及设计

0x00 前言 熟悉 gRPC 的开发者对拦截器 interceptor(中间件)不会陌生,gin 框架也提供了这种能力,下面代码默认启用了 Logger() 和 Recovery() 两个中间件。 func main() { r := gin.Default() r.GET("/ping", func(c *gin.Context) { c.Stri...

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 客户端都是长连接。 有这么一种场景,需要客户端和服务端保持持久的长连接,即无论服务端、客户端异常断开或重启,长连接都要具备重试保活(当然前提是两方...