github.com/vicanso/pike@v1.0.1-0.20210630235453-9099e041f6ec/docs/modules.md (about)

     1  ---
     2  description: 程序中的主要模块
     3  ---
     4  
     5  Pike有6个主要模块,下面对这些模块一一介绍。
     6  
     7  <p align="center">
     8  <img src="./images/modules.png"/>
     9  </p>
    10  
    11  ## Compress
    12  
    13  压缩模块主要提供数据解压与压缩服务,数据解压可针这几类压缩算法:gzip, br, lz4, zstd, snappy,用于在接收到upstream返回的数据时,根据其数据压缩类型,解压出原始数据。压缩则只提供gzip与br压缩,因为压缩的数据是响应返回至客户端(如浏览器),而现在的客户端支持的压缩算法主要为以上两种。
    14  
    15  什么场景下upstream需要返回压缩的数据呢,,主要考虑的是以下场景:
    16  
    17  - pike与upstream是在同一内网,网络传输不存在瓶颈问题,则upstream返回数据时不需要压缩
    18  - pike与upstream部署在不同的IDC,网络通过专线传输,此时则可以考虑使用zstd或者snappy压缩响应数据,减少专线带宽的使用
    19  - pike与upstream的访问通过公网访问,由于公网的网络性能较差,此时尽可量考虑使用br或者zstd压缩响应数据,提升性能
    20  
    21  下面表示展示了压缩算法执行100次压缩解压的测试结果(原始数据160KB的json数据):
    22  
    23  <p align="center">
    24  <img src="./images/compression-performance.jpg"/>
    25  </p>
    26  
    27  由上图可以看出,br压缩使用的时间较长,一般建议使用6则可,而内网或专线等网络较好而又希望减少带宽占用的,可以在pike与upstream使用snappy,减少带宽占用,节约成本。
    28  具体测试代码[compression-performance](https://github.com/vicanso/compression-performance)。
    29  
    30  ## Cache
    31  
    32  缓存模块主要针对GET、HEAD的相关请求,保存缓存的数据或hit for pass状态,主要由以下小模块组成:
    33  
    34  - `Dispatcher` 该模块使用memhash对请求生成hash,从初始化的LRU列表中获取对应的LRU
    35  - `LRU` LRU缓存,缓存http cache对象
    36  - `HTTPCache` http cache对象,控制当相同的请求访问时,如果状态未知,只允许一个请求转发至upstream,其它的访问等待。而在获取到状态后,如果是可缓存则直接返回,若是hit for pass则转发至upstream.
    37  - `HTTPResponse` http response对象,根据请求的客户端接受的编码以及响应数据长度,选择最合适的压缩方式并返回
    38  
    39  缓存的详细流程请阅读[缓存模块](./cache-handler.md),缓存模块使用压缩模式实现数据压缩。
    40  
    41  ## Upstream
    42  
    43  Upstream模块,该模块实现对配置的upstream服务检测是否可用,按指定的策略返回对应的server地址,实现的功能如下:
    44  
    45  - 定时检测配置的各服务地址是否正常(配置health check的则使用http访问,如果未配置,则以tcp的方式检测端口)
    46  - 根据配置的策略选择可用的服务地址
    47  
    48  ## Location
    49  
    50  Location模块,该模块根据配置的host与prefix规则,判断请求是否属于该location,如果属于则将请求转发至其下的upstream,实现的功能如下:
    51  
    52  - 根据host与prefix判断请求是否属于该location
    53  - 根据配置的rewrite,在转发前修改url,在完成后恢复
    54  - 根据配置的query string以及request header,将当前配置添加至请求中
    55  - 获取响应后将配置的response header添加至响应头中
    56  
    57  ## Config
    58  
    59  Config模块,该模块主要实现配置的读写,支持使用文件与etcd的形式保存配置,并可检测配置变化实时更新配置。
    60  
    61  ## Server
    62  
    63  Server模块,该模块监控端口,在接收新的请求时,通过各中间件完成缓存的读取或转发,实现的功能如下:
    64  
    65  - `Error` 出错中间件将出错转换为对应的json响应或text响应
    66  - `Fresh` 304中间件处理,根据请求头与响应头判断数据是否无修改
    67  - `Responder` 响应中间件,使用`HTTPResponse`根据客户端响应适当的数据
    68  - `Cache` 缓存中间件,获取当前请求对应的缓存,如果有响应则设置缓存,否则则转至下一中间件
    69  - `Proxy` proxy中间件,根据当前请求获取对应的location,转发至相应的upstream服务器地址,获取成功后则设置响应数据