前言
都说go标准库实用,Api设计简洁。这次就用go 标准库中的net/http包实现一个简洁的http web服务器,包括三种版本。
v1最简单版
直接使用http.HandleFunc(partern,function(http.ResponseWriter,*http.Request){})
HandleFunc接受两个参数,第一个为路由地址,第二个为处理方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
v2自定义Handler
查看标准库源码,v1版本实际上是调用了handle方法,传入的HandlerFunc实现了Handler的ServeHTTP方法,实际上是ServeHTTP在做http请求处理。
HandleFunc调用.png
HandleFunc实现Handler.png
Handler接口定义.png
由此我们可以自定义自己的Handler,v2版本代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
v3自定义server配置
前面对Handler开了一次刀,下面我们看看http.ListenAndServe()中有些什么秘密。
ListenAndServe.png
原来这里可以自定义http服务器配置,都在Server这个结构体中,这个对象能配置监听地址端口,配置读写超时时间,配置handler,配置请求头最大字节数...,所有稍微改造一下v2的程序得到v3版:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
|
拓展一下(如何平滑关闭http服务)
在go1.8中新增了一个新特性,利用Shutdown(ctx context.Context) 优雅地关闭http服务。
文档中描述:
Shutdown 将无中断的关闭正在活跃的连接,然后平滑的停止服务。处理流程如下:
- 首先关闭所有的监听;
- 然后关闭所有的空闲连接;
- 然后无限期等待连接处理完毕转为空闲,并关闭;
- 如果提供了 带有超时的Context,将在服务关闭前返回 Context的超时错误;
利用这个特性改造一下v3版本的程序,实现一个关闭http的提示
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
|
尝试访问 http://localhost:1210/bye 在控制台会得到以下提示结果,平滑关闭http服务成功:
成功平滑关闭.png
到此这篇关于详解Golang开启http服务的三种方式的文章就介绍到这了,更多相关Golang开启http服务内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!
原文链接:https://www.jianshu.com/p/fe502c586034
本文链接:https://my.lmcjl.com/post/15100.html
4 评论