Go工程化:配置及包管理

  • Post author:
  • Post category:其他




项目配置


静态配置

  • 不允许在线变更的配置
  • 主要是一些中间件的连接信息,如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企业级搜索微服务



版权声明:本文为dawnto原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。