熊喵君的博客

Thinking will not overcome fear but action will.

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...

Kratos 源码分析:Naming 解析(下)

分析 Warden 中对 Naming 的调用及实例应用

0x00 前言 上一篇文章:Kratos 源码分析:Naming 解析(上),分析了 Kratos 的 Naming 实现机制。 从宏观上来看,Naming 的实现就是统一(提供)通用服务注册中心的接口,使得调用方可以屏蔽不同注册中心的接口差异。 本篇文章继续分析下 Warden 框架是如何将 Naming 接口与 gPRC 接口封装在一起的。warden 的 服务发现模块,用于从底层...

Kratos 源码分析:熔断器 Breaker

分析 Kratos 的熔断器实现

0x00 前言 熔断器是为了当依赖的服务已经出现故障时,主动阻止对依赖服务的请求。保证自身服务的正常运行不受依赖服务影响,防止雪崩效应。本篇文章来分析下 Kratos 中的熔断器实现及应用。 Kratos 内置 breaker 的组件 一般情况下直接使用 Kratos 的组件时都自带了熔断逻辑,并且在提供了对应的 breaker 配置项。目前在 Kratos 内集成熔断器的组件有: ...

Kratos 源码分析:限流器 Limiter

分析 Kratos 的 BBR 限流器实现

0x00 前言 限流是当服务负载(或 Qps)超过一定量级(Load)时,主动丢弃一部分请求,是保护服务路径核心系统不被拖垮的常用方案。是服务端常用的一种过载保护的手段。有几个知识点: little’s Law:利特尔法则,估算系统的最大吞吐量 系统最大吞吐量的计算 EWMA:指数加权移动平均法 0x01 传统限流方法 VS BBR 限流 little法则:预估系统...

Kratos 源码分析:Ecode 错误代码

分析 Kratos 的 Error-code

0x00 背景 本篇文章来分析下 Kratos 对错误码的封装(HTTP && RPC)。一般而言,错误码封装的方式: 整形值的错误码 错误码对应的出错信息 HTTP 或 RPC 的方便定义 错误码,一般被用来进行异常传递,且需要具有携带 message 文案信息的能力。 0x01 Kratos 的错误码使用 先从用例入手,然后再简单分析下 ecode 内...

Kratos 源码分析:ORM 之 Mysql 的封装

分析 Kratos 的数据库 MYSQL-API

0x00 前言 本篇文章来分析下 Kratos 中的 Mysql 接口封装,主要是对 go-sql-driver 此库的封装。在其中加入了 Metrics 统计、Tracing 及熔断机制嵌入的实现。思路非常的清晰,代码主要集中在 sql.go 以及 mysql.go 中。 0x01 go-sql-driver/mysql 基础使用 database/sql 与 go-sql-driver...

golang-LRU 缓存设计与实现

分析 一款高性能的本地缓存开源组件 CCache

0x00 开篇 ccache 是笔者在项目中经常使用的一款 Local-Cache 的高性能组件,作为常用的性能优化手段,选择此库是因为它有如下的特点: Value 是 interface{} 类型,支持结构化存储 支持 LRU 算法的 Key 淘汰机制,LRU链记录访问时间顺序,通常使用list.List实现 支持多级 Cache,如 LayeredCache 和 Se...

一个轻量级的 golang 协程池的实现

使用 Golang-channel 实现工作池:批量并发处理

0x00 前言 网络上有非常多优秀的协程池实现及原理介绍,推荐阅读下面的链接: fasthttp 的 协程池实现 Goroutine 并发调度模型深度解析之手撸一个高性能 goroutine 池 本文介绍如何实现 goroutine 与 Channel 机制实现一套通用的协程池,用来控制并发执行的安全性,同时提升效率。 0x01 Goroutine 高并发的问题 ...