http框架修炼之道|青训营笔记

81 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的第12篇笔记

http协协议

是什么

  • 超文本传输协议,text 图片 视频等待
  • 为什么需要协议
    • 需要明确的边界(开始和结束)
    • 能够携带信息

协议里有什么

  • 请求行/状态行 (方法名,URL,协议版本【协议版本,状态码,状态码描述】)

  • 请求头/响应头

  • 请求体/响应体

  • patch和put的区别?

    • patch对部分进行更新,put是完整更新

请求流程

截屏2022-05-28 下午10.53.39.png

各版本对比

  • http1
    • 队头阻塞
    • 传输效率低
    • 明文传输不安全
  • http2
    • TLS/SSL 实现加密传输
    • 多路复用
    • 头部压缩
    • 二进制协议
  • QUIC
    • 基于UDP的实现
    • 解决头部阻塞问题
    • 加密减少握手次数
    • 支持快速启动

http 框架的设计与实现

分层设计

  • 四层框架
  • 专注性,扩展性,复用性
  • 高内聚、低耦合,易复用,高扩展性

应用层设计

  • 提供合理的API
    • 可理解性
    • 简单性
    • 冗余性
    • 兼容性
    • 可测性
    • 可见性

中间件层设计

  • 洋葱模型
    • 预处理(日志-》metrics)
    • 后处理
    • 类似调用一个函数
    • 多个业务处理 -Next
    • 用户忘记主动调用? index设计主动递增
    • 出现异常想停止怎么办,调用链,(同时有调用next和无next)坑-不在一个调用栈上
  • 其他实现中间件的方式:路由设计
    • 框架路由实际上就是为URL匹配对应的处理函数
      • 根据路由选择不同的页面
      • 路由有静态路由(用map好匹配)和参数路由(map不好匹配)
        • 前缀匹配树
      • 如何匹配http方法?
        • 外层Map:根据method进行初步筛选
          • 路由映射表 【Map|method|[前缀树|头节点]】
      • 如何实现添加多处理函数? 每个节点用一个list存储handler
    • 如何查找路由?
      • 协议层设计,抽象出合适的接口
      • 网络层设计
        • BIO阻塞IO(阻塞等待,可能卡在读数据),NIO(非阻塞,方法:添加监听器)
        • 采用NIO,netpoll,网络库管理buffer

性能修炼之道

实践

  • http框架通常是前后端场景用
  • RPC框架大部分是内部
  • 框架比较多用工厂模式