欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

golang使用信号量热更新的实现示例

程序员文章站 2022-03-07 08:51:59
配置文件热更新是服务器程序的一个基本功能,通过热更新可以不停机调整程序的配置,特别是在生产环境可以提供极大的便利,比如发现log打得太多了可以动态调高日志等级,业务逻辑参数...

配置文件热更新是服务器程序的一个基本功能,通过热更新可以不停机调整程序的配置,特别是在生产环境可以提供极大的便利,比如发现log打得太多了可以动态调高日志等级,业务逻辑参数变化,甚至某个功能模块的开关等都可以动态调整。

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 {} 
} 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。