熊喵君的博客

Thinking will not overcome fear but action will.

一个 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 不再⾃⼰单独创建对象,⽽是从对象池中获取出⼀...

Golang 中网络编程开源项目汇总(持续更新)

我们可以从开源项目中学习到什么(二)

Tcp脚手架 Zinx:基于Golang轻量级TCP并发服务器框架 link:Go语言网络层脚手架 gnet:gnet 是一个高性能、轻量级、非阻塞的事件驱动 Go 网络框架。 Web 相关 WSP:golang webserver framework, simple and flexible PUSH 长连接 connsvr:golang 实现的长连接服务...

Golang 高性能 LocalCache:BigCache 设计与分析

如何在 Golang 构建一个高性能的本地缓存

0x00 前言 通常在 Golang 中,缓存的实现离不开如下几种: 原生 map sync.Map 基于以上二者封装的复合型 map 前两者的缺点也很明显: 当 map 中存在大量 keys 时,GC 扫描 map 产生的停顿将不能忽略(针对 map 中存储指针或数据类型底层也是由指针实现这样的场景) 加锁的粒度 基于较新版本的 Golang(大于 1...

gRPC 微服务构建之日志(Logging)

zap库应用及使用 gRPC 实现zap日志拦截器(With Tracing)

0x00 前言    结构化日志对于后台项目的重要性不言而喻,通常调试、记录运行错误及基于日志关键字的监控都会需要后台提供足够充分的日志。Golang 中有非常多优秀的日志库,如 Zap 和 Logus 等。这篇文章分享下在项目中,如何将 Zap 和 gRPC 完美的融合在一起,保证日志的可读性和高效,同时也兼顾了性能。 0x01 Zap 库介绍 Zap 库满足了常见日志库的所...

Go-Micro 微服务框架使用入门

Go-Mirco 框架之基础

0x00 介绍 Go-Micro:是一个 Pure Golang 的微服务开发框架(旧版本 nitro):官方介绍如下 Micro is built as a microservices architecture and abstracts away the complexity of the underlying infrastructure. We compose this ...

Uber-Automaxprocs 分析

Docker 中的 CPU 调度总结

0x00 前言    前一篇文章 GOMAXPROCS 的坑,简单描述了 GOMAXPROCS 在容器场景可能会出现的问题。解决方法是使用 Uber 提供的 Automaxprocs 包,自动的根据 CGROUP 值识别容器的 CPU quota,并自动设置 GOMAXPROCS 线程数量,本篇文章就简答分析下 Automaxprocs 是如何做到做一点的 0x01 再看 Docker 中...

GOMAXPROCS 的坑

容器环境中使用 runtime.GOMAXPROCS 需谨慎

0x00 前言 自 Go 1.5 开始, Go 的 GOMAXPROCS 默认值已经设置为 CPU 的核数, 这允许我们的 Golang 程序充分使用机器的每一个 CPU, 最大程度的提高我们程序的并发性能。 0x01 CPU Affinity    熟系 Linux 后台开发的朋友都知道 CPU 亲和性(CPU Affinity)。CPU Affinity 是一种调度属性,它...

gRPC Interceptor:go-grpc-middleware 介绍与使用

优秀的 gRPC 开源中间件实现:go-grpc-middleware

0x00 前言    Interceptor 机制极大的扩展了 gRPC 的功能。注意,服务器只能配置一个 Unary interceptor 和 Stream interceptor,否则会报错。客户端也类似,虽然不会报错,但是只有最后一个才起作用。 如果你想配置多个,可以使用这个 chain.go。 0x01 开源的 Interceptor    本文介绍的开源项目 grp...