Go 语言项目开发实战
孔令飞
腾讯云专家工程师,前 Red Hat、联想云工程师
41030 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 61 讲
Go 语言项目开发实战
15
15
1.0x
00:00/00:00
登录|注册

24 | Web 服务:Web 服务核心功能有哪些,如何实现?

使用简单
功能齐全
项目活跃
轻量级
社区活跃度
使用复杂度
性能和稳定性
HTTP 参数解析和返回
middleware/filter能力
路由功能
根据(HTTP方法, 请求路径)匹配到处理请求的函数
优雅关停
认证、RequestID、跨域
中间件
参数解析、参数校验、逻辑处理、返回结果
一进程多服务
路由分组
路由匹配
JSON数据格式支持
HTTP/HTTPS支持
Gin框架特性
关注点
跨域
RequestID
认证
中间件
返回结果
逻辑处理
参数校验
参数解析
一进程多服务
路由分组
路由匹配
选择通信协议和通信格式
Gin是如何支持Web服务高级功能的?
Gin是如何支持Web服务基础功能的?
为什么选择Gin框架?
Web 服务的核心功能

该思维导图由 AI 生成,仅供参考

你好,我是孔令飞。从今天开始,我们进入实战第三站:服务开发。在这个部分,我会讲解 IAM 项目各个服务的构建方式,帮助你掌握 Go 开发阶段的各个技能点。
在 Go 项目开发中,绝大部分情况下,我们是在写能提供某种功能的后端服务,这些功能以 RPC API 接口或者 RESTful API 接口的形式对外提供,能提供这两种 API 接口的服务也统称为 Web 服务。今天这一讲,我就通过介绍 RESTful API 风格的 Web 服务,来给你介绍下如何实现 Web 服务的核心功能。
那今天我们就来看下,Web 服务的核心功能有哪些,以及如何开发这些功能。

Web 服务的核心功能

Web 服务有很多功能,为了便于你理解,我将这些功能分成了基础功能和高级功能两大类,并总结在了下面这张图中:
下面,我就按图中的顺序,来串讲下这些功能。
要实现一个 Web 服务,首先我们要选择通信协议和通信格式。在 Go 项目开发中,有 HTTP+JSON 和 gRPC+Protobuf 两种组合可选。因为 iam-apiserver 主要提供的是 REST 风格的 API 接口,所以选择的是 HTTP+JSON 组合。
Web 服务最核心的功能是路由匹配。路由匹配其实就是根据(HTTP方法, 请求路径)匹配到处理这个请求的函数,最终由该函数处理这次请求,并返回结果,过程如下图所示:
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文详细介绍了Web服务的核心功能以及Gin框架的特性和优势。作者首先介绍了Web服务的基础功能和高级功能,包括通信协议和通信格式的选择、路由匹配、API接口版本管理、多服务支持、参数解析、中间件特性、认证、RequestID、跨域请求处理等。随后,作者选择了Gin框架作为实现这些功能的工具,并详细介绍了Gin框架的特性和优势。Gin框架支持多种HTTP方法、不同位置的HTTP参数、路由和路由分组、middleware和自定义middleware、自定义Log、binding和validation、重定向、basic auth middleware等功能。通过选择Gin框架,作者强调了其轻量级、高性能、功能齐全、使用简单等特点。文章内容涵盖了HTTP/HTTPS支持、JSON数据格式支持、路由匹配、路由分组、一进程多服务、参数解析、参数校验、逻辑处理、返回结果等内容,为读者提供了全面的技术指导。文章中还提供了示例代码和详细的操作步骤,帮助读者更好地理解和应用所学知识。文章还介绍了Gin框架的中间件特性,包括中间件的加载方法、自定义中间件的实现以及一些常用的中间件。此外,文章还探讨了优雅关停HTTP服务的方法。总的来说,本文为读者提供了快速了解Web服务开发的概览和实现方式,以及Gin框架的特性和优势,对于想要深入了解Web服务开发的读者具有很高的参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Go 语言项目开发实战》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(16)

  • 最新
  • 精选
  • jxlwqq
    signal.Notify 需要使用 buffered channel 哦 ```go c := make(chan os.Signal, 1) ``` 参考:https://blog.wu-boy.com/2021/03/why-use-buffered-channel-in-signal-notify/

    作者回复: 感谢反馈,已更新

    2021-09-02
    5
  • 授人以🐟,不如授人以渔
    老师,没有理解编码实现优雅关闭服务的程序。这段程序和我们期望的:【期望 HTTP 服务可以在处理完所有请求后,正常地关闭这些连接,也就是优雅地关闭服务】有什么关系?

    作者回复: 有关系的,通过<-quit阻塞程序继续执行,当收到关停信号时,会停止阻塞,执行后面的srv.Shutdown代码,srv.Shutdown可以优雅关停HTTP服务。

    2021-09-08
    2
    4
  • 🌀🐑hfy🐣
    请问老师觉得go-zero怎样?值得学习吗?

    作者回复: 目前少有的优秀微服务框架,我觉得值得一学

    2022-09-22归属地:广东
    3
  • Neroldy
    Get handler函数用Rlock会不会更合适?因为好像只有对product的读操作而没有写操作。

    作者回复: 是的,RLock更好

    2021-07-26
    3
  • tajizhijia
    在goroute里log.Fatal()之后程序不就推出了么?

    作者回复: 对,就直接退出了。如果一个err属于Fatal级别,说明这种错误系统已经不能继续工作了,可以直接退出的。

    2022-08-26归属地:广东
    2
    1
  • wei 丶
    老师想问下server.key这个用cfssl怎么生成呀? 我往回翻了下只看到了cfssl生成的 .pem 证书文件 🙈

    作者回复: cfssl gencert -initca ca-csr.json | cfssljson -bare ca 这个命令生成的ca-key.pem其实就是server.key了

    2021-09-24
    2
    1
  • LosinGrip
    curl -XGET http://127.0.0.1:8080/v1/products/iphone12 获取如下 Client sent an HTTP request to an HTTPS server. 什么原因

    作者回复: 确认下你代码中:insecureServer.Addr是否是8080。

    2021-09-18
    1
  • Bynow
    c.JSON(http.StatusNotFound, gin.H{"error": fmt.Errorf("can not found product %s", c.Param("name"))}) 这行代码是错误的,应该是Sprintf

    作者回复: type H map[string]interface{} 可以是error类型

    2022-05-31归属地:广东
  • 平常心
    如何用 curl 来访问 https的 服务呢? ca.pem 放到本机的证书库里,运行了一下,还是跑不通 https的服务呢。

    作者回复: 有报什么错吗

    2021-12-19
  • 授人以🐟,不如授人以渔
    「表单参数 form」是否可以和「请求消息体参数 body」合并在一起,因为后者是包含前者的。其请求内容都是在请求体部分,而且格式有多种,比如 application/json、application/xml、text/plain,再比如就是 application/form。

    作者回复: 还是不能的哈。因为表单和Body本就是不同的参数

    2021-10-16
收起评论
显示
设置
留言
16
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部