编写插件
步骤一:初始化工程目录
go mod init wasm-demo-go
go env -w GOPROXY=https://proxy.golang.com.cn,direct
go get github.com/tetratelabs/proxy-wasm-go-sdk
go get github.com/alibaba/higress/plugins/wasm-go@main
go get github.com/tidwall/gjson
步骤二:编写main.go文件
示例如下所示,可以实现:
mockEnable: truehello worldmockEnable: falsehello: world
更多信息,请参见示例。
parseConfig
package main
import (
"github.com/alibaba/higress/plugins/wasm-go/pkg/wrapper"
"github.com/tetratelabs/proxy-wasm-go-sdk/proxywasm"
"github.com/tetratelabs/proxy-wasm-go-sdk/proxywasm/types"
"github.com/tidwall/gjson"
)
func main() {
wrapper.SetCtx(
// 插件名称
"my-plugin",
// 为解析插件配置,设置自定义函数
wrapper.ParseConfigBy(parseConfig),
// 为处理请求头,设置自定义函数
wrapper.ProcessRequestHeadersBy(onHttpRequestHeaders),
)
}
// 自定义插件配置
type MyConfig struct {
mockEnable bool
}
// 在控制台插件配置中填写的YAML配置会自动转换为JSON,此处直接从JSON这个参数里解析配置即可
func parseConfig(json gjson.Result, config *MyConfig, log wrapper.Log) error {
// 解析出配置,更新到config中
config.mockEnable = json.Get("mockEnable").Bool()
return nil
}
func onHttpRequestHeaders(ctx wrapper.HttpContext, config MyConfig, log wrapper.Log) types.Action {
proxywasm.AddHttpRequestHeader("hello", "world")
if config.mockEnable {
proxywasm.SendHttpResponse(200, nil, []byte("hello world"), -1)
}
return types.ActionContinue
}
wrapper.ProcessRequestHeadersByonHttpRequestHeadersproxywasm.AddHttpRequestHeaderproxywasm.SendHttpResponse
步骤三:编译生成WASM文件
tinygo build -o main.wasm -scheduler=none -target=wasi ./main.go
编译成功会在当前目录下创建文件main.wasm。该文件在下文本地调试的示例中也会被用到。
在使用云原生网关插件市场的自定义插件功能时,直接上传该文件即可。