成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

從PHP遷移至Golang - 熱更新篇

i_garfileo / 1044人閱讀

摘要:上篇大致提到的的熱更新,本篇將詳細(xì)論述。軟件的熱更新就是指在保持系統(tǒng)正常運行的情況下對系統(tǒng)進(jìn)行更新升級。同樣地,熱更新也可以采取類似的處理。注包方式的熱更新本文暫不討論。

上篇大致提到的Golang的熱更新,本篇將詳細(xì)論述。

1、什么是熱更新

網(wǎng)絡(luò)上有這么一個例子來形容熱更新,我覺得很形象很貼切:

一架行駛在高速上的大卡車,行駛過程中突然遭遇爆胎,熱更新則是要求在不停車的情況下將車胎修補(bǔ)好,且補(bǔ)胎過程中卡車需要保持正常行駛。

軟件的熱更新就是指在保持系統(tǒng)正常運行的情況下對系統(tǒng)進(jìn)行更新升級。常見的情況有:系統(tǒng)服務(wù)升級、修復(fù)現(xiàn)有邏輯、服務(wù)配置更新等。

2、熱更新原理

先來看下Nginx熱更新是如何做的?
Nginx支持運行中接收信號,方便開發(fā)者控制進(jìn)程。

1)首先備份原有的Nginx二進(jìn)制文件,并用新編譯好的Nginx二進(jìn)制文件替換舊的

2)然后向master進(jìn)程發(fā)送USR2信號。此時Nginx進(jìn)程會啟動一個新版本Nginx,該新版本Nginx進(jìn)程會發(fā)起一個新的master進(jìn)程與work進(jìn)程。即此時會有兩個Nginx實例在運行,一起處理新來的請求。

3)再向原master進(jìn)程發(fā)送WINCH信號,它會逐漸關(guān)閉相關(guān)work進(jìn)程,此時原master進(jìn)程仍保持監(jiān)聽新請求但不會發(fā)送至其下work進(jìn)程,而是交給新的work進(jìn)程

4)最后等到所有原work進(jìn)程全部關(guān)閉,向原master進(jìn)程發(fā)送QUIT信號,終止原master進(jìn)程,至此,完成Nginx熱升級。

:在*nix系統(tǒng)中,信號(Signal)是一種進(jìn)程間通信機(jī)制,它給應(yīng)用程序提供一種異步的軟件中斷,使應(yīng)用程序有機(jī)會接受其他程序或終端發(fā)送的命令(即信號)。

同樣地,Golang熱更新也可以采取類似的處理。如上篇所述,都是利用用戶自定義信號USR2。

:Plugin包方式的Golang熱更新本文暫不討論。

3、熱更新實現(xiàn)

Golang熱更新可以細(xì)分為服務(wù)熱『更新』(即熱升級,類比Nginx的restart命令)與配置文件熱更新(類比Nginx的reload命令)。接下來從實現(xiàn)細(xì)節(jié)處依次討論。

3.1 服務(wù)熱更新

大致流程如下:

1)Golang服務(wù)進(jìn)程運行時監(jiān)聽USR2信號

2)進(jìn)程收到USR2信號后,fork子進(jìn)程(啟動新版本服務(wù)),并將當(dāng)前socket句柄等進(jìn)程環(huán)境交給它

3)新進(jìn)程開始監(jiān)聽socket請求

4)等待舊服務(wù)連接停止

主要代碼示例如下:
監(jiān)聽USR2信號

func (a *app) signalHandler(wg *sync.WaitGroup) {
    ch := make(chan os.Signal, 10)
    signal.Notify(ch, syscall.SIGINT, syscall.SIGTERM, syscall.SIGUSR2)
    for {
        sig := <-ch
        switch sig {
        case syscall.SIGINT, syscall.SIGTERM:
            // 確保接收到INT/TERM信號時可以觸發(fā)Golang標(biāo)準(zhǔn)的進(jìn)程終止行為
            signal.Stop(ch)
            a.term(wg)
            return
        case syscall.SIGUSR2:
            err := a.preStartProcess()
            if err != nil {
                a.errors <- err
            }
            // 發(fā)起新進(jìn)程
            if _, err := a.net.StartProcess(); err != nil {
                a.errors <- err
            }
        }
    }
}

