Go工程化:配置及包管理

项目配置

静态配置

  • 不允许在线变更的配置
  • 主要是一些中间件的连接信息,如MySQL,Redis,GRPC
  • 变更配置通常会走一次完整的发版流程

动态配置

  • 需要根据据特定的场景和时机调整的配置
  • 配置平台
  • 结合etcd等中间件来实现

环境变量

  • 全平台统一,或具有强制性
  • 在容器启动时直接写道容器的环境变量

常量配置

  • 长时间都不会变更
  • 直接定义到常量中
  • 避免维护过多的配置项

配置设计的一些经验技巧

  • 中间件的配置可以提供统一的封装库和配置模板来统一和约束
  • 配置值的范围需要进行合理性校验,确保在枚举范围内
  • 配置项的命名尽可能语义化,并尽可能体现配置使用的单位

语义化命名的配置

  • timeout vs http_request_timeout

  • http_request_timeout vs http_request_timeout_seconds

  • 配置项的变更也需要review

  • 不使用的配置及时从代码中移除

  • 记录配置的操作和变更历史,提供可回滚能力

  • 敏感配置是不允许直接硬编码到代码中的

  • 敏感配置禁止一切形式的输出和打印

  • 严格控制配置的访问权限

配置的读取工具

  • https://github.com/spf13/viper

包管理方式

GOPATH

src、bin、pkg 目录
使用go get 命令获取到的库,放置在src目录,bin目录放置编译好的文件,pkg目录放置预编译的文件,版本控制困难

vendor

Go1.5+引入vendor管理方式,依赖于GOPATH,从GOPATH中获取依赖到自己项目的vendor目录

Go Module

像java的maven,支持代理和私有仓库。无需将项目代码放入GOPATH的src。
Go Module使用:1.设置Go env,2.使用go mod初始化工程,3.编写工程代码同步依赖

  • export GO111MODULE=on
  • export GOPROXY=https://goproxy.cn/
  • export GOPRIVATE=*gitee.com

导入本地的依赖包

  • 新建一个gomod-demo1的包
  • 在gomod-demo工程中使用gomod-demo1
  • replace imooc.com.demo1 => …/gomod-demo1

go.mod中每个关键字的具体含义

  • module:定义当前项目的模块路径
  • go:标识当前模块的Go语言版本
  • requiere:说明Module需要什么版本的依赖
  • replace:导入源码,在import时会被后者代替
  • exclude:排除指定依赖包

如何管理内部私有包

  • 用于沉淀一些公共包给企业的不同项目使用
  • 避免重复造轮子,统一使用规范
  • 配置GOPRIVATE=*私有仓库域名,不走go proxy

Go module的包校验

  • 为了防止Go module中的包被篡改
  • go.sum文件保存了依赖包的hash值
  • GOPRIVATE包将不会做checksum校验

go mod vendor 生成vendor目录,做离线编译

Reference
慕课网:面向海量数据场景构建Go+ES8企业级搜索微服务

你可能感兴趣的:(Go,golang,数据库)