欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

如何用GIN構(gòu)建一個(gè)WEB服務(wù)

這篇文章主要介紹“如何用GIN構(gòu)建一個(gè)WEB服務(wù)”,在日常操作中,相信很多人在如何用GIN構(gòu)建一個(gè)WEB服務(wù)問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”如何用GIN構(gòu)建一個(gè)WEB服務(wù)”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

鎮(zhèn)寧ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書未來(lái)市場(chǎng)廣闊!成為成都創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:028-86922220(備注:SSL證書合作)期待與您的合作!

快速啟動(dòng)一個(gè) api

目錄

├── api  \\ 服務(wù)入口
├── cmd   \\ 服務(wù)啟動(dòng)入口
├── config
├── doc
 └── chaper1.md├── go.mod
├── internal \\ 業(yè)務(wù)邏輯
├── main.go
├── pkg   \\ 三方包初始化
└── router \\ Api 路由

GIN && Cobra

一般 WEB 服務(wù),都會(huì)包含多個(gè)模塊: API 接口、定時(shí)任務(wù)、消費(fèi) MQ 常駐進(jìn)程等等,在這種情況下,很顯然直接使用 GIN 來(lái)啟動(dòng)就只能開啟 API 模塊,十分不便。

我們用 Cobra 來(lái)管理項(xiàng)目的啟動(dòng),現(xiàn)在不用關(guān)心 Cobra 如何使用,現(xiàn)在要的是滿足我們需求。

很多時(shí)候人會(huì)陷入到細(xì)節(jié)里,就無(wú)法宏觀的把控全局設(shè)計(jì)。無(wú)論是做需求還是設(shè)計(jì)框架,都應(yīng)該梳理整個(gè)流程,每個(gè)流程需要什么樣的技術(shù),而技術(shù)細(xì)節(jié)反而不是最需要關(guān)心的。互聯(lián)網(wǎng)發(fā)展到今天,你遇到的問(wèn)題一定有人遇到過(guò)要把關(guān)注點(diǎn)放到你的設(shè)計(jì)上。

初始化一個(gè) rootCmd 來(lái)管理項(xiàng)目中所有的模塊

// main.go

func main() {
 cmd.Execute()}

// cmd/root.go
var rootCmd = &cobra.Command{
 Use:   "提供WebApi服務(wù)", Short: "webApi",}

func init() {
 rootCmd.AddCommand(apiCmd)}

func Execute() {
 if err := rootCmd.Execute(); err != nil { fmt.Println("[錯(cuò)誤]啟動(dòng)失敗:", err) }}

// cmd/api.go
var httpServer *http.Server
var apiCmd = &cobra.Command {
             Use:   "api", 
            Short: "apiCmd", 
            Long:  `apiCmd 提供api接口服務(wù)`, 
            Run: func(cmd *cobra.Command, args []string) {
                address := fmt.Sprintf("%v:%v", "0.0.0.0", 8080)
                 engine := gin.New()
                httpServer = &http.Server{
                    Addr:        address, 
                    Handler:     engine, 
                    IdleTimeout: time.Minute, 
                } 
            if err := httpServer.ListenAndServe(); err != nil &&             err != http.ErrServerClosed { 
                fmt.Println("啟動(dòng)失敗", err) 
            }},

            }
}

這個(gè)時(shí)候啟動(dòng)一下, 可以看到需要傳一個(gè)命令行參數(shù):

?  gin-web-layout git:(master) ? go run main.go                  
webApi

Usage:
 提供WebApi服務(wù) [command]
Available Commands:
 api         apiCmd completion  Generate the autocompletion script for the specified shell help        Help about any command

使用 go run main.go api 就可以啟動(dòng)服務(wù)了

