• Higress 实战: 30行代码写一个 Wasm Go 插件


    前言

    在11月15号的直播 《Higress 开源背后的发展历程和上手 Demo 演示》中,为大家演示了 Higress 的 Wasm 插件如何面向 Ingress 资源进行配置生效,本文对当天的 Demo 进行一个回顾,并说明背后的原理机制。

    本文中 Demo 运行的前提,需要在 K8s 集群中安装了 Higress,并生效了下面这份 quickstart 配置:

    https://github.com/alibaba/higress/releases/download/v0.5.2/quickstart.yaml

    这个 Demo 要实现的功能是一个 Mock 应答的功能,需要实现根据配置的内容,返回 HTTP 应答。

    本文会按以下方式进行介绍:

    • 编写代码:代码逻辑解析
    • 生效插件:说明代码如何进行编译打包并部署生效
    • 测试插件功能:说明全局粒度,路由/域名级粒度如何生效
    • 插件生效原理:对整体流程进行回顾,说明插件生效的原理
    • 三个革命性的特性:介绍 Wasm 插件机制为网关插件开发带来的变革

    编写代码

    1. package main
    2. import (
    3. . "github.com/alibaba/higress/plugins/wasm-go/pkg/wrapper"
    4. "github.com/tetratelabs/proxy-wasm-go-sdk/proxywasm"
    5. "github.com/tetratelabs/proxy-wasm-go-sdk/proxywasm/types"
    6. "github.com/tidwall/gjson"
    7. )
    8. func main() {
    9. SetCtx(
    10. "my-plugin",
    11. ParseConfigBy(parseConfig),
    12. ProcessRequestHeadersBy(onHttpRequestHeaders),
    13. )
    14. }
    15. type MyConfig struct {
    16. content string
    17. }
    18. func parseConfig(json gjson.Result, config *MyConfig, log Log) error {
    19. config.content = json.Get("content").String()
    20. return nil
    21. }
    22. func onHttpRequestHeaders(ctx HttpContext, config MyConfig, log Log) types.Action {
    23. proxywasm.SendHttpResponse(200, nil, []byte(config.content), -1)
    24. return types.ActionContinue
    25. }

    上面代码中可以看到三个函数:

    • main:插件通过 main 函数定义插件上下文,包括插件名称,用于解析配置的函数,以及用于处理请求/应答的函数
    • parseConfig:这个函数通过在 SetCtx 中指定的 ParseConfigBy 被挂载到插件配置解析阶段,传入的三个参数分别是:
      • json:传入插件的配置,将统一序列化为一个 json 字典对象,提供 parseConfig 进行解析
      • config:parseConfig 将解析后的插件配置输出到这个 MyConfig 对象
      • log:提供日志输出接口
    • onHttpRequestHeaders:函数中调用的 proxywasm.SendHttpResponse,用于实现直接返回 HTTP 应答,这个函数通过在 SetCtx 中指定的 ProcessRequestHeadersBy 被挂载到解析请求 Header 的执行阶段,其他的挂载方式还有࿱
  • 相关阅读:
    pytorch 图像处理常见问题
    pdf文件丢失怎么办?别慌,详细介绍4种恢复方法
    基于 ECDSA 的 BSV 预言机
    MySQL binlog都有哪些模式?
    [ 一刷完结撒花!! ] Day50 力扣单调栈 : 503.下一个更大元素II |42. 接雨水 | 84.柱状图中最大的矩形
    网络通信day03
    二进制逻辑运算和基本门电路
    基于安卓Android银行排队叫号系统设计与实现
    jq命令用法总结
    Linus shell 在一个脚本中调用另外一个脚本变量
  • 原文地址:https://blog.csdn.net/weixin_43970890/article/details/128035994