熊喵君的博客

Thinking will not overcome fear but action will.

开源限流组件分析(一):Uber 的 Leaky Bucket

分析 Uber 的基于 Leaky Bucket 的限流器

0x00 前言 前一篇文章了解了微服务中限流的基础概念,这篇文章来分析下基于漏桶(Leaky Bucket)的一个典型开源实现 Uber:ratelimit 及其一般应用场景。 0x01 概念回顾 漏桶算法是对计数器算法的一种改进。 漏桶可以看作是一个带有常量服务时间的单服务器队列,如果漏桶(包缓存)溢出,那么数据包会被丢弃。 0x02 Uber-ratelimiter...

Kratos 源码分析:Warden 负载均衡算法之 P2C

分析 Warden 实现的负载均衡算法 P2C(Power of Two Choices)

0x00 前言 Warden 框架默认实现了两种负载均衡算法: WRR:Weight Round Robin(Dynamic) P2C:Power of Two Choice 之前的文章Kratos源码分析:分析 Kratos 中的 Dynamic-Wrr 负载均衡算法的实现,简单分析了WRR算法的实现思路及解决的场景。那么WRR算法存在哪些问题呢? 从B站的实践经验来...

Kratos 源码分析:Metrics 与 Prometheus 的集成与使用

分析 Kratos 的数据指标采集与使用

0x00 前言 前面已经分析过 Kratos 中的滑动窗口及基于滑动窗口实现的 RollingCounter、RollingGauge 实现,主要 代码在此。 这篇文章主要分析如下几点内容: Kratos 中对 Prometheus 接口的集成及封装 Warden 中使用 Metrics 做指标数据上报的拦截器封装 Metrics 的自定义使用 主要引用了这个包 gi...

Kratos 源码分析:Warden 之 gRPC-Server 封装

分析 Warden 的 Server 端封装

0x00 前言 Kratos 的 Warden 框架 server.go 封装了 gRPC 的服务端启动的核心逻辑。 服务端的启动 & 配置流程 拦截器链的 “安装” 顺序 tracer、metrics 以及 limiter 与 grpc.Server 的结合 过载保护实现 0x01 Server 端拦截器 Kratos 的拦截器链实现非常典型,实际项目可...

Kratos 源码分析:Warden 之 gRPC-Client 封装

分析 Warden 的 Client 端封装

0x00 前言 Kratos 的 Warden 框架 client.go 封装了 gRPC 的客户端启动的核心逻辑。 客户端封装的重点在下面几个方面: 客户端启动 & 配置流程 客户端拦截器链的 “安装” 顺序 tracer、metrics 以及 breaker 与 grpc.Client 的结合 客户端的 Naming 和 gRPC 框架结合 客户端调用...

Kratos 源码分析:Errgroup 机制

分析原生的 errgroup 即 Kratos 的 errgroup

0x00 前言 问题一:一般在 Golang 中,直接使用 go 命令字开启子 goroutine 来实现并发,但是直接 go 的话函数是无法对返回数据进行 error 处理的。(go 开启的方法也无返回值)如何实现? 问题二:调用并发的 goroutine 去批量执行 Job,有失败的可能,如何把第一个出错的 goroutine 信息返回给调用端? 通常有几种处理方法: 1、打...

项目中 golang 相关的优化 Case 处理及解决

调优系列:如何使用 Golang 的 Pprof 工具进行内存分析以及 sync.Pool 优化(一)

0x00 前言 pprof 是 Go 的性能分析工具,在程序运行过程中,可以记录程序的运行信息,如 CPU 使用情况、内存使用情况、goroutine 运行情况等。分析性能需要结合具体的场景来看 性能指标 吞吐量:每秒钟可以处理的请求数 响应时间:从客户端发出请求,到收到回包的总耗时 内存使用率 CPU 使用率 IO 使用率 0x01 工具介绍 gol...

GoIM 源码分析(零):总览

分析基于 golang 的高并发的聊天服务器实现

0x00 前言 GoIM 是一款基于长连接的 IM 服务。准备业余时间分析下其实现基础框架及优化思路(先前有部分阅读过,但未总结成文,网上的分析文章也非常多)。 首先,在分析项目源码前,我们思考下 B 站的弹幕场景(本质上是一个 IM,弹幕是实时消息中能被用户看到的内容,还有一部分是系统消息,用来主动触发业务逻辑或行为等): 打开一个 B 站 视频 发送弹幕,弹幕在视频中显示 ...

Prometheus 应用接入:使用 Prometheus 开发 Exporter

如何在项目中使用 Prometheus 及 Exporter 开发基础

0x00 前言 Prometheus 主要用于应用服务的监控,尤其是基于 Docker/Kubernetes 部署的应用服务,这里的监控是服务层面的(细粒度),以 Golang 开发的服务为例,如 runtime 信息,接口延迟,某个操作的延迟及接口调用成功率等等,只要是能够收集的信息,都可以作为 Prometheus 的监控指标。 0x01 应用接入 Prometheus 的应用接...

Kratos 源码分析:Hbase 库封装

分析 Kratos 的 Hbase Client:How to Hook?

0x00 前言 Kratos 库的 Hbase Client,进行封装加入了链路追踪和统计。基于 Golang HBase client 实现。Kratos 对此库进行了部分 Hook,本文来看下这里是如何实现 Hook 机制的。具体有如下几点: 慢操作日志 Tracing Metrcis 0x01 使用 先看下 Hbase Client 的使用方法: func ma...