Golang net/http标准库常用方法(二)

news2024/11/18 9:35:38

大家好,针对Go语言 net/http 标准库,将梳理的相关知识点分享给大家~~
围绕 net/http 标准库相关知识点还有许多章节,请大家多多关注。
文章中代码案例只有关键片段,完整代码请查看github仓库:https://github.com/hltfaith/go-example/tree/main/net-http
本章节案例,请大家以 go1.16+ 版本以上进行参考。

net/http标准库系列文章

  • Golang net/http标准库常用请求方法(一)
  • Golang net/http标准库常用方法(二)

本节内容

  • HandleFunc() 方法
  • ListenAndServe() 方法
  • ListenAndServeTLS() 方法
  • FileServer()方法
  • FileServerFS()方法

ListenAndServe()、HandleFunc()

ListenAndServer() 函数顾名思义是:监听 TCP 端口和服务。主要作用是使用处理程序调用服务来处理传入连接上的请求,接受的连接被配置为启用TCP保活。
ListenAndServer() 函数,会返回非 nil 的错误。
函数原型

func ListenAndServe(addr string, handler Handler) error

HandleFunc()函数,主要作用是在DefaultServeMux全局锁中注册指定的路由处理程序。
函数原型

func HandleFunc(pattern string, handler func(ResponseWriter, *Request))

http服务创建监听,代码片段。

这是一个非常简单代码片段,首先新增了路由,并对请求响应返回一段字符串,最后监听8080端口等待请求连接。

注:代码中 :8080 代表监听本地所有网卡,都可以访问到该服务。其次是默认将 ipv4ipv6 地址全部监听, 这种 http.ListenAndServe("0.0.0.0:8080", nil) 写法是和 http.ListenAndServe(":8080", nil) 一样的。

结合上面代码片段,我们来分析一下 /hello 路由服务是如何监听到本地的。

首先,先分析第一个问题: http.ListenAndServe()如何将url路由关联起来的,我们看到代码中ListenAndServe(":8080", nil) 第二个参数 nil 代表是0零值,并没有携带处理程序调用的服务,那它怎么与 http.HandleFunc() 关联起来的?
ListenAndServe() 函数源码中的解释是:如果 Handler 参数为nil 值时则使用 DefaultServeMux 全局锁。

下面我们再来看看到底在什么环节,判断 Handler 参数为nil 值时则使用 DefaultServeMux类型的。

调用过程:http.ListenAndServe() -> (srv *Server) ListenAndServe() -> (srv *Server) Serve(l net.Listener) -> go c.serve(connCtx)

最终 net/http 库会针对每个请求的客户端,通过 go c.serve(connCtx)协程针对每次http请求单独处理。

// Serve a new connection.
func (c *conn) serve(ctx context.Context) {
...
// HTTP cannot have multiple simultaneous active requests.[*]
// Until the server replies to this request, it can't read another,
// so we might as well run the handler in this goroutine.
// [*] Not strictly true: HTTP pipelining. We could let them all process
// in parallel even if their responses need to be serialized.
// But we're not going to implement HTTP pipelining because it
// was never deployed in the wild and the answer is HTTP/2.
serverHandler{c.server}.ServeHTTP(w, w.req)
  ...
}

下图代码中就进行判断 handler 是不是nil值,如果是则使用 DefaultServeMux 所维护的 Handler 路由服务进行处理。

接着,我们来分析第二个问题:http.ListenAndServe() 如何进行端口监听的呢?
http.ListenAndServe()先是通过 net.Listen("tcp", addr)收听本地网络地址上的广播, 然后拿到监听描述符,最后一直监听 Accept() 的请求连接。

ListenAndServeTLS()

ListenAndServeTLS() 函数是基于 ListenAndServe() 函数的基础上增加了安全证书,也是我们说的HTTPS
这里在简单说明下HTTPHTTPS的区别:
(1) HTTP是超文本传输协议,信息是明文传输,HTTPS则是具有安全性的SSL加密传输协议。
(2) HTTPHTTPS使用的是完全不同的连接方式,使用的端口也不一样,前者是80,后者是443。
(3) HTTP的连接很简单,是无状态的。
(4) HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比HTTP协议安全。
ListenAndServeTLS() 函数原型

func ListenAndServeTLS(addr, certFile, keyFile string, handler Handler) error

参数一 addr :监听网卡的IP地址与端口,如果值是空字符默认则是443端口。
参数二 certFile:证书文件,可以通过 crypto/tls 库去生成。(或者通过OpenSSL签发证书)
参数三 keyFile:证书Key
参数四 handler:和ListenAndServe()函数中的作用一致,是处理http路由服务处理程序。

函数使用
listenandservetls.go

func main() {
	http.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) {
		io.WriteString(w, "Hello, TLS!\n")
	})
	log.Fatal(http.ListenAndServeTLS(":443", "cert.pem", "key.pem", nil))
}

需要说明下,这里的 cert.pemkey.pem 证书与key文件是通过 crypto/tls 库中的 generate_cert.go 提供的代码块生成。
生成cert证书用法

