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

type
Post
status
Published
date
Jun 25, 2024
slug
240625-higress
summary
多方寻求解决无果,结论是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
tags
推荐
工具
折腾
docker
go
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
 
Prev
天池大赛Higress插件官方demo详细部署+调试
Next
万里长征-04-脉脉
Loading...
Article List
talk is cheap
技术分享
万里长征
心情随笔
知行合一