GoLang 环境变量与配置

在编程语言中环境变量与配置是相辅相成的。不同环境加载不同的配置成为了必需品。

一、开始

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

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

相关推荐
uzong2 小时前
技术故障复盘模版
后端
GetcharZp2 小时前
基于 Dify + 通义千问的多模态大模型 搭建发票识别 Agent
后端·llm·agent
桦说编程3 小时前
Java 中如何创建不可变类型
java·后端·函数式编程
IT毕设实战小研3 小时前
基于Spring Boot 4s店车辆管理系统 租车管理系统 停车位管理系统 智慧车辆管理系统
java·开发语言·spring boot·后端·spring·毕业设计·课程设计
wyiyiyi3 小时前
【Web后端】Django、flask及其场景——以构建系统原型为例
前端·数据库·后端·python·django·flask
阿华的代码王国4 小时前
【Android】RecyclerView复用CheckBox的异常状态
android·xml·java·前端·后端
Jimmy4 小时前
AI 代理是什么,其有助于我们实现更智能编程
前端·后端·ai编程
AntBlack5 小时前
不当韭菜V1.1 :增强能力 ,辅助构建自己的交易规则
后端·python·pyqt
bobz9655 小时前
pip install 已经不再安全
后端
寻月隐君6 小时前
硬核实战:从零到一,用 Rust 和 Axum 构建高性能聊天服务后端
后端·rust·github