1、阐述

systemd 是一个 系统和服务管理器,用于初始化系统、管理用户空间服务、处理服务依赖关系,并提供强大的日志管理功能

核心特点:

  • 并行启动:支持多服务的并行启动,提高启动速度
  • 依赖关系管理:自动处理服务之间的依赖关系
  • 单一二进制文件:通过 systemctl 管理所有服务、目标、设备等
  • 日志系统:通过 journald 提供统一的日志收集和查看功能
  • 套接字激活:支持按需启动服务,减少资源浪费
  • 服务状态监控:可以自动重启崩溃的服务

2、示例

2.1、创建go应用

package main

import (
    "fmt"
    "log"
    "net/http"
    "os"
)

func main() {
    instance := os.Getenv("INSTANCE_NAME") // 从环境变量读取实例名
    port := os.Getenv("APP_PORT")          // 从环境变量读取端口
    if port == "" {
        port = "8080" // 默认端口
    }

    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w, "Hello from instance %s running on port %s\n", instance, port)
        log.Printf("Instance %s handled a request\n", instance)
    })

    log.Printf("Instance %s starting on port %s\n", instance, port)
    log.Fatal(http.ListenAndServe(":"+port, nil))
}

2.2、编译应用

cd /opt/myapp
go build -o myapp main.go

2.3、创建 systemd 服务模板

/etc/systemd/system/ 下创建一个 systemd 服务模板文件 : myapp.service

[root@66c6012ecfd1 system]# cat myapp.service 
[Unit]
Description=MyApp Go Service Instance my-web
After=network.target

[Service]
Type=simple
EnvironmentFile=/etc/myapp.env
ExecStart=/opt/myapp/myapp
Restart=always
User=nobody
Group=nogroup

[Install]
WantedBy=multi-user.target

说明 :

  • EnvironmentFile:指定每个实例的环境变量配置文件
  • ExecStart:启动 Go 应用的路径
  • Restart=always:服务异常退出时自动重启
  • User 和 Group:指定运行服务的用户和组

2.4、创建实例环境文件

/etc/myapp.env

[root@66c6012ecfd1 system]# cat /etc/myapp.env
INSTANCE_NAME=my-web
APP_PORT=8081

2.5、操作

启动
systemctl start myapp.service

停止
systemctl stop myapp.service

开机启动
systemctl enable myapp.service

查看服务日志
journalctl -u myapp.service

journey
32 声望22 粉丝

« 上一篇
JWT入门
下一篇 »
研发模式