復(fù)制當(dāng)前進(jìn)程socket連接,發(fā)起新進(jìn)程

execSpec := &syscall.ProcAttr{
Env: os.Environ(),
Files: []uintptr{os.Stdin.Fd(), os.Stdout.Fd(), os.Stderr.Fd()},
}
fork, err := syscall.ForkExec(os.Args[0], os.Args, execSpec)
...

詳細(xì)源碼可見:https://scalingo.com/articles...

以上僅為代碼示例,目前已經(jīng)成熟的開源實現(xiàn)主要有:endless和facebook的grace,原理基本類似,fork一個子進(jìn)程,子進(jìn)程監(jiān)聽原有父進(jìn)程socket端口,父進(jìn)程優(yōu)雅退出。

在實際的生產(chǎn)環(huán)境中推薦使用以上開源庫,關(guān)于熱更新開源庫的使用非常方便,下面是facebook的grace庫的例子:
引入github.com/facebookgo/grace/gracehttp

func main() {
    app := gin.New()// 項目中時候的是gin框架
    router.Route(app)
    var server *http.Server
    server = &http.Server{
        Addr:    ":8080",
        Handler: app,
    }
    gracehttp.Serve(server)
}

利用go build命令編譯,生成服務(wù)的可執(zhí)行文件。
然后再用shell封裝一下服務(wù)命令,生成restat.sh命令文件

#!/bin/sh

ps aux | grep wingo
count=`ps -ef | grep "wingo" | grep -v "grep" | wc -l`
echo ""

if [ 0 == $count ]; then
    echo "Wingo starting..."
    sudo ./wingo &
    echo "Wingo started"
else
    echo "Wingo Restarting..."
    sudo kill -USR2 $(ps -ef | grep "wingo" | grep -v grep | awk "{print $2}")
    echo "Wingo Restarted"
fi

sleep 1

ps aux | grep wingo

:其中wingo為服務(wù)的二進(jìn)制名稱。

于是,便可通過執(zhí)行./restart.sh命令,達(dá)到對服務(wù)的熱升級目的。

3.2 配置文件熱更新

配置文件熱更新是指在不停止服務(wù)的情況下,重新加載服務(wù)所有配置文件。
與3.1服務(wù)熱升級原理一樣,利用用戶自定義信號:USR1,即可實現(xiàn)服務(wù)的配置文件熱更新。

1)服務(wù)監(jiān)聽USR1信號

2)服務(wù)接收到USR1信號后,停止接受新的連接,等待當(dāng)前連接停止,重新載入配置文件,重啟服務(wù)器,從而實現(xiàn)相對平滑的不停服的更改。

主要代碼實現(xiàn):

// LoadAllConf 調(diào)用加載配置文件函數(shù)
// load為具體加載配置文件方法
func LoadAllConf(load func(bool)) {
    load(true)
    listenSIGUSR1(load)
}

// listenSIGUSR1 監(jiān)聽SIGUSR1信號
func listenSIGUSR1(f func(bool)) {
    s := make(chan os.Signal, 1)
    signal.Notify(s, syscall.SIGUSR1)
    go func() {
        for {
            <-s
            f(false)
            log.Println("Reloaded")
        }
    }()
}

詳細(xì)源碼可見:https://www.openmymind.net/Go...

利用go build命令編譯,生成服務(wù)的可執(zhí)行文件。
然后再用shell封裝一下配置重載命令,生成reload.sh命令文件

#!/bin/sh

ps aux | grep wingo
echo ""

echo "Wingo Reloading..."
sudo kill -USR1 $(ps -ef | grep "wingo" | grep -v grep | awk "{print $2}")
echo "Wingo Reloaded"
echo ""

sleep 1

ps aux | grep wingo

于是,便可通過執(zhí)行./reload.sh命令,達(dá)到對服務(wù)的配置文件熱升級目的。

