本文由golang教程栏目给大家介绍怎么用 GIN 构建一个 WEB 服务,希望对需要的朋友有所帮助!
快速启动一个 api
目录
├── api \\ 服务入口 ├── cmd \\ 服务启动入口 ├── config ├── doc └── chaper1.md├── go.mod ├── internal \\ 业务逻辑 ├── main.go ├── pkg \\ 三方包初始化 └── router \\ Api 路由
GIN && Cobra
一般 WEB 服务,都会包含多个模块: API 接口、定时任务、消费 MQ 常驻进程等等,在这种情况下,很显然直接使用 GIN 来启动就只能开启 API 模块,十分不便。
我们用 Cobra 来管理项目的启动,现在不用关心 Cobra 如何使用,现在要的是满足我们需求。
很多时候人会陷入到细节里,就无法宏观的把控全局设计。无论是做需求还是设计框架,都应该梳理整个流程,每个流程需要什么样的技术,而技术细节反而不是最需要关心的。互联网发展到今天,你遇到的问题一定有人遇到过要把关注点放到你的设计上。
初始化一个 rootCmd 来管理项目中所有的模块
// main.go func main() { cmd.Execute()} // cmd/root.go var rootCmd = &cobra.Command{ Use: "提供WebApi服务", Short: "webApi",} func init() { rootCmd.AddCommand(apiCmd)} func Execute() { if err := rootCmd.Execute(); err != nil { fmt.Println("[错误]启动失败:", err) }} // cmd/api.go var httpServer *http.Server var apiCmd = &cobra.Command { Use: "api", Short: "apiCmd", Long: `apiCmd 提供api接口服务`, 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("启动失败", err) }}, } }
这个时候启动一下, 可以看到需要传一个命令行参数:
➜ gin-web-layout git:(master) ✗ go run main.go webApi Usage: 提供WebApi服务 [command] Available Commands: api apiCmd completion Generate the autocompletion script for the specified shell help Help about any command
使用 go run main.go api
就可以启动服务了
➜ 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)
首先开始接入路由, 所见即所得,能快速的看到自己写的成果
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)
这样一个 hello world 就完成了,这个也是 gin 快速开始的内容。 启动后访问一下:
➜ gin-web-layout git:(master) ✗ curl http://0.0.0.0:8080 "ok"%
这个时候我们来完善一下启动模块的代码,加上平滑重启,设置 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") }
这样就支持了热启动,然后就编译启动,ctrl+c, 他为什么没阻塞 5 秒,直接就退出了?
因为 ctrl+c 的时候,会检查是否有待处理的请求,如没有就会直接退出。我们可以模拟一个耗时请求:
// router/router.go engine.GET("/", func(c *gin.Context) { time.Sleep(5 * time.Second) c.JSON(200, "ok") })
重新启动后,再次 ctrl+c 会发现 5 秒后项目才退出完成。
题外话,线上的服务是如何发布部署的?
一般线上服务都会用网关调度流量,当我们一个服务接受到 kill(重启脚本一般用 kill,杀掉 pid) 信号,就不再接受新请求。
这一点可以用我们刚配置的热重启验证一下,把 timeout 设置 10s, 伪造一个耗时 10s 的请求,启动后执行退出(用 ctrl+c 或者 kill, 本质都是发送一个信号), 然后再访问服务,
会得到
➜ 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
网关和服务会有心跳监测,无法提供服务后,网关自动踢掉服务,不再发流量,待恢复后再重新发流量。但是实际部署部署是另有方案,因为心跳是有间隔的,这个间隔期间服务退出了,就会造成大量的 502
实际线上操作为,当一台服务要退出的时候,会先到网关摘流量,再执行平滑退出,启动新服务,到网关挂上流量。 网关一般用的是阿里的 slb,也有人用 kong,都是一样的套路。
以上是教你用GIN建構一個WEB服務的詳細內容。更多資訊請關注PHP中文網其他相關文章!

go语言有缩进。在go语言中,缩进直接使用gofmt工具格式化即可(gofmt使用tab进行缩进);gofmt工具会以标准样式的缩进和垂直对齐方式对源代码进行格式化,甚至必要情况下注释也会重新格式化。

go语言叫go的原因:想表达这门语言的运行速度、开发速度、学习速度(develop)都像gopher一样快。gopher是一种生活在加拿大的小动物,go的吉祥物就是这个小动物,它的中文名叫做囊地鼠,它们最大的特点就是挖洞速度特别快,当然可能不止是挖洞啦。

闭包(closure)是一个函数以及其捆绑的周边环境状态(lexical environment,词法环境)的引用的组合。 换而言之,闭包让开发者可以从内部函数访问外部函数的作用域。 闭包会随着函数的创建而被同时创建。

本篇文章带大家了解一下golang 的几种常用的基本数据类型,如整型,浮点型,字符,字符串,布尔型等,并介绍了一些常用的类型转换操作。

是,TiDB采用go语言编写。TiDB是一个分布式NewSQL数据库;它支持水平弹性扩展、ACID事务、标准SQL、MySQL语法和MySQL协议,具有数据强一致的高可用特性。TiDB架构中的PD储存了集群的元信息,如key在哪个TiKV节点;PD还负责集群的负载均衡以及数据分片等。PD通过内嵌etcd来支持数据分布和容错;PD采用go语言编写。

go语言需要编译。Go语言是编译型的静态语言,是一门需要编译才能运行的编程语言,也就说Go语言程序在运行之前需要通过编译器生成二进制机器码(二进制的可执行文件),随后二进制文件才能在目标机器上运行。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

Dreamweaver CS6
視覺化網頁開發工具

WebStorm Mac版
好用的JavaScript開發工具