?  gin-web-layout git:(master) ? go run main.go api              
[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
 - using env:   export GIN_MODE=release - using code:  gin.SetMode(gin.ReleaseMode)

首先開始接入路由, 所見(jiàn)即所得,能快速的看到自己寫的成果

router/router.go

func InitRouter(engine *gin.Engine) {
 engine.GET("/", func(c *gin.Context) { c.JSON(200, "ok") })}

在 cmd/api.go 增加以下代碼

engine := gin.New()
router.InitRouter(engine)

這樣一個(gè) hello world 就完成了,這個(gè)也是 gin 快速開始的內(nèi)容。 啟動(dòng)后訪問(wèn)一下:

?  gin-web-layout git:(master) ? curl http://0.0.0.0:8080  
"ok"%

這個(gè)時(shí)候我們來(lái)完善一下啟動(dòng)模塊的代碼,加上平滑重啟,設(shè)置 5 秒后退出

// cmd/api.go
// 只展示核心代碼,完整代碼可以在 github 查看

// 等待 5 秒 timeout = 5 *time.sencond
func OnServiceStop(timeout time.Duration) {
    quit := make(chan os.Signal)
    signal.Notify(quit, signals.Get()...)
    <-quit

    ctx, cancel := context.WithTimeout(context.Background(), timeout)
    defer cancel()
    err := httpServer.Shutdown(ctx)
    if err != nil {
        log.Fatalf("service stop error:%v", err)
    }
    log.Println("service is stopping")
}

這樣就支持了熱啟動(dòng),然后就編譯啟動(dòng),ctrl+c, 他為什么沒(méi)阻塞 5 秒,直接就退出了?

因?yàn)?ctrl+c 的時(shí)候,會(huì)檢查是否有待處理的請(qǐng)求,如沒(méi)有就會(huì)直接退出。我們可以模擬一個(gè)耗時(shí)請(qǐng)求:

// router/router.go
    engine.GET("/", func(c *gin.Context) {
        time.Sleep(5 * time.Second)
        c.JSON(200, "ok")
    })

重新啟動(dòng)后,再次 ctrl+c 會(huì)發(fā)現(xiàn) 5 秒后項(xiàng)目才退出完成。

題外話,線上的服務(wù)是如何發(fā)布部署的?

一般線上服務(wù)都會(huì)用網(wǎng)關(guān)調(diào)度流量,當(dāng)我們一個(gè)服務(wù)接受到 kill(重啟腳本一般用 kill,殺掉 pid) 信號(hào),就不再接受新請(qǐng)求。

這一點(diǎn)可以用我們剛配置的熱重啟驗(yàn)證一下,把 timeout 設(shè)置 10s, 偽造一個(gè)耗時(shí) 10s 的請(qǐng)求,啟動(dòng)后執(zhí)行退出(用 ctrl+c 或者 kill, 本質(zhì)都是發(fā)送一個(gè)信號(hào)), 然后再訪問(wèn)服務(wù),
會(huì)得到

?  gin-web-layout git:(master) ? curl http://0.0.0.0:8080
curl: (7) Failed to connect to 0.0.0.0 port 8080: Connection refused

網(wǎng)關(guān)和服務(wù)會(huì)有心跳監(jiān)測(cè),無(wú)法提供服務(wù)后,網(wǎng)關(guān)自動(dòng)踢掉服務(wù),不再發(fā)流量,待恢復(fù)后再重新發(fā)流量。但是實(shí)際部署部署是另有方案,因?yàn)樾奶怯虚g隔的,這個(gè)間隔期間服務(wù)退出了,就會(huì)造成大量的 502

實(shí)際線上操作為,當(dāng)一臺(tái)服務(wù)要退出的時(shí)候,會(huì)先到網(wǎng)關(guān)摘流量,再執(zhí)行平滑退出,啟動(dòng)新服務(wù),到網(wǎng)關(guān)掛上流量。 網(wǎng)關(guān)一般用的是阿里的 slb,也有人用 kong,都是一樣的套路。

到此,關(guān)于“如何用GIN構(gòu)建一個(gè)WEB服務(wù)”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!

網(wǎng)站標(biāo)題:如何用GIN構(gòu)建一個(gè)WEB服務(wù)
網(wǎng)站路徑:http://chinadenli.net/article10/giecgo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供關(guān)鍵詞優(yōu)化網(wǎng)站內(nèi)鏈網(wǎng)站設(shè)計(jì)網(wǎng)站導(dǎo)航電子商務(wù)網(wǎng)站維護(hù)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作