0%

CLI

Cobra 很好地集成了 Pflag 和 Viper

工具包 用途
Pflag 命令行参数解析
Viper 配置文件解析
Cobra 命令行框架

Pflag

Pflag 通过创建 FlagFlagSet 来使用,使用 Pflag 的开源项目:Kubernetes、Istio、Helm、Docker、Etcd

Flag

一个命令行参数会被解析成一个 Flag 类型的变量

Read more »

开源日志包

标准库 log 包

标准库自带,无需安装

  1. 只提供 PrintPanicFatal 函数用于日志输出
  2. Go 标准库大量使用了该 log 包

glog

Kubernetes 使用的 klog 是基于 glog 进行封装

  1. Google 推出的轻量级日志包
  2. 特性
    • 支持 4 种日志级别: InfoWarningErrorFatal
    • 支持命令行选项
    • 支持根据文件大小切割日志文件
    • 支持日志按级别分类输出
    • 支持 V level – 开发者自定义日志级别
    • 支持 vmodule – 开发者对不同的文件使用不同的日志级别
    • 支持 traceLocation – 打印指定位置的栈信息
Read more »

功能需求

基础功能

  1. 支持基本的日志信息:时间戳文件名行号日志级别日志内容
  2. 支持不同的日志级别:Trace(可选)、DebugInfoWarnErrorPanic(可选)、Fatal
    • 期望级别:glog.Info("This is info message")
    • 开关级别:glog -v=4,只有日志级别高于等于 4 的日志才会被打印
  3. 支持自定义配置:不同的运行环境,需要不同的日志输出配置,在不重新编译代码的情况下,改变记录日志的行为
  4. 支持输出到标准输出(实时读取)和本地文件(采集索引)

bb1356bd3cf332ddeb30d3aef8fc8d2b

Read more »

功能需求

  1. 支持错误堆栈
  2. 支持不同的打印格式,例如 %+v%v%s
  3. 支持 Wrap/Unwrap 功能:在已有 error 的基础上,追加一些新的信息
    • errors.Wrap(err, "open file failed")
    • 调用 Wrap 时,会生成一个错误堆栈节点
  4. 支持 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 链
  5. 支持 As 函数
    • Go 1.13 之前,并没有 wrapping error,可以使用 type assertion 或者 type switch
      • if perr, ok := err.(*os.PathError); ok {}
    • 有 wrapping error 时
      • var perr *os.PathError
      • if errors.As(err, &perr) {}
  6. 支持两种错误创建方式
    • errors.New("file not found")
    • errors.Errorf("file %s not found", "iam-apiserver")
Read more »

设计方式

场景:用户账号没有找到

200

HTTP Code 通常代表的是 HTTP Transport 层的状态信息;但对性能有一定的影响,因为需要解析 HTTP Body

1
2
3
4
5
6
7
8
{
"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"
}
}
Read more »

Swagger

  1. Swagger 是一套围绕 OpenAPI 规范构建的开源工具,可以设计、构建、编写和使用 REST API
  2. Swagger 工具
    • Swagger Editor
      • 基于浏览器的编辑器,可以在其中编写 OpenAPI 规范,并实时预览 API 文档
    • Swagger UI
      • OpenAPI 规范呈现为交互式的 API 文档,并可以在浏览器中尝试 API 调用
    • Swagger Codegen
      • 根据 OpenAPI 规范,生成服务器存根客户端代码库
Read more »

golangci-lint 优点

  1. 速度快
    • 基于 gometalinter 开发,平均速度比 gometalinter 快 5
    • 并行检查代码 + 复用 go build 缓存 + 缓存分析结果
  2. 可配置
    • 支持 YAML 格式的配置文件
  3. IDE 集成
    • VS Code + Goland
  4. Linter 聚合器
    • 集成了很多 Linter,无需单独安装,并且支持自定义 Linter
  5. 最小误报数
    • 调整了所集成的 Linter 的默认设置,大幅减少误报
  6. 良好的输出
    • 检查出问题的源码文件行号错误行内容
    • 不符合检查规则的原因
    • 报错的 Linter
  7. 更迭速度快
    • 不断有新的 Linter 被集成进来
    • 使用者:Google、Facebook、Istio、Red Hat OpenShift 等
Read more »

使用

  1. 先编写 Makefile 文件,指定整个项目的编译规则,然后通过 Linux make 命令来解析该 Makefile 文件,实现自动化
  2. 默认情况下,make 命令会在当前目录下,按照 GNUmakefile、makefile、Makefile(推荐)的顺序查找
    • make -f golang.mk 或者 make --file golang.mk

规则

  1. 规则一般由目标依赖命令组成,用来指定源文件编译的先后顺序
  2. Makefile 规则可以自动判断是否需要重新编译某个目标,从而确保目标仅在需要时编译

规则语法

主要包括:targetprerequisitescommand

1
2
3
4
target ...: prerequisites ...
command
...
...
Read more »