macbookpro:net mac$ go run /usr/local/go/src/crypto/tls/generate_cert.go -host 127.0.0.1
2024/05/12 17:31:15 wrote cert.pem
2024/05/12 17:31:15 wrote key.pem

我这里的GOROOT路径是 /usr/local/go,大家可以通过 go env | grep GOROOT 命令查看具体的路径。
-host 127.0.0.1 参数:代表证书仅在本地环境测试使用。

下面,我们运行程序后,在浏览器访问 https://127.0.0.1地址,发现浏览器警告这是一个不安全的连接,因为我们的证书没经过受信任机构处理。

下面将所生成的证书加入到系统受信任区域,我所使用的是mac系统,下面操作根据系统步骤不太一样,大家可以根据系统自行搜索下。
首先找到我们的证书路径

操作完上面的配置后,我们在浏览器访问 https://127.0.0.1地址。(务必要先重启浏览器)

浏览器告诉我们,这次连接访问是安全的。
在浏览器开发调试模式下,也可以看到证书是安全的。

FileServer()

FileServer() 函数创建一个静态文件服务。
函数使用
fileserver.go

func main() {
	log.Fatal(http.ListenAndServe(":8080", http.FileServer(http.Dir("."))))
}

代码中把当前目录设置为根目录,本目录下的所有文件将展示在web页面中
在浏览器中访问 http://127.0.0.1:8080 地址,可以看到本地目录中的所有文件和目录都可以被访问到。

FileServerFs()

FileServerFS() 函数,使用文件系统的内容为HTTP请求提供服务的处理程序。

注:该函数是 go1.22.0 版本新增的特性。

函数使用
fileserverfs.go

func main() {
	filename := "index.html"
	contents := []byte("<h1>帽儿山的枪手</h1>")
	fsys := fstest.MapFS{
		filename: {Data: contents},
	}
	http.Handle("/", http.FileServerFS(fsys))
	log.Fatal(http.ListenAndServe(":8080", nil))
}

代码块中封装了html格式的文件内容,然后通过 FileServerFS() 函数发布服务。

技术文章持续更新,请大家多多关注呀~~

搜索微信公众号,关注我【 帽儿山的枪手 】

参考材料

  • https://pkg.go.dev/net/http#pkg-functions

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1683866.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

K8S认证|CKA题库+答案| 1. 权限控制RBAC

1、权限控制RBAC 您必须在以下Cluster/Node上完成此考题&#xff1a; Cluster Master node Worker node k8s master …

【云原生】Kubernetes 核心概念

什么是 Kubernetes Kubernetes&#xff0c;从官方网站上可以看到&#xff0c;它是一个工业级的容器编排平台。Kubernetes 这个单词是希腊语&#xff0c;它的中文翻译是“舵手”或者“飞行员”。在一些常见的资料中也会看到“ks”这个词&#xff0c;也就是“k8s”&#xff0c;它…

2024年信息素养大赛图形化编程、Python、算法创真题汇总

2024年信息素养大赛编程赛道初赛&#xff08;Scratch图形化编程、Python、C算法创意&#xff09;已经结束&#xff0c;根据Scratch实验室的了解全国青少年信息素养大赛初赛晋级及初赛成绩内容如下&#xff1a; 1.参赛选手将在 5 个工作日(节假日不计在内)内&#xff0c;通过信…

开源的数据标注工具--Label-Studio

最近在了解构建知识图谱的相关知识&#xff0c;收集了一些数据&#xff0c;对数据进行标注时尝试了下Label-Studio这个工具&#xff0c;它是开源的数据标注工具&#xff0c;个人觉得还是挺好用的。 Label-studio的安装 我是直接在服务器上用pip安装的&#xff0c;命令如下&am…

【刷题篇】位运算

