码迷,mamicode.com
首页 > 其他好文 > 详细

使用第三方库来支持平滑重启

时间:2019-12-20 01:04:02      阅读:113      评论:0      收藏:0      [点我收藏+]

标签:turn   请求   第三方   coding   更改   ini   pkg   hub   ash   

平滑重启的第三方库overseer

package main

import (
    "crypto/md5"
    "encoding/hex"
    "flag"
    "fmt"
    "github.com/jpillora/overseer"
    "gopkg.in/ini.v1"
    "io"
    "log"
    "net/http"
    "os"
    "os/signal"
    "strconv"
    "strings"
    "syscall"
    "time"
)

func main() {
    port := flag.Int("p", 8080, "服务端口")
    flag.Parse()
    if *port == 0 {
        log.Fatal("请指定端口")
    }
    cfg, err := ini.Load("my.ini")
    if err != nil {
        log.Fatal(err)
    }
    mux := http.NewServeMux()
    mux.HandleFunc("/", func(writer http.ResponseWriter, request *http.Request) {
        dbUser := cfg.Section("db").Key("db_user").Value()
        dbPass := cfg.Section("db").Key("db_pass").Value()
        writer.Write([]byte("<h1>" + dbUser + "</h1>"))
        writer.Write([]byte("<h1>" + dbPass + "</h1>"))
    })
    mux.HandleFunc("/reload", func(writer http.ResponseWriter, request *http.Request) {
        newCfg, _ := ini.Load("my.ini")
        cfg = newCfg
    })

    server := &http.Server{
        // Addr:":"+strconv.Itoa(*port),
        Handler: mux,
    }
    prog := func(state overseer.State) { //state这个参数是官方的不用改
        server.Serve(state.Listener) //使用overseer去启动服务
    }

    errChan := make(chan error)
    go (func() {
        overseer.Run(overseer.Config{
            Program:          prog,
            TerminateTimeout: time.Second * 2, //如果配置更改了需要等待当前请求全部结束结束再重启,加上这个最多等待2秒
            Address:          ":" + strconv.Itoa(*port),
        })
    })()

    //监听信号
    go (func() {
        sig_c := make(chan os.Signal)
        signal.Notify(sig_c, syscall.SIGINT, syscall.SIGTERM)
        errChan <- fmt.Errorf("%s", <-sig_c)
    })()
    //监控配置文件变化
    go (func() {
        fileMd5, err := getFileMD5("my.ini")
        if err != nil {
            log.Println(err)
            return
        }
        for {
            newMd5, err := getFileMD5("my.ini")
            if err != nil {
                log.Println(err)
                break;
            }
            if strings.Compare(newMd5, fileMd5) != 0 {
                fileMd5 = newMd5
                fmt.Println("文件发生了变化")
                overseer.Restart() //使用overseer平滑重启服务
            }
            time.Sleep(time.Second * 2)
        }
    })()

    getErr := <-errChan

    log.Println(getErr)
}
func getFileMD5(filePath string) (string, error) {
    file, err := os.Open(filePath)
    hash := md5.New()
    if _, err = io.Copy(hash, file); err != nil {
        return "", err
    }
    hashInBytes := hash.Sum(nil)[:16]
    return hex.EncodeToString(hashInBytes), nil
}




使用第三方库来支持平滑重启

标签:turn   请求   第三方   coding   更改   ini   pkg   hub   ash   

原文地址:https://www.cnblogs.com/hualou/p/12071070.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!