加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

golang使用信号量热更新

发布时间:2020-12-16 19:13:26 所属栏目:大数据 来源:网络整理
导读:package mainimport ( "encoding/json" "fmt" "io/ioutil" "log" "os" "os/signal" "sync" "syscall")//用json配置测试type Config struct { Test1 string `json:"Test1:` Test2 int `json:"Test1:`}var ( config *Config configLock = new(sync.RWMutex))fu
package main

import (
    "encoding/json"
    "fmt"
    "io/ioutil"
    "log"
    "os"
    "os/signal"
    "sync"
    "syscall"
)

//用json配置测试
type Config struct {
    Test1 string `json:"Test1:`
    Test2 int    `json:"Test1:`
}

var (
    config     *Config
    configLock = new(sync.RWMutex)
)

func loadConfig() bool {
    f,err := ioutil.ReadFile("config.json")
    if err != nil {
        fmt.Println("load config error: ",err)
        return false
    }

    //不同的配置规则,解析复杂度不同
    temp := new(Config)
    err = json.Unmarshal(f,&config)
    if err != nil {
        fmt.Println("Para config failed: ",err)
        return false
    }

    configLock.Lock()
    config = temp
    configLock.Unlock()
    return true
}

func GetConfig() *Config {
    configLock.RLock()
    defer configLock.RUnlock()
    return config
}

func init() {
    if !loadConfig() {
        os.Exit(1)
    }

    //热更新配置可能有多种触发方式,这里使用系统信号量sigusr1实现
    s := make(chan os.Signal,1)
    signal.Notify(s,syscall.SIGUSR1)
    go func() {
        for {
            <-s
            log.Println("Reloaded config:",loadConfig())
        }
    }()
}

func main() {
    select {}
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读