Go语言基础之HTTP协议 | 青训营

150 阅读5分钟

字节跳动青训营笔记之HTTP协议

一、HTTP协议介绍:

1、HTTP协议是什么?

HTTP协议(超文本传输协议),是一种详细规定了浏览器和万维网(WWW = World Wide Web)服务器之间相互通信的规则,也是基于TCP/IP的应用层协议以及数据传送协议。

2、协议里面有什么?

HTTP是一共应用层协议,由请求和响应构成!

  • http请求(包括请求行、请求头、请求体)

  • http响应(包括响应行、响应头、响应体)

    例如:HTTP请求报文:

image.png

3、请求流程

  • 建立连接:

    客户端(例如浏览器)与服务器之间建立TCP连接。这是通过三次握手来完成的,确保双方都准备好进行通信。

  • 发送请求:

    客户端发送一个HTTP请求到服务器。请求包括请求方法(例如GET、POST)、请求URL、请求头部和请求体(可选)等信息。

  • 服务器响应:

    服务器接收到请求并进行处理,然后返回一个HTTP响应给客户端。响应包括响应状态码、响应头部和响应体等信息。

  • 接收响应:

    客户端接收到服务器的响应。它首先解析响应头部,以获取响应状态码和其他相关信息。然后,根据响应的内容类型,客户端可能会继续处理响应体。

  • 渲染页面:

    如果响应包含HTML内容,客户端会解析HTML并将其渲染成可视化的页面。这可能涉及加载和渲染CSS、JavaScript、图像和其他资源。

  • 断开连接:

    当所有的数据都传输完毕后,客户端和服务器之间的TCP连接会被断开。这是通过四次握手来完成的,确保双方都知道连接已经关闭。

二、HTTP框架的设计与介绍

1、分层设计

分层设计的目的是简化系统设计,让系统中不同的层次专注于它本身,然后我们只需要通过接口,通过特定层的开发,不需要关注底层实现。第二则是分层更容易横向扩展。

以下是协议的分层!

image.png

2、应用层设计

应用层序需要提供合理的API,包括以下:

  • 可解释性:使用主流的概念方便理解,如ctx.GetBody()或ctx.Body()而不是ctx.BodyA()
  • 简单性:常用API放到上层,易误用/低频AP放下层
  • 可见性:最小暴露原则,不需暴露API就不暴露,可抽象为接口
  • 冗余性:不需要冗余或能通过其他API组合得到的API
  • 兼容性:尽量避免break change做好版本管理

3、中间件设计

  • 配合Handler实现一个完整的请求处理生命周期
  • 拥有预处理逻辑和后处理逻辑
  • 可以注册多个中间件
  • 对上层模块用户逻辑模块易用

例如:

image.png

4、路由设计(如何查找路由)

框架路由实际上就是为URL匹配对应的处理函数(Handler)

  • 静态路由:/a/b/c、/a/b/d
  • 参数路由:/a/:id/c (/a/b/c)、/*all
  • 路由修复:/a/b <-> /a/b/
  • 冲突路由以及优先级:/a/b、/:id/c
  • 匹配HTTP方法
  • 多函数处理:方便添加中间件

三、性能修炼之道

1、针对网络库的优化

  • 存下全部header,http头部没有length,所以需存下全部header才能进行下一个解析
  • 减少系统调用次数,系统调用设计内核态和用户态切换
  • 复用内存,提高资源利用率
  • 针对header的处理可多次读

2、针对协议的优化

相关的headers快速解析

  • 通过key首字母筛掉完全不可能的key;
  • 解析对应value到独立字段;
  • 使用byte slice管理对应header存储,方便复用。

3、热点资源池化

每个请求都有requestcontext的资源,贯穿请求的完整生命周期,包括Request、Response、conn等,直到响应给client,与请求一一对应,高并发时,内存分配与释放对GC是非常大的压力,使用请求池,请求来时从中取出,做初始化并进行响应返回,处理完又放回池子,明显减少GC或runtime压力

image.png

  • 优点:减少内存分配、提高内存复用、减少GC压力、性能提升
  • 缺点:额外放回池中需做复杂的Reset逻辑,因为这块内存会被下次请求复用,不做Reset会给下次请求造成影响。其次超出请求生命周期该context不在可靠,里面数据不保证什么周期外可靠

四、课后思考

1、为什么HTTP框架要做分层设计?分层设计有哪些优势与劣势?

  • 分层设计可简化系统设计,让不同层专注做某一层次的事,只需通过接口,专注特定层开发即可,不需关注底层实现。其次分层更容易横向扩展。最后分层可做到很高的复用。

2、中间件还有没有其他实现方式?

  • Web服务器中间件:Web服务器中间件是最常见的HTTP中间件实现方式,它用于接收和处理HTTP请求,并将响应返回给客户端。常见的Web服务器中间件有Apache HTTP Server、Nginx等
  • Web框架中间件:Web框架中间件是在应用程序层面实现的HTTP中间件,它通常用于处理路由、认证、会话管理等功能。常见的Web框架中间件有Django、Flask、Express.js等。

3、路由还有哪些其他的实现方式?

  • 软件路由:软件路由是指通过软件程序实现路由功能,常见的软件路由方案包括使用开源软件如Quagga、Bird等,或者使用商业软件如Cisco IOS等。
  • 虚拟路由器:虚拟路由器是一种在虚拟化环境中实现路由功能的技术,它可以在一个物理路由器上运行多个虚拟路由器实例,每个实例可以独立地运行自己的路由协议和配置。
  • SDN(软件定义网络):SDN是一种通过将网络控制平面与数据转发平面分离的方式来实现网络管理和控制的技术,通过集中化的控制器来管理和配置网络设备,从而实现灵活的路由功能。