GoLang 环境变量与配置

本文涉及的产品
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
云原生内存数据库 Tair,内存型 2GB
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: 编程语言中的环境变量和配置管理是关键,Go 项目中配置文件不被打包,需通过环境变量解耦代码。

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

一、开始

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


转载来源:https://juejin.cn/post/7378328335036071975

相关文章
|
10月前
|
存储 Go 数据安全/隐私保护
Golang 语言怎么使用 Viper 管理配置信息?(下)
Golang 语言怎么使用 Viper 管理配置信息?(下)
44 0
|
3月前
|
Go
【微信公众号】基于golang的公众号开发基本配置
【微信公众号】基于golang的公众号开发基本配置
61 0
|
9月前
|
存储 算法 安全
Golang 实现对配置文件加密
Golang 实现对配置文件加密
|
3月前
|
人工智能 JSON 监控
探索Viper-适用于GoLang的完整配置解决方案
探索Viper-适用于GoLang的完整配置解决方案
|
3月前
|
Go
golang学习3,golang 项目中配置gin的web框架
golang学习3,golang 项目中配置gin的web框架
|
3月前
|
Go
golang学习2,golang开发配置国内镜像
golang学习2,golang开发配置国内镜像
|
10月前
|
存储 JSON 监控
Golang 语言怎么使用 Viper 管理配置信息?(上)
Golang 语言怎么使用 Viper 管理配置信息?
37 1
|
3月前
|
Go Windows
win10 golang下载安装,及环境变量配置
鄙人之前是使用mac做golang开发的,后来换了台图形工作站,用了windows的系统,因此只得从头下载golang安装,及进行环境变量的配置。比较方便的一点是,之前在mac osx上码的golang代码不用再敲上一遍了,因为golang可以跨平台运行,可以直接从mac上的golang代码复制到windows系统上即可。
75 1
|
9月前
|
IDE Linux Go
Golang安装和配置指南:从零开始的高效开发之旅
Golang安装和配置指南:从零开始的高效开发之旅
|
关系型数据库 MySQL Go
[Golang]你真的搞懂go数据库配置中parseTIme=True和loc = Local的含义吗?
[Golang]你真的搞懂go数据库配置中parseTIme=True和loc = Local的含义吗?