今天来回顾HTTP框架: 终端<->前端路由<->页面<->状态管理<->API接口层<->HTTP请求<-请求解析<->后端路由<->业务逻辑->数据库
1.HTTP:超文本传输协议 思考:一个常见的POST请求在协议层究竟做了什么? 常见的方法名:GET HEAD POST PUT DELETE CONNECT OPTIONS TRACE PATCH 状态码:1xx:信息类 2xx:成功 3xx:重定向 4xx:客户端错误 5xx:服务端错误
一个Demo:
import (
"context"
"code.byted.org/middleware/hertze/pkg/app"
"code.byted.org/middleware/hertz/pkg/app/server"
)
func main(){
h:=server.New()
h.POST("/sis",func(c context,Context,ctx*app,RequestContext){
ctx.Data(200,"text/plain;charset=utf-8",[]byte("OK"))
})
h.Spin()
}
HTTP1:对头阻塞、传输效率低、明文传输不安全 HTTP2:多路复用、头部压缩、二进制协议 QUIC:基于UDP实现、解决队头阻塞、加密减少握手次数、支持快速启动
分层设计:专注性、扩展性、复用性、高内聚、低耦合、易复用、高扩展性 应用层设计: *冗余性 提供合理的API、可理解性:如ctx.Body(),ctx.GerBody(),不要用ctx.BodyA() *兼容性 简单性:如ctx.Request.Header.Peek(key)/ctx.GetHeader(key) *可测性 *可见性
中间件设计 中间件需求: *配合Handler实现一个完整的请求处理生命周期 *拥有预处理逻辑与后处理逻辑 *可以注册多中间件 *对上层模块用户逻辑模块易用
洋葱模型适用场景:日志记录、性能统计、安全控制、事务处理、异常处理
调用链适用场景:不调用Next:初始化逻辑且不需要在同一个调用栈 调用Next:后处理逻辑或在同一调用栈上
路由设计: 框架路由实际上就是为了URL匹配对应的处理函数 *静态路由:/a/b/c、/a/b/d *参数路由:/a/:id/c(/a/b/c,/a/d/c)、/*all *路由修复:/a/b<->/a/b/ *冲突路由以及优先级:/a/b、/:id/c *匹配HTTP方法 *多处理函数:方便添加中间件
如何做设计 1.明确需求:考虑取出要解决什么问题,有哪些需求 2.业界调研:业界都有哪些解决方案可供参考 3.方案权衡:思考不同方案的取舍 4.方案评审:相关同学对不同方案做评审 5.确定开发:确定最合适的方案进行开发
API设计:可理解性、简单性。。。 中间件设计:洋葱模型 路由设计:前缀匹配树 协议层设计:抽象出合适的接口 网络层设计:网络模型