用Rust开发Envoy wasm filter

Posted by 梁远鹏 on 2022-03-20 | 阅读 |,阅读约 3 分钟

TOC

目标

用WASM filter实现WWW-Authenticate认证,并且支持配置域名白名单和URL白名单.

了解envoy-wasm-rust-sdk例子

首先非常感谢tetratelabs的相关工作,因为我们是基于envoy-wasm-rust-sdk来开发这样的一个WASM filter的,这个开源仓库提供了三个示例并且都配有相应的docker-comose.yaml,可以非常方便的看到示例的效果.

有三个这样的示例:

  • 日志记录器
  • http过滤器
  • network过滤器

如果在这之前你已经看过这个项目的示例,那么看本文会很轻松,如果没有看过那我会推荐你先看一遍这篇文章,接着试一试envoy-wasm-rust-sdkhttp-filter示例,最后再回来看一遍这篇文章,效果会更好.

示例项目结构

在本文中我们了解http过滤器这个示例就可以了,因为后续内容都是基于这个示例来做修改的.

首先我们看一下这个示例的项目结构:

lan@lan:~/repo/git/envoy-wasm-rust-sdk/examples/http-filter$ tree .
.
├── Cargo.toml
├── docker-compose.yaml
├── envoy.yaml
├── README.md
├── src
│   ├── config.rs
│   ├── factory.rs
│   ├── filter.rs
│   ├── lib.rs
│   └── stats.rs
└── wasm
    └── module
        ├── Cargo.toml
        └── src
            └── lib.rs

这就是一个典型lib类型的cargo项目,最终的效果是将项目打包成一个wasm二进制文件.

在本文中我们主要关注的是config.rsfilter.rs

config.rs

config.rs主要是和配置相关的内容.

...
pub struct SampleHttpFilterConfig {
    #[serde(default)]
    pub param: String,
}
...
impl Default for SampleHttpFilterConfig {
    fn default() -> Self {
        SampleHttpFilterConfig {
            param: String::default(),
        }
    }
}

SampleHttpFilterConfig是这个filter需要使用到的一些配置,实现了Default这个Trait,简单理解的话就是说这个default()是Rust世界中的无参构造函数,new一个对象时给字段赋值.

还可以看到这个示例只有一个字符串类型的param字段,这个参数是可以在envoy的配置文件中作为参数传进来的(默认是envoy.yaml).

这个文件需要了解的内容就这么多:

  • 有一个配置对象
  • 可以添加字段并且实现Default这个Trait
  • 可以从envoy配置文件配置参数到这个对象对应字段

filter.rs

接下来了解下filter.rs这个文件时干嘛的,看名字可以猜到主要是过滤器需要过滤什么东西(过滤器的逻辑),

运行示例,看看效果

开发我们的filter逻辑

实现WWW-Authenticate认证逻辑

添加配置参数

实现域名白名单

实现URL白名单

总结

目前 https://github.com/tetratelabs/envoy-wasm-rust-sdk 不再维护,将尝试从 https://github.com/proxy-wasm/proxy-wasm-rust-sdk 开始示例。

到目前为止,我们使用Rust开发了一个支持参数配置的envoy wasm filter.

微信公众号

扫描下面的二维码关注我们的微信公众号,第一时间查看最新内容。同时也可以关注我的Github,看看我都在了解什么技术,在页面底部可以找到我的Github。

wechat-qrcode

温馨提示

本文还在持续创作中,如果你对本文主题感兴趣可以加我微信好友进行催更,博客下方可以找到我的微信联系方式 :)