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
- 使用GoLand拷贝代码https://github.com/alibaba/higress
- 定位到higress/plugins/wasm-go/extensions目录
- 安装Golang1.19,推荐直接在IDE中安装
- 访问这个地方https://go.dev/dl/找安装包
- macos下载好的安装文件直接安装,默认会安装到
/usr/local/go
目录
- TinyGo(要求 0.28.1 版本以上)安装
- 官方指引链接:https://tinygo.org/getting-started/install/
- macos直接brew install
- brew tap tinygo-org/tools
- brew install tinygo
- 报错You are using macOS 15…(刚升级15系统
- 下载安装https://tinygo.org/getting-started/install/macos/
- tar xvzf tinygo0.32.0.darwin-amd64.tar.gz
- 添加环境变量
- vim ~/.bash_profile
- 添加一行
export PATH=<extract location>/tinygo/bin:$PATH
- source ~/.bash_profile
官方Demo
- 用GoLand打开higress,找到/plugins/wasm-go/extensions/hello-world
- 使用master分支
- 当前24年6月25日19点,我使用的Revision版本:ef4a0243aceb59ad0e630c40683c429a4f1198a0
- 参考https://higress.io/zh-cn/docs/user/wasm-go/#2-编写-maingo-文件,把hello-world改造下顺便学习下语法
在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
写到最后
是在往前走就好
bothsavage.github.io
Last update: 2024-06-25