在编程语言中环境变量与配置是相辅相成的。不同环境加载不同的配置成为了必需品。
一、开始
1.1) 为什么需要配置和环境变量?
- 配置更好的管理项目的,集中式的管理项目,会使得项目更好维护。
- 环境变量是与代码进行解耦,更好的维护。
- 项目部署切换环境方便。
1.2) build 会将哪些内容打包到二进制
- go 文件
- 依赖的go文件
- embed 嵌入文件
配置文件不是嵌入的,不会加入配置文件。
1.3) 哪些内容会需要配置
- 数据库
- 秘钥
- 服务器端口
- 环境变量
- 路径
- 特殊标识符(调试标识符)
- 缓存、消息队列
- 第三方服务
- 定时任务
- 分布式系统配置
- 监控系统
- 日志统计
- ...
二、配置
- viper 是 go 中出名的配置工具库
三、设置系统环境变量
sh
复制代码
set GO_ENV=production myapp.exe #!/bin/bash export GO_ENV=test && ./myapp
四、环境变量 dotenv
适合在开发环境:
- 安装
sh
复制代码
go get -u github.com/joho/godotenv
- 创建一个配置文件:
sh
复制代码
touch config.yml # config/config.yml
- 一个配置文件示例:
yml
复制代码
server: port: 8090 db: user: admin password: secret url: 'https://db'
配置并使用
sh
复制代码
package main import ( "fmt" "github.com/spf13/viper" ) func main() { println("hello world!") GetConfig() } func GetConfig() { viper.SetConfigName("config") viper.SetConfigType("yml") viper.AddConfigPath("./config") err := viper.ReadInConfig() if err != nil { panic(fmt.Errorf("Fatal Error config: file: %w \n", err)) } fmt.Println("Server Port: ", viper.GetInt("server.port")) fmt.Println("Database User: ", viper.GetString("db.user")) }
五、生产环境
systemd
systemd
是一套用于启动和管理系统进程的系统和服务管理器。
systemd
能够通过 systemctl
和 配置文件
对服务进行控制:
- 配置文件位置:
/etc/systemd/system/
目录下。 systemctl
命令,以下是一些常用的命令
命令 | 作用 |
---|---|
sudo systemctl start <unit> | 启动指定的服务或其他 unit |
sudo systemctl stop <unit> | 停止指定的服务或其他 unit |
sudo systemctl restart <unit> | 重启指定的服务或其他 unit |
sudo systemctl reload <unit> | 重新加载指定的服务配置 |
sudo systemctl enable <unit> | 启用服务开机自启动 |
sudo systemctl disable <unit> | 禁用服务开机自启动 |
sudo systemctl status <unit> | 查看指定服务或其他 unit 的状态 |
sudo systemctl daemon-reload | 重新加载 systemd 管理器配置 |
- 配置示例
ini
复制代码
[Unit] Description=My App Service After=network.target [Service] ExecStart=/path/to/myapp ExecReload=/path/to/myapp reload ExecStop=/path/to/myapp stop Restart=always Environment="GO_ENV=production" EnvironmentFile=-/etc/myapp/env [Install] WantedBy=multi-user.target
配置文件是一个 ini
文件。Service
下的 Environment
/EnvironmentFile
配置环境变量相关的内容。
六、docker
6.1) dockerfile
Dockerfile
复制代码
FROM golang:1.16 ENV GO_ENV=production ENV DATABASE_URL=postgres://user:password@localhost:5432/proddb WORKDIR /app COPY . . RUN go mod download RUN go build -o myapp . EXPOSE 8080 CMD ["./myapp"]
6.2) docker-compose
compose
复制代码
version: '3' services: myapp: image: myapp:latest environment: - GO_ENV=production - DATABASE_URL=postgres://user:password@db:5432/proddb ports: - "8080:8080"
6.3) k8s
- deployment.yaml
yaml
复制代码
apiVersion: apps/v1 kind: Deployment metadata: name: myapp spec: replicas: 2 selector: matchLabels: app: myapp template: metadata: labels: app: myapp spec: containers: - name: myapp image: myapp:latest env: - name: GO_ENV value: "production" - name: DATABASE_URL value: "postgres://user:password@db:5432/proddb" ports: - containerPort: 8080
七、小结
本文主要介绍 go 中项目环境变量和配置文件处理方式,环境变量可以通过系统级配置,可以通过 env 配置,在环境多采用 docker 等配置进行配置。