当前位置:   article > 正文

Higress 实战: 30行代码写一个 Wasm Go 插件_wasm c++开发网关插件

wasm c++开发网关插件

前言

在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 的执行阶段,其他的挂载方式还有࿱
本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号