切換語言為:簡體

GoLang 環境變數與配置

  • 爱糖宝
  • 2024-06-10
  • 2084
  • 0
  • 0

在程式語言中環境變數與配置是相輔相成的。不同環境載入不同的配置成爲了必需品。

一、開始

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 等配置進行配置。

0則評論

您的電子郵件等資訊不會被公開,以下所有項目均必填

OK! You can skip this field.