4、總結(jié)

本文主要描述了Golang服務(wù)熱升級與配置文件熱更新原理與主要代碼實現(xiàn),本質(zhì)上也不是什么新內(nèi)容,如果之前讀過《Unix環(huán)境高級編程》,就會覺得很親切。底層原理基本上是利用了信號這個軟件中斷機(jī)制,在運行中改變常駐進(jìn)程的行為。

References

https://scalingo.com/articles...
http://kuangchanglang.com/gol...
https://blog.csdn.net/black_O...
https://www.openmymind.net/Go...
https://blog.csdn.net/qq_1543...
https://wrfly.kfd.me/posts/%E...

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/29722.html

相關(guān)文章

  • PHP遷移Golang - 基礎(chǔ)

    摘要:但是,隨著微服務(wù)架構(gòu)的興起以及容器時代的到來,這種情況又再次加劇。最重要的是,在微服務(wù)與容器領(lǐng)域有很好的基礎(chǔ),后期系統(tǒng)可完美實現(xiàn)微服務(wù)化與容器化。 1、Why Not PHP 使用PHP構(gòu)建的WEB程序,隨著業(yè)務(wù)發(fā)展到一定體量之后,都不得不面臨以下一些問題: 業(yè)務(wù)功能不斷擴(kuò)張,如何避免某單一業(yè)務(wù)功能故障影響整體,維持系統(tǒng)健壯性 業(yè)務(wù)邏輯復(fù)雜度不斷上升,如何解耦與模塊化,降低系統(tǒng)復(fù)雜性...

    Kerr1Gan 評論0 收藏0
  • 途牛原創(chuàng)|途牛周刊

    摘要:的本質(zhì)是團(tuán)隊博客,關(guān)注互聯(lián)網(wǎng)創(chuàng)業(yè)技術(shù),每周推薦篇優(yōu)質(zhì)文章。堅持爭取做到每周更新,與讀者一起進(jìn)步。第十一期第十期第九期第八期第七期第六期第五期第四期第三期切換至,第二期發(fā)布。創(chuàng)刊,用發(fā)布了第一次。 Tuniu Weekly Inspired By 《灣區(qū)日報》 我們團(tuán)隊也想基于這種模式,讓大家感受到技術(shù)的人文。 《Tuniu Weekly》就這樣產(chǎn)生了。 《Tuniu Weekly》...

    ThreeWords 評論0 收藏0
  • [開源] LaravelPlus - 基于 Laravel 魔改,為方便實際業(yè)務(wù)使用 - 開發(fā)中

    摘要:目的為了減少重復(fù)和新項目的配置麻煩等問題,就是為了騙星星如現(xiàn)有的生成工具雖然好用,但是不太喜歡樣式和代碼結(jié)構(gòu)。有些本地,測試,線上的配置需要頻繁改動的需要。 目的 為了減少重復(fù) CURD 和新項目的配置麻煩等問題,(就是為了騙星星:LaravelPlus )如: 現(xiàn)有的 infyomlabs/laravel-generator CODE 生成工具雖然好用,但是不太喜歡樣式和代碼結(jié)構(gòu)。...

    weknow619 評論0 收藏0
  • TiDB 助力東南亞領(lǐng)先電商 Shopee 業(yè)務(wù)升級

    摘要:作者介紹劉春輝,洪超,一業(yè)務(wù)場景是東南亞和臺灣地區(qū)領(lǐng)先的電子商務(wù)平臺,覆蓋新加坡馬來西亞菲律賓印度尼西亞泰國越南和臺灣等七個市場。母公司為首家在紐約證券交易所上市的東南亞互聯(lián)網(wǎng)企業(yè)。 作者介紹劉春輝,Shopee DBA洪超,Shopee DBA 一、業(yè)務(wù)場景 Shopee(https://shopee.com/)是東南亞和臺灣地區(qū)領(lǐng)先的電子商務(wù)平臺,覆蓋新加坡、馬來西亞、菲律賓、印...

    hoohack 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<