Go Engineering - Foundation - CLI
CLI
Cobra 很好地集成了 Pflag 和 Viper
工具包
用途
Pflag
命令行参数解析
Viper
配置文件解析
Cobra
命令行框架
Pflag
Pflag 通过创建 Flag 和 FlagSet 来使用,使用 Pflag 的开源项目:Kubernetes、Istio、Helm、Docker、Etcd
Flag
一个命令行参数会被解析成一个 Flag 类型的变量
1234567891011121314// A Flag represents the state of a flag.type Flag struct { Name string // name as it appears on command line Shorthand string // one-letter abbreviated flag Usage string // help message V ...
Go Engineering - Foundation - Log - Package
开源日志包标准库 log 包
标准库自带,无需安装
只提供 Print、Panic、Fatal 函数用于日志输出
Go 标准库大量使用了该 log 包
glog
Kubernetes 使用的 klog 是基于 glog 进行封装
Google 推出的轻量级日志包
特性
支持 4 种日志级别: Info、Warning、Error、Fatal
支持命令行选项
支持根据文件大小切割日志文件
支持日志按级别分类输出
支持 V level – 开发者自定义日志级别
支持 vmodule – 开发者对不同的文件使用不同的日志级别
支持 traceLocation – 打印指定位置的栈信息
logrus
Github star 数量最多的日志包,Docker 和 Prometheus 也在使用 logrus
支持常用的日志级别
可扩展:允许使用者通过 Hook 的方式,将日志分发到任意地方
支持自定义的日志格式:内置支持 JSON 和 TEXT
结构化日志记录:Field 机制允许使用者自定义字段
预设日志字段:Default Field 机制,可以给一部分或者全部日志统一添加共同的日志字段
Fa ...
Go Engineering - Foundation - Log - Design
功能需求基础功能
支持基本的日志信息:时间戳、文件名、行号、日志级别、日志内容
支持不同的日志级别:Trace(可选)、Debug、Info、Warn、Error、Panic(可选)、Fatal
期望级别:glog.Info("This is info message")
开关级别:glog -v=4,只有日志级别高于等于 4 的日志才会被打印
支持自定义配置:不同的运行环境,需要不同的日志输出配置,在不重新编译代码的情况下,改变记录日志的行为
支持输出到标准输出(实时读取)和本地文件(采集索引)
高级功能
支持多种日志格式:TEXT、JSON
按日志级别分类输出:至少 Error 级别的日志输出到独立的文件中
支持结构化日志:使用 JSON 或者其它编码方式使日志结构化
支持日志轮转:借助 Linux Logrotate 来完成,不在日志包中实现
具备 Hook 能力
例如:当 Error 级别的日志产生时,发送邮件或者调用告警接口进行告警
日志告警的最佳方案:通过旁路功能,将日志采集到第三方组件(如 ES),日志包功能应尽量内聚
1234567891011121314 ...
Go Engineering - Foundation - Error - Package
功能需求
支持错误堆栈
支持不同的打印格式,例如 %+v、%v、%s 等
支持 Wrap/Unwrap 功能:在已有 error 的基础上,追加一些新的信息
errors.Wrap(err, "open file failed")
调用 Wrap 时,会生成一个错误堆栈节点
支持 Is 方法:判断某个 error 是否为指定的 error
Go 1.13 之前,并没有 wrapping error
if err == os.ErrNotExist {}
有 wrapping error 后,直接用 == 判断会有问题,因为可能是 wrapping error
func Is(err, target error) bool
err 和 target 是同一个
当 err 是 wrapping error 时,target 包含在这个嵌套 error 链中
支持 As 函数
Go 1.13 之前,并没有 wrapping error,可以使用 type assertion 或者 type switch
if perr, ok := err.(* ...
Go Engineering - Foundation - Error - Code
设计方式
场景:用户账号没有找到
200
HTTP Code 通常代表的是 HTTP Transport 层的状态信息;但对性能有一定的影响,因为需要解析 HTTP Body
12345678{ "error": { "message": "Syntax error \"Field picture specified more than once. This is only possible before version 2.1\" at character 23: id,name,picture,picture", "type": "OAuthException", "code": 2500, "fbtrace_id": "xxxxxxxxxxx" }}
4xx + 简单信息
可以让客户端快速感知请求失败,但提供的信息过于简单,不能准确地定位问题
12 ...
Go Engineering - Foundation - API Doc
Swagger
Swagger 是一套围绕 OpenAPI 规范构建的开源工具,可以设计、构建、编写和使用 REST API
Swagger 工具
Swagger Editor
基于浏览器的编辑器,可以在其中编写 OpenAPI 规范,并实时预览 API 文档
Swagger UI
将 OpenAPI 规范呈现为交互式的 API 文档,并可以在浏览器中尝试 API 调用
Swagger Codegen
根据 OpenAPI 规范,生成服务器存根和客户端代码库
Swagger vs OpenAPI
OpenAPI 是一个 API 规范,前身也叫 Swagger 规范
通过定义一种用来描述 API 格式或者 API 定义的语言,来规范 RESTful 服务开发过程
目前最新的 OpenAPI 规范是 OpenAPI 3.0 (即 Swagger 2.0)
OpenAPI 规范定义了一个 API 必须包含的基本信息
描述、路径和操作、输入输出参数、验证方法等
OpenAPI 是一个 API 规范,而 Swagger 是实现规范的工具
go-swagger特性
基于代码注释自动生成 S ...
Go Engineering - Foundation - Linting
golangci-lint 优点
速度快
基于 gometalinter 开发,平均速度比 gometalinter 快 5 倍
并行检查代码 + 复用 go build 缓存 + 缓存分析结果
可配置
支持 YAML 格式的配置文件
IDE 集成
VS Code + Goland
Linter 聚合器
集成了很多 Linter,无需单独安装,并且支持自定义 Linter
最小误报数
调整了所集成的 Linter 的默认设置,大幅减少误报
良好的输出
检查出问题的源码文件、行号和错误行内容
不符合检查规则的原因
报错的 Linter
更迭速度快
不断有新的 Linter 被集成进来
使用者:Google、Facebook、Istio、Red Hat OpenShift 等
golangci-lint 命令
cache123456789$ golangci-lint cache statusDir: /Users/zhongmingmao/Library/Caches/golangci-lintSize: 1.9MiB$ golangci-lint cache clean$ ...