Java程序员学习Go开发Higress的WASM插件

type
status
date
slug
summary
tags
category
icon
password
 

契机

今年天池大赛有higress相关挑战,研究一下。之前没搞过go,踩了很多坑,最主要的就是tinygo打包,多方寻求解决无果,结论是tinygo@0.32+go@1.19无法在macos arm架构下打包。升级go@1.21再次打包提示unsafe.SliceData requires go1.20 or later。后放弃macos+arm,采用ubuntu+amd64打包,ubuntu打包也必须使用tinygo@0.28.1。0.32.0在ubuntu仍然提示unsupported GOOS/GOARCH pair wasip1/wasm

环境布置

  • 包安装等可能需要依赖魔法,实在不行再配置代理仓库吧
  • 下载GoLand
  • 定位到higress/plugins/wasm-go/extensions目录
  • 安装Golang1.19,推荐直接在IDE中安装
    • 访问这个地方https://go.dev/dl/找安装包
    • macos下载好的安装文件直接安装,默认会安装到/usr/local/go目录
 

官方Demo

  • 用GoLand打开higress,找到/plugins/wasm-go/extensions/hello-world
  • 使用master分支
  • 当前24年6月25日19点,我使用的Revision版本:ef4a0243aceb59ad0e630c40683c429a4f1198a0
在GoLand中,直接在方法中使用json gjson,会自动在go.mod和main.go的require中增加相关的依赖
higress插件可以实现的4个钩子
  • HTTP 请求头处理阶段:wrapper.ProcessRequestHeadersBy
  • HTTP 请求 Body 处理阶段:wrapper.ProcessRequestBodyBy
  • HTTP 应答头处理阶段:wrapper.ProcessResponseHeadersBy
  • HTTP 应答 Body 处理阶段:wrapper.ProcessResponseBodyBy
proxywasm工具类可以实现的方法如下
分类
方法名称
用途
可以生效的HTTP 处理阶段
请求头处理
GetHttpRequestHeaders
获取客户端请求的全部请求头
HTTP 请求头处理阶段
ReplaceHttpRequestHeaders
替换客户端请求的全部请求头
HTTP 请求头处理阶段
GetHttpRequestHeader
获取客户端请求的指定请求头
HTTP 请求头处理阶段
RemoveHttpRequestHeader
移除客户端请求的指定请求头
HTTP 请求头处理阶段
ReplaceHttpRequestHeader
替换客户端请求的指定请求头
HTTP 请求头处理阶段
AddHttpRequestHeader
新增一个客户端请求头
HTTP 请求头处理阶段
请求 Body 处理
GetHttpRequestBody
获取客户端请求 Body
HTTP 请求 Body 处理阶段
AppendHttpRequestBody
将指定的字节串附加到客户端请求 Body 末尾
HTTP 请求 Body 处理阶段
PrependHttpRequestBody
将指定的字节串附加到客户端请求 Body 的开头
HTTP 请求 Body 处理阶段
ReplaceHttpRequestBody
替换客户端请求 Body
HTTP 请求 Body 处理阶段
应答头处理
GetHttpResponseHeaders
获取后端响应的全部应答头
HTTP 应答头处理阶段
ReplaceHttpResponseHeaders
替换后端响应的全部应答头
HTTP 应答头处理阶段
GetHttpResponseHeader
获取后端响应的指定应答头
HTTP 应答头处理阶段
RemoveHttpResponseHeader
移除后端响应的指定应答头
HTTP 应答头处理阶段
ReplaceHttpResponseHeader
替换后端响应的指定应答头
HTTP 应答头处理阶段
AddHttpResponseHeader
新增一个后端响应头
HTTP 应答头处理阶段
应答 Body 处理
GetHttpResponseBody
获取客户端请求 Body
HTTP 应答 Body 处理阶段
AppendHttpResponseBody
将指定的字节串附加到后端响应 Body 末尾
HTTP 应答 Body 处理阶段
PrependHttpResponseBody
将指定的字节串附加到后端响应 Body 的开头
HTTP 应答 Body 处理阶段
ReplaceHttpResponseBody
替换后端响应 Body
HTTP 应答 Body 处理阶段
HTTP 调用
DispatchHttpCall
发送一个 HTTP 请求
-
GetHttpCallResponseHeaders
获取 DispatchHttpCall 请求响应的应答头
-
GetHttpCallResponseBody
获取 DispatchHttpCall 请求响应的应答 Body
-
GetHttpCallResponseTrailers
获取 DispatchHttpCall 请求响应的应答 Trailer
-
直接响应
SendHttpResponse
直接返回一个特定的 HTTP 应答
-
流程恢复
ResumeHttpRequest
恢复先前被暂停的请求处理流程
-
ResumeHttpResponse
恢复先前被暂停的应答处理流程
-

编译生成WASM文件

 

本地调试

 
docker-compose.yaml
 
 

验证

 

总结

tinygo@0.32+go@1.19无法在macos arm架构下打包。升级go@1.21再次打包提示unsafe.SliceData requires go1.20 or later。后放弃macos+arm,采用ubuntu+amd64打包,ubuntu打包也必须使用tinygo@0.28.1。0.32.0在ubuntu仍然提示unsupported GOOS/GOARCH pair wasip1/wasm

写到最后

notion image
是在往前走就好 bothsavage.github.io
 
notion image
 
天池大赛Higress插件官方demo详细部署+调试万里长征-04-脉脉