初探可编程网关 Pipy

有幸参加了 Flomesh 组织的workshop,了解了他们的 Pipy 网络代理,以及围绕 Pipy 构建起来的生态。Pipy 在生态中,不止是代理的角色,还是 Flomesh 服务网格中的数据平面。

整理一下,做个记录,顺便瞄一下 Pipy 的部分源码。

介绍

下面是摘自 Github 上关于 Pipy 的介绍:

Pipy 是一个轻量级、高性能、高稳定、可编程的网络代理。Pipy 核心框架使用 C++ 开发,网络 IO 采用 ASIO 库。 Pipy 的可执行文件仅有 5M 左右,运行期的内存占用 10M 左右,因此 Pipy 非常适合做 Sidecar proxy。

Pipy 内置了自研的 pjs 作为脚本扩展,使得Pipy 可以用 JS 脚本根据特定需求快速定制逻辑与功能。

Pipy 采用了模块化、链式的处理架构,用顺序执行的模块来对网络数据块进行处理。这种简单的架构使得 Pipy 底层简单可靠,同时具备了动态编排流量的能力,兼顾了简单和灵活。通过使用 REUSE_PORT 的机制(主流 Linux 和 BSD 版本都支持该功能),Pipy 可以以多进程模式运行,使得 Pipy 不仅适用于 Sidecar 模式,也适用于大规模的流量处理场景。 在实践中,Pipy 独立部署的时候用作“软负载”,可以在低延迟的情况下,实现媲美硬件的负载均衡吞吐能力,同时具有灵活的扩展性。

Pipy 的核心是消息流处理器:

Pipy 流量处理的流程:

核心概念

  • 流(Stream):Pipy
  • 管道(Pipeline)
  • 模块(Module)
  • 会话(Session)
  • 上下文(Context)

以下是个人浅见

Pipy 使用 pjs 引擎将 JavaScript格式的配置,解析成其抽象的 Configuration 对象。每个 Configuration 中包含了多个 Pipeline,每个 Configuration 中又会用到多个 Filter。这些都属于 Pipy 的静态配置部分。(后面会提到 Pipeline 的三种不同类型)

而属于运行时的就是流、会话和上下文了,在 Pipy 中,数据流是由对象(Pipy 的抽象)组成的。而这些对象抵达 Pipy,被抽象成不同的事件。而事件触发不同的过滤器的执行。

我个人更喜欢将其核心理解为:对数据流的事件处理引擎。

理解归理解,实践出真知。“大胆假设,小心求证!”

本地编译

从编译 Pipy 开始。

环境准备

#安装 nodejs
$ nvm install lts/erbium 
#安装 cmake
$ brew install cmake

编译 Pipy

https://github.com/flomesh-io/pipy.git 克隆代码。

Pipy 的编译包括了两个部分,GUI 和 Pipy 本体。

GUI 是 Pipy 提供的一个用于开发模式下进行配置的界面,首先编译Pipy GUI。

# pipy root folder
$ cd gui
$ npm install
$ npm run build

接着编译 Pipy 的本体

# pipy root folder
$ mkdir build
$ cd build
$ cmake -DCMAKE_BUILD_TYPE=Release -DPIPY_GUI=ON ..
$ make

完成后检查根目录下的 bin 目录,可以看到 pipy 的可执行文件,大小只有 11M。

$ bin/pipy --help
Usage: pipy [options] 
                    
                    

你可能感兴趣的:(初探可编程网关 Pipy)