Go 语言核心 36 讲
郝林
《Go 并发编程实战》作者,前轻松筹大数据负责人
79610 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 55 讲
Go 语言核心 36 讲
15
15
1.0x
00:00/00:00
登录|注册

47 | 基于HTTP协议的网络服务

MaxIdleConnsPerHost
MaxIdleConns
ExpectContinueTimeout
IdleConnTimeout
定制方式
空闲连接产生原因
操作超时字段
DialContext字段
*http.Transport类型
Serve方法
调用net.Listen函数
检查Addr字段
http.DefaultTransport变量
问题解析
功能
Timeout字段
http.RoundTripper接口类型
停止网络服务程序
ListenAndServe方法
Transport字段
http.Client类型
error类型
*http.Response类型
使用http.Client
返回值
syscall.Socket函数
net.Dial函数
http.Get函数
net.Dialer类型
net代码包
syscall代码包
net/http代码包
net.DialTimeout函数
网络编程和socket
基于HTTP协议的网络服务

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

我们在上一篇文章中简单地讨论了网络编程和 socket,并由此提及了 Go 语言标准库中的syscall代码包和net代码包。
我还重点讲述了net.Dial函数和syscall.Socket函数的参数含义。前者间接地调用了后者,所以正确理解后者,会对用好前者有很大裨益。
之后,我们把视线转移到了net.DialTimeout函数以及它对操作超时的处理上,这又涉及了net.Dialer类型。实际上,这个类型正是net包中这两个“拨号”函数的底层实现。
我们像上一篇文章的示例代码那样用net.Dialnet.DialTimeout函数来访问基于 HTTP 协议的网络服务是完全没有问题的。HTTP 协议是基于 TCP/IP 协议栈的,并且它也是一个面向普通文本的协议。
原则上,我们使用任何一个文本编辑器,都可以轻易地写出一个完整的 HTTP 请求报文。只要你搞清楚了请求报文的头部(header)和主体(body)应该包含的内容,这样做就会很容易。所以,在这种情况下,即便直接使用net.Dial函数,你应该也不会感觉到困难。
不过,不困难并不意味着很方便。如果我们只是访问基于 HTTP 协议的网络服务的话,那么使用net/http代码包中的程序实体来做,显然会更加便捷。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入介绍了基于HTTP协议的网络服务,并重点讨论了Go语言标准库中的`net`和`http`代码包。作者首先回顾了网络编程和socket相关内容,然后重点讲解了`net.Dial`和`net.DialTimeout`函数的使用,以及`net.Dialer`类型的底层实现。接着,作者介绍了使用`http.Get`函数访问基于HTTP协议的网络服务的便捷方式,并给出了相应的示例代码。文章还详细解释了`http.Client`类型中的`Transport`字段的含义,以及各个字段的具体作用和默认值。此外,还介绍了与空闲连接相关的字段,以及如何定制`Transport`值来控制连接的行为。总的来说,本文通过实际代码示例和技术细节,帮助读者快速了解了基于HTTP协议的网络服务的实现和使用方法。文章内容涉及了`http.RoundTripper`接口、`http.DefaultTransport`变量、`http.Transport`类型,以及`net.Dialer`类型,对于想深入了解网络编程和HTTP协议的读者来说,是一篇非常有价值的技术文章。文章还提出了思考题:如何优雅地停止基于HTTP协议的网络服务程序,为读者留下了一个值得深入探索的问题。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Go 语言核心 36 讲》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(14)

  • 最新
  • 精选
  • 嘎嘎
    看测试用例中是用 srv.Shutdown(context.Background()) 的方式停止服务,通过RegisterOnShutdown可添加服务停止时的调用

    作者回复: 对的。

    2019-04-04
    9
  • 袁树立
    如此一来,每当一个 HTTP 请求被递交时,就都会产生一个新的网络连接。这样做会明显地加重网络服务以及客户端的负载,并会让每个 HTTP 事务都耗费更多的时间。所以,在一般情况下,我们都不要去设置这个DisableKeepAlives字段。 老师,针对这句话,有个问题。 因为我们的服务调用其他内网接口,会通过公司的负载均衡。七层负载均衡是关闭了keep-alive的。所以我们的http就每次都是短链接。 那每次http事务耗费的时间大概是什么量级? 我这里看到,设置了500ms超时的情况下。在频繁请求的场景,每过几分钟就会有一批超时。报net/http timeout 。 用http trace看,是在getConn前就耗费了500ms 请问,这种情况正常吗?

    作者回复: 这个问题太复杂了。你们的网络拓扑、中间件版本和配置以及 Go 程序本身等等都可能会对此影响。你们需要有 request id,然后串起来进行分析。 定位问题需要定位到某一个或某几行代码。只知道在 getConn 前耗时的话,粒度太粗了。有必要的话,需要跟进 net 包的源码。 另外,怎样设置需要按照你们的实际情况来。我不知道你们具体因为什么关闭 ka,也许是合理的,也许不是。不论怎样,这相当于放弃了对操作系统底层优化机制的利用。

    2019-10-23
    1
  • lesserror
    郝林老师,在demo94.go中这个字段的值: DualStack: true, 其中“DualStack”会被编辑器用横线从中穿过,并提示:'DualStack' is deprecated 。

    作者回复: 这个字段现在已经被废弃了。DualStack 主要的作用是在对方服务器不支持 IPv6 协议或者配置错误的情况下快速回退到 IPv4。现在这个行为已经是默认的了。 如果想关掉,你可以通过把 FallbackDelay 字段设置为负值。我稍后会更新一下源码。

    2021-09-02
  • qiushye
    http.Transport里没有MaxConnsPerHost字段了,article36/q1的程序运行报错

    作者回复: Go 1.13 里依然有啊。

    2019-10-11
    3
  • 晨曦
    “人生的道路都是由心来描绘的,所以,无论自己处于多么严酷的境遇之中,心头都不应为悲观的思想所萦绕。” 被老师的精神打动,真心祝愿早日康复!
    2018-11-28
    27
  • Michael
    看了下源码之后感觉应该这样做: quit := make(chan os.Signal, 1) signal.Notify(quit, os.Interrupt, syscall.SIGTERM) server := http.Server{..} go func(){ server. ListenAndServe() }() <-quit server.Shutdown() Shutdown 并不会立即退出,他会首先停止监听,并且启动一个定时器,避免新的请求进来,然后关闭空闲链接,等待处理中的请求完成或者如果定时器到了,再退出,和 NGINX 的 平滑退出很像。
    2018-11-30
    10
  • My dream
    老师可以讲一下这个不:gomonkey,我看半天都没明白这个打桩是什么意思
    2018-11-28
    5
  • aebn
    谢谢老师分享,努力学习中^_^
    2018-11-28
    2
  • 路人
    这节老师讲得特别好,特别是问题的衍生能思考到很多go的其他重要模块,比如net、io等。
    2019-07-14
    1
  • 新世界
    讲的很不错,把http常用的参数注意事项都讲了一遍,这一块是通用技能,无论哪种语言,发送http请求都会有这些参数,很不错
    2022-05-25
收起评论
显示
设置
留言
14
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部