返回顶部
首页 > 资讯 > 精选 >如何用GIN构建一个WEB服务
  • 944
分享到

如何用GIN构建一个WEB服务

2023-06-26 03:06:04 944人浏览 八月长安
摘要

这篇文章主要介绍“如何用GIN构建一个WEB服务”,在日常操作中,相信很多人在如何用GIN构建一个WEB服务问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何用GIN构建一个WEB服务”的疑惑有所帮助!接下来

这篇文章主要介绍“如何用GIN构建一个WEB服务”,在日常操作中,相信很多人在如何用GIN构建一个WEB服务问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何用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.gofunc main() { cmd.Execute()}// cmd/root.govar 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.govar httpserver *Http.Servervar 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                  webApiUsage: 提供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.gofunc 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.sencondfunc 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:8080curl: (7) Failed to connect to 0.0.0.0 port 8080: Connection refused

网关和服务会有心跳监测,无法提供服务后,网关自动踢掉服务,不再发流量,待恢复后再重新发流量。但是实际部署部署是另有方案,因为心跳是有间隔的,这个间隔期间服务退出了,就会造成大量的 502

实际线上操作为,当一台服务要退出的时候,会先到网关摘流量,再执行平滑退出,启动新服务,到网关挂上流量。 网关一般用的是阿里的 slb,也有人用 kong,都是一样的套路。

到此,关于“如何用GIN构建一个WEB服务”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: 如何用GIN构建一个WEB服务

本文链接: https://lsjlt.com/news/306618.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何用GIN构建一个WEB服务
    这篇文章主要介绍“如何用GIN构建一个WEB服务”,在日常操作中,相信很多人在如何用GIN构建一个WEB服务问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何用GIN构建一个WEB服务”的疑惑有所帮助!接下来...
    99+
    2023-06-26
  • 如何使用Node.js构建一个简单Web服务器
    Node.js是一个用于后端服务的JavaScript运行环境,它允许开发者使用同一种语言编写服务器端和客户端应用程序。与其他后端技术相比,Node.js具有更高的处理能力和更好的可扩展性。在这篇文章中,我们将介绍如何使用Node.js构建...
    99+
    2023-05-14
  • 如何搭建一个 web 服务器
    如何搭建一个 web 服务器?在今天的数字时代,Web服务器是建立和托管自己的网站或应用程序的关键组成部分。虽然有许多方便的解决方案,例如使用云服务提供商提供的托管服务,但是了解如何搭建自己的Web服务器仍然是一个有价值的技能。 一、选择...
    99+
    2024-01-23
    web服务器 如何搭建一个 web 服务器 云服务器知识
  • Python中怎么利用 FastAPI构建一个Web服务
    Python中怎么利用 FastAPI构建一个Web服务,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。起步我们将使用 Fedora 作为基础镜像来搭建开发环境,...
    99+
    2023-06-16
  • 如何构建一个可测试的Go Web应用
    如何构建一个可测试的Go Web应用,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。几乎每一个程序员都赞同测试是重要的,但测试以多种方式让写...
    99+
    2024-04-02
  • 如何使用Node.js搭建一个静态Web服务器
    这篇文章主要介绍了如何使用Node.js搭建一个静态Web服务器的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇如何使用Node.js搭建一个静态Web服务器文章都会有所收获,下...
    99+
    2024-04-02
  • 如何用Golang搭建一个高性能web服务器
    一个高性能web服务器随着互联网越来越成为人们生活中不可或缺的一部分,web应用程序的需求越来越大。由于Golang具有高并发性能和简单易用的语言特性,成为了一种越来越流行的web服务器开发语言。那么,如何使用Golang来搭建一个高性能w...
    99+
    2023-05-14
  • Gin Web 应用程序仅渲染一个模板
    Gin是一款轻量级的Web框架,被广泛应用于Go语言的Web开发中。在Gin中,Web应用程序通常只需要渲染一个模板即可完成页面的展示。这种设计使得开发者可以更加专注于业务逻辑的实现,...
    99+
    2024-02-13
    go语言
  • 使用Spring MVC 和Mybatis 如何构建一个高性能的web
    这期内容当中小编将会给大家带来有关使用Spring MVC 和Mybatis 如何构建一个高性能的web,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。项目结构:是一个典型的Maven 项目 :src/ma...
    99+
    2023-05-31
    spring springmvc mybatis
  • FastApi如何快速构建一个web项目的实现
    目录项目介绍项目目录构成项目内容数据文件内容模板渲染同步接口异步接口项目入口文件项目依赖项目部署访问效果FastApi快速构建一个web项目 已经使用FastApi很久了。这个一个...
    99+
    2023-03-24
    FastApi构建web项目 FastApi构建web
  • 如何用一个printf()调用实现一个web服务器
    这篇文章将为大家详细讲解有关如何用一个printf()调用实现一个web服务器,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一...
    99+
    2024-04-02
  • 如何使用webpack构建一个库
    这篇文章主要为大家展示了“如何使用webpack构建一个库”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何使用webpack构建一个库”这篇文章吧。输出产物构...
    99+
    2024-04-02
  • Python如何搭建一个web app
    点击打开链接https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001432170937506ecfb2f6adf8e47...
    99+
    2023-01-31
    Python web app
  • Windows 与 Apache: 如何搭建一个高效的 Web 服务器?
    在当今互联网时代,Web 服务器已经成为了每个网站必备的组件之一。而对于很多小型企业或者个人开发者而言,搭建一台自己的 Web 服务器并不是一件容易的事情。本文将介绍如何在 Windows 操作系统下搭建一个高效的 Web 服务器,使用 ...
    99+
    2023-08-10
    leetcode windows apache
  • FastApi怎么快速构建一个web项目
    这篇文章主要介绍“FastApi怎么快速构建一个web项目”,在日常操作中,相信很多人在FastApi怎么快速构建一个web项目问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”FastApi怎么快速构建一个we...
    99+
    2023-07-05
  • Django REST框架:如何使用HTTP API构建Web服务?
    Django REST框架是一个基于Django的强大的Web API框架,它使得构建Web服务变得更加容易和快速。本文将介绍如何使用Django REST框架来构建HTTP API服务。 安装Django REST框架 首先,需要安...
    99+
    2023-11-12
    django http git
  • 使用Dockerfile如何构建一个docker镜像
    这篇文章给大家介绍使用Dockerfile如何构建一个docker镜像,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。使用Dockerfile构建docker镜像1、什么是Dockerfile?   ...
    99+
    2023-06-14
  • 如何使用Django构建一个PHP容器?
    Django是一个流行的Python Web框架,它被广泛用于构建高性能、易于维护的Web应用程序。而PHP是一种常见的编程语言,被广泛用于Web开发。在本文中,我们将介绍如何使用Django构建一个PHP容器。 1.准备工作 在开始之前,...
    99+
    2023-08-06
    容器 django 索引
  • HTML如何创建一个Web Worker文件
    这篇文章主要为大家展示了“HTML如何创建一个Web Worker文件”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“HTML如何创建一个Web Worker文件...
    99+
    2024-04-02
  • 如何构建一个JSON字符串
    本篇文章给大家分享的是有关如何构建一个JSON字符串,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。一、alibaba 的 FastjsonFastjson 是一个以 Java ...
    99+
    2023-05-31
    json 字符串
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作