熊喵君的博客

Thinking will not overcome fear but action will.

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 再看 Dock...

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

微服务基础之链路追踪(OpenTracing)

Opentracing 的基础理论介绍

0x00 背景    在微服务项目的构建中,存在这样一种场景,当对项目组件进行微服务化拆分后,一个客户端发起的请求将会经过多个微服务模块处理之后再返回,假如在请求的链路上某个服务出现访问故障时,(如何)排查故障将会比较困难。一种排查方式是,需要将请求经过的服务,挨个分析日志,查看是否是请求故障的原因,这种方式无疑是十分低效的。为了解决这种场景,调用链(OpenTracing)技术应运而生。 ...

使用 Golang 开发 generator(生成器)

生成器:一种程序逻辑优化的思路

0x00 简介    Python 中提供了 yield 关键字,用以实现生成器(generator)的功能。如下,计算 fibonacci 数的生成器: def fib(max): n,a,b =0,0,1 while n < max: yield b a,b =b,a+b n = n+1 return '...

gRPC 中的 Metadata

0x00 前言 写这篇文章的初衷是,在研究 Opentracing 中,出现了大量涉及到 Metadata 的代码,特此总结下。 gRPC 的 Metadata 简单理解,就是 Http 的 Header 中的 key-value 对 Metadata 是以 key-value 的形式存储数据的,其中 key 是 string 类型,而 value 是 []string,即...

Go-Redis 连接池(Pool)源码分析

分析一款典型的 redis 连接池实现

0x00 介绍 连接池技术,一般是客户端侧高效管理和复用连接,避免重复创建(带来的性能损耗,特别是 TLS)和销毁连接的一种技术手段。在项目中灵活使用连接池,对降低服务器负载十分有帮助;此外,在司内的 DB 托管场景,如遇后台升配、代理扩容等场景,如果服务内置了连接池,若Redis集群升级变更,一般服务不需要重启(因为连接池会自动尝试重建)。如 go-xorm 的 连接池、go-red...