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