golang使用信號(hào)量熱更新的實(shí)現(xiàn)示例
配置文件熱更新是服務(wù)器程序的一個(gè)基本功能,通過熱更新可以不停機(jī)調(diào)整程序的配置,特別是在生產(chǎn)環(huán)境可以提供極大的便利,比如發(fā)現(xiàn)log打得太多了可以動(dòng)態(tài)調(diào)高日志等級(jí),業(yè)務(wù)邏輯參數(shù)變化,甚至某個(gè)功能模塊的開關(guān)等都可以動(dòng)態(tài)調(diào)整。
package main
import (
"encoding/json"
"fmt"
"io/ioutil"
"log"
"os"
"os/signal"
"sync"
"syscall"
)
//用json配置測(cè)試
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
}
//不同的配置規(guī)則,解析復(fù)雜度不同
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)
}
//熱更新配置可能有多種觸發(fā)方式,這里使用系統(tǒng)信號(hào)量sigusr1實(shí)現(xiàn)
s := make(chan os.Signal, 1)
signal.Notify(s, syscall.SIGUSR1)
go func() {
for {
<-s
log.Println("Reloaded config:", loadConfig())
}
}()
}
func main() {
select {}
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
GoLang?channel關(guān)閉狀態(tài)相關(guān)操作詳解
Channel?和?goroutine?的結(jié)合是?Go?并發(fā)編程的大殺器。而?Channel?的實(shí)際應(yīng)用也經(jīng)常讓人眼前一亮,通過與?select,cancel,timer?等結(jié)合,它能實(shí)現(xiàn)各種各樣的功能。接下來,我們就要介紹GoLang?channel關(guān)閉狀態(tài)相關(guān)操作2022-10-10
基于Go語言實(shí)現(xiàn)一個(gè)目錄樹打印工具
在日常開發(fā)中,我們經(jīng)常需要可視化項(xiàng)目的目錄結(jié)構(gòu),下面小編將介紹一款用Go語言開發(fā)的目錄樹打印工具,它不僅能生成美觀的目錄結(jié)構(gòu)圖,還提供多種實(shí)用功能2025-06-06
Golang正整數(shù)指定規(guī)則排序算法問題分析
這篇文章主要介紹了Golang正整數(shù)指定規(guī)則排序算法問題,結(jié)合實(shí)例形式分析了Go語言排序算法操作技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2017-01-01
詳解Golang實(shí)現(xiàn)http重定向https的方式
這篇文章主要介紹了詳解Golang實(shí)現(xiàn)http重定向https的方式,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-08-08
Go語言Http調(diào)用之Post請(qǐng)求詳解
前文我們介紹了如何進(jìn)行 HTTP 調(diào)用,并通過 GET 請(qǐng)求的例子,講述了 query 參數(shù)和 header 參數(shù)如何設(shè)置,以及響應(yīng)體的獲取方法。 本文繼上文,接下來會(huì)通過 POST 請(qǐng)求,對(duì)其他參數(shù)的設(shè)置進(jìn)行介紹,感興趣的可以了解一下2022-12-12
Go語言結(jié)合正則表達(dá)式實(shí)現(xiàn)高效獲取數(shù)據(jù)
這篇文章主要為大家詳細(xì)介紹了Go語言如何結(jié)合正則表達(dá)式實(shí)現(xiàn)高效獲取數(shù)據(jù),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-04-04
Go?channel結(jié)構(gòu)體源碼和讀寫和關(guān)閉過程詳解
這篇文章主要介紹了Go?channel結(jié)構(gòu)體源碼和讀寫和關(guān)閉過程,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-05-05

