熊喵君的博客

Thinking will not overcome fear but action will.

bytes.Buffer 源码分析及应用

0x00 前言 本文分析下 golang 标准库 bytes.Buffer 的实现(本文基于 go1.17 版本的实现分析) 笔者在给 ssh 网关增加终端解析功能中大量使用了 bytes.Buffer 这个结构,bytes.Buffer 是 Golang 标准库 []byte 缓冲区(流式缓冲区),具有读写方法和可变大小的字节存储功能。缓冲区的零值是一个待使用的空缓冲区。可以持续向...

go-redis/cache 库分析与使用

0x00 前言 go-redis/cache 是一个小而精悍的项目,实现了本地缓存配合 redis(远端缓存)的高性能 cache,可借鉴的地方两点(以 V8 版本分析): 缓存CRUD的操作语义(本地 / 远程) singleflight 机制的应用 如果value比较大, 可以考虑启用压缩 如果缓存数据量比较大, 并且对性能有要求的场景, 可以尝试使用msgpack代...

Golang 闭包与递归:介绍与应用场景

Golang closure

0x00 前言 笔者近期项目中,实现了通过 JSON 协议模拟会话目录及文件的树型结构的操作,用到了 Golang 的递归与闭包。闭包是指内层函数引用了外层函数中的变量或称为引用了自由变量的函数,其返回值也是一个函数(方法),先看例子: func outer(x int) func(int) int { return func(y int) int { ...

Golang 并发:如何优雅实现并发 goroutine 若干细节

Golang errorgroup 应用(续)

0x00 前言 0x01 SizedWaitGroup机制 SizedWaitGroup在sync.WaitGroup基础上增加了并发启动的goroutines的数量限制特性,即SizedWaitGroup增加了限制同时启动例程的最大数量的功能,使用方法如下: import ( "fmt" "math/rand" "time" ...

Singleflight:原理与应用(续)

如何安全且正确的使用 singleflight

0x00 前言 前文 微服务中的缓存(一):Cache 使用与优化 介绍过 singleflight 的应用场景之解决缓存失效时的并发穿透场景。本文就笔者项目中对 Singleflight 机制的实际使用再做一次总结。先回顾下 singleflight 的定义: SingleFlight 是 Go 开发组提供的一个扩展并发原语。它的作用是在处理多个 goroutine 同时调用同一个函数的...

OpenSSH Certificate 与 Golang 的兼容性问题

0x00 前言 前文 OpenSSH Certificate 证书最佳实践 介绍了证书的实践,不过近期笔者在工作中遇到了非常麻烦的兼容性问题,这里摘录几个: x/crypto/ssh: “ssh-rsa-cert-v01@openssh.com” does not work for sshd OpenSSH 7.2-7.7 #58371 x/crypto/ssh: cann...

再看认证流程

TLS(HTTPS)、OpenSSH 协议的那些细节

0x00 前言 本文梳理下 TLS(HTTPS)、OpenSSH 在握手协议上的一些细节 DH 协议 握手协议的共享密钥的计算基础 0x01 HTTPS 认证 分为 HTTPS 单向认证和双向认证,以双向认证为例(下面第三步不验证客户端证书则为单向认证),流程如下: 第一阶段:协商,客户端发送 hello 消息,会包含自己能支持的最大支持的 TLS 版本,一个...

Golang 中的 GC 小结

gc 场景及原理总结

0x00 前言 本文的版本基于 go version go1.21.3 linux/amd64 0x01 gc 典型触发场景汇总 Golang 的 GC 会自动回收所有不可达对象(无引用链可访问的对象)。经典场景包括局部变量、重新赋值的变量、循环临时变量等。仅在需要优化内存敏感代码时,才考虑手动干预(如手动置 nil 或使用对象池) 1、局部变量(函数内创建的对象),函数内的...

微服务中的缓存(四):内存缓存使用的一些技巧

记录项目中遇到的问题及解决方案

0x00 前言 本文梳理下笔者在项目开发中使用过一些内存缓存的技巧 0x01 双缓冲:double buffering 有一个场景是,存在某一本地文件配置(修改少),程序初始化时把文件内容读取到本地内存里(假设为 map1),由于程序逻辑需要频繁且高性能的读取 map1(尽量不加锁),在这种背景下如何实现安全的修改文件自动同步到 map 里(且不加锁)?有两种思路: 分段锁 ...

Mysql:Session && Transaction

Mysql 基础回顾:会话与事务

0x00 前言 会话(Session): 指客户端与 MySQL 服务器之间的一个连接。当客户端连接到 MySQL 服务器时,服务器会为客户端分配一个会话。会话是数据库操作的基本单位,每个会话都有一个唯一的 ID。在会话中,用户可以执行 SQL 语句来查询和修改数据。会话可以持续很长时间,直到客户端断开与服务器的连接。 事务(Transaction):事务是数据库...