go 高质量编程与性能调优实践 | 青训营笔记
这是我参与「第五届青训营」笔记创作活动的第4天。
高质量编程
高质量编程是一个比较主观的词,主要可以从三个方面来衡量:简单性、可读性、生产力。
以下是一些 go 语言编码规范:
- 不需要注释实现接口的方法
- 命名时缩略词全大写,比如 ServeHTTP
- 函数名不包含包名的上下文信息,比如 http 包下创建服务的函数可以命名为 Serve,而不是 ServeHTTP,因为这样用户在使用时
http.ServeHTTP() - 尽量保证正常代码路径为最小缩进
- 错误优先使用
errors.New()来创建匿名变量来表示,如果有格式化要求,则使用fmt.Errorf() - 在
fmt.Errorf()中使用关键字%w来将一个错误关联至错误链中 - 除非在程序启动时发生不可逆转的错误时,可以使用 panic ,其他情况不建议使用 panic
以下是一些 go 语言性能优化的建议:
- go 语言提供了 benchmark 工具来进行基准测试
- silce,map 预分配内存
- 一般使用
strings.Builder()进行字符串处理 - 使用空结构体节省内存,比如定义一个 Set,
m := make(map[int]struct{},10) - 使用 atomic 包
性能调优实践
本部分主要介绍了一个性能分析工具 —— pprof
主要可以分为:CPU、堆内存、协程、锁、阻塞、线程创建方面的优化,pprof提供了很方便的工具可以帮助我们定位错误。在线会生成 .dot 图像,可以下载 Graphviz 进行图像的查看。
对于一个实际业务的优化可以分为以下方面:
-
流程
- 建立服务性能评估手段
- 分析性能数据,定位性能瓶颈
- 重点优化项改造
- 优化效果验证
-
建立压测评估链路
- 服务性能评估
- 构造请求流量
- 压测范围
- 性能数据采集
-
分析性能火焰图,定位性能瓶颈
- pprof 火焰图
-
重点优化项分析
- 规范组件库使用
- 高并发场景优化
- 增加代码检查规则避免增量劣化出现
- 优化正确性验证
-
上线验证评估
- 逐步放量,避免出现问题
-
进一步优化,服务整体链路分析
- 规范上游服务调用接口,明确场景需求
- 分析业务流程,通过业务流程优化提升服务性能