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

平滑重启的第三方库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
}

来自为知笔记(Wiz)

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

时间: 2024-12-20 01:28:57

使用第三方库来支持平滑重启的相关文章

纯JS实现的3D标签云,不依赖任何第三方库,支持移动页面

<span style="font-family: Arial, Helvetica, sans-serif;"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"></span> <html xmlns="

第三方库不支持bitCode

打开Xcode ,运行错误提示 某一个第三方库不包含bitcode?  bitcode?是什么,以前没有注意过. 查阅了一下官方文档,在App Distribution Guide–App Thinning (iOS, watchOS)一节中,找到了下面这样一个定义: Bitcode is an intermediate representationof a compiled program. Apps you upload to iTunes Connect that contain bitc

Xcode 中BitCode是什么,怎样配置避免导入不支持BitCode的第三方库时工程编译报错?

Bitcode是什么? 查阅了一下官方文档,在 App Distribution Guide – App Thinning (iOS, watchOS) 一节中,找到了下面这样一个定义: Bitcode is an intermediate representation of a compiled program. Apps you upload to iTunes Connect that contain bitcode will be compiled and linked on the A

golang 服务平滑重启小结

背景 golang 程序平滑重启框架 supervisor 出现 defunct 原因 使用 master/worker 模式 背景 在业务快速增长中,前期只是验证模式是否可行,初期忽略程序发布重启带来的暂短停机影响.当模式实验成熟之后会逐渐放量,此时我们的发布停机带来的影响就会大很多.我们整个服务都是基于云,请求流量从 四层->七层->机器. 要想实现平滑重启大致有三种方案,一种是在流量调度的入口处理,一般的做法是 ApiGateway + CD ,发布的时候自动摘除机器,等待程序处理完现有

Cocos2d-x第三方类库不支持arm64的问题解决(64位架构)

32位可以兼容64位操作系统. ipad mini2 64位编译有问题. 各种第三方库不支持64位操作系统. 设置build setting 直接上图: Cocos2d-x第三方类库不支持arm64的问题解决(64位架构)

升级xcode7.0 第三方库不能用的解决方法(bitcode是什么鬼?)

链接地址:http://www.it165.net/pro/html/201509/54172.html 升级完xcode,真机运行发现报错,第三方库错误,微信SDK,高德SDK都报错,如下: view sourceprint? 1.‘/Users/**/Framework/SDKs/PolymerPay/Library/mobStat/lib**SDK.a(**ForSDK.o)’ does not contain bitcode. You must rebuild it with bitco

iOS9中错误信息信息是引入的一个第三方库不包含bitcode

用Xcode 7 在真机(iOS 9)上运行一下工程,结果发现工程编译不过.看了下问题,报的是以下错误: ld: ‘/Users/**/Framework/SDKs/PolymerPay/Library/mobStat/lib**SDK.a(**ForSDK.o)’ does not contain bitcode. You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE), obtain an updated

iOS真机调试引入第三方库(如友盟等)编译时候,出现错误提示

用Xcode 7 beta 3在真机(iOS 8.3)上运行一下工程,结果发现工程编译不过.看了下问题,报的是以下错误: MARK:解决方法:在building Setting 中设置bitCode 为NO file:///Users/libtop/Desktop/屏幕快照%202016-04-14%2011.17.15.png ld: ‘/Users/**/Framework/SDKs/PolymerPay/Library/mobStat/lib**SDK.a(**ForSDK.o)’does

ios开发第三方库

ios开发必备第三方库 引言 作为iOS开发人员,在开发App的过程中怎么会不使用第三方库呢?相信没有App是不使用第三方库的!相信自己在所做过的App中使用过哪些第三方库呢? 网络库 说到网络库,这是开发必备,除非你的App玩单机.现在特别火也特别好用的网络库就数AFNetworking了.也有部分同志喜欢自己用原生的NSURLConnection来做,当然是可以的,只是要写起来也困难,维护起来更困难. 笔者基于AFNetworking封装了一个网络常用API类,猛点阅读:开源HYBNetwo