文章目录 1、判定字符是否唯一2、丢失的数字3、两整数之和4、只出现一次的数字 II5、 消失的两个数字 1、判定字符是否唯一 class Solution { public:bool isUnique(string astr) {int nastr.size();if(n>26)//鸽巢原理return false;int bitMap0;for(auto& e : astr){in…

echart 折线图tooltip

运行结果 代码 import { truncate, merge } from lodash; import { getBasePieOptions, getTooltipFormatter } from "*/money/utils";const colorArray [#1F8BFF, #EDBE75, #26E3F0, #AF8FFF, #61DDAA, #FD996A, #8367E0, #1AAF87]export function getLineOptions…

大数据运维学习笔记之Ambari——筑梦之路

原则&#xff1a;分布式存储和分布式计算分开 今天就到这里啦。

以色列人Andi Gutmans开发的php zend

虽然目前php语言不行了【相关的文章前几年已经有人发过】&#xff0c;但这不是重点&#xff0c;重点是zend引擎的东西具有极大的技术价值&#xff0c;负责zend引擎实现的大佬都现在差不多都是40&#xff0c;50岁左右了&#xff0c;从1997&#xff0c;1998&#xff0c;2000到202…

记录centos中操作(查找、结束、批量)进程以及crontab定时写法的知识

环境&#xff1a;vps&#xff0c;centos7&#xff0c;python3。 近期写了个python程序&#xff0c;用青龙面板在centos上运行。程序中有while无限循环&#xff0c;但是我在青龙中设置了定时任务&#xff08;每隔半小时运行一次&#xff09;&#xff0c;于是造成了进程中有多个…

一个用Java编写的屏幕测距工具,包括游戏地图测量功能

该程序提供了一个简单便捷的方式&#xff0c;在屏幕上测量距离&#xff0c;包括游戏地图分析在内。它允许用户准确确定屏幕上两点之间的距离&#xff0c;帮助游戏过程中的战略规划、资源管理和决策制定。 特点&#xff1a; 简单易用的界面&#xff1a;直观的控制使测量距离变得…

C++的红黑树

目录 基本概念 插入结点的颜色 判断性质是否破坏 调整方式 u为g的右孩子 u存在且为红 u存在且为黑 u不存在 结论 红黑树结点定义 代码实现 基本概念 1、红黑树是一种特殊的二叉搜索树&#xff0c;每个结点会增加一个存储位表示结点的颜色&#xff08;红或黑&#x…

如何将老板的游戏机接入阿里云自建K8S跑大模型(下)- 安装nvidia/gpu-operator支持GPU在容器中共享

文章目录 安装nvidia/gpu-operator支持GPU在容器中共享 安装nvidia/gpu-operator支持GPU在容器中共享 安装 nvidia/gpu-operator遇到两个问题&#xff1a; 由于我们都懂的某个原因&#xff0c;导致某些镜像一直现在不成功。 解决办法&#xff0c;准备一个&#x1fa9c;&#…

如何理解kmp的套娃式算法啊?

概念 KMP算法&#xff0c;全称Knuth Morris Pratt算法 。文章大部分内容出自《数据结构与算法之美》 核心思想 假设主串是a&#xff0c;模式串是b 在模式串与主串匹配的过程中&#xff0c;当遇到不可匹配的字符的时候&#xff0c;对已经对比过的字符&#xff0c;是否能找到…

FME学习之旅---day27

我们付出一些成本&#xff0c;时间的或者其他&#xff0c;最终总能收获一些什么。 教程&#xff1a;Excel 入门 查看和检查 Excel 数据 1.读模块读取EXCEL文件 2.对源数据进行预览 Excel Reader 参数 |将 Excel 转换为 CSV 阅读 2020 年和平均值工作表&#xff0c;然后计算降…

运行Android项目时,提示错误: 程序包javax.annotation.processing不存在

今天在运行项目时提示错误: 错误: 程序包javax.annotation.processing不存在 import javax.annotation.processing.Generated; 最后是修改了Android Studio的JDK的路径修改为你安装的JDK路径&#xff0c;完成的修复&#xff1a;

thinkphp 多条件查询 不起作用 = like

不起作用的代码&#xff1a; &#xff08; where([category_id > $item[id]]) 没起作用 &#xff09; 传递参数 $model->where(product_name, like, "%$productName%") 不起作用 public function cateProductPage() {$builder new Builder(new CategoryMod…

基于transformers框架实践Bert系列4-文本相似度

本系列用于Bert模型实践实际场景&#xff0c;分别包括分类器、命名实体识别、选择题、文本摘要等等。&#xff08;关于Bert的结构和详细这里就不做讲解&#xff0c;但了解Bert的基本结构是做实践的基础&#xff0c;因此看本系列之前&#xff0c;最好了解一下transformers和Bert…

利用神经网络学习语言(一)——自然语言处理的基本要素

相关说明 这篇文章的大部分内容参考自我的新书《解构大语言模型&#xff1a;从线性回归到通用人工智能》&#xff0c;欢迎有兴趣的读者多多支持。 本文涉及到的代码链接如下&#xff1a;regression2chatgpt/ch10_rnn/tokenizer.ipynb 本系列文章将深入探讨一种应用广泛的神经…

hcia datacom学习(8):静态NAT、动态NAT、NAPT、Easy IP、NAT server

1.私网地址 在现实环境中&#xff0c;企业、家庭使用的网络是私网地址&#xff08;内网&#xff09;&#xff0c;运营商维护的网络则是公网地址&#xff08;外网&#xff09;。私网地址是在局域网&#xff08;LAN&#xff09;内使用的&#xff0c;因此无法被路由&#xff0c;不…

计算机毕业设计 | springboot药品库存追踪与管理系统 药店管理(附源码)

1&#xff0c;绪论 1.1 背景调研 如今药品调价频繁&#xff0c;且品种繁多&#xff0c;增加了药品销售定价的难度。药品来货验收登记中的审查有效期环节容易出错&#xff0c;错收过期或有效期不足的药品。 手工模式下的药品库存难以及时掌握&#xff0c;虽然采取了每日进行缺…