在程式語言中環境變數與配置是相輔相成的。不同環境載入不同的配置成爲了必需品。
一、開始
1.1) 為什麼需要配置和環境變數?
配置更好的管理專案的,集中式的管理專案,會使得專案更好維護。
環境變數是與程式碼進行解耦,更好的維護。
專案部署切換環境方便。
1.2) build 會將哪些內容打包到二進制
go 檔案
依賴的go檔案
embed 嵌入檔案
配置檔案不是嵌入的,不會加入配置檔案。
1.3) 哪些內容會需要配置
資料庫
秘鑰
伺服器埠
環境變數
路徑
特殊識別符號(除錯識別符號)
快取、訊息佇列
第三方服務
定時任務
分散式系統配置
監控系統
日誌統計
...
二、配置
viper 是 go 中出名的配置工具庫
三、設定系統環境變數
set GO_ENV=production myapp.exe #!/bin/bash export GO_ENV=test && ./myapp
四、環境變數 dotenv
適合在開發環境:
安裝
go get -u github.com/joho/godotenv
建立一個配置檔案:
touch config.yml # config/config.yml
一個配置檔案示例:
server: port: 8090 db: user: admin password: secret url: 'https://db'
配置並使用
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 管理器配置 |
配置示例
[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
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
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
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 等配置進行配置。