go~wasm插件的开发
Go和TinyGo是两种不同的Go语言编译器,它们之间有以下几点区别:
目标平台:
- Go:Go语言编译器主要面向通用计算机平台,如Windows、Linux、macOS等。
- TinyGo:TinyGo专注于支持嵌入式系统和物联网设备等资源受限的平台,如微控制器、嵌入式设备、WebAssembly等。
性能:
- Go:Go编译器生成的可执行文件通常较大,运行速度较快,适合在通用计算机上运行。
- TinyGo:TinyGo针对嵌入式系统做了优化,生成的可执行文件更小,运行速度可能会受到一定影响,但更适合在资源受限的环境下运行。
语言特性支持:
- Go:Go语言拥有完整的标准库和语言特性,适合构建各类应用程序。
- TinyGo:由于针对嵌入式系统,TinyGo对部分Go语言特性和标准库进行了裁剪,不支持所有Go标准库,但提供了适用于嵌入式系统的替代方案。
编译器实现:
- Go:Go编译器是使用Go语言本身实现的。
- TinyGo:TinyGo是一个基于LLVM的Go编译器前端,通过LLVM将Go代码编译为目标平台的机器码。
总的来说,Go适合构建通用计算机上的应用程序,而TinyGo则更适合用于嵌入式系统和物联网设备等资源受限的平台。选择使用哪种编译器取决于你的目标平台和需求。
github.com/alibaba/higress/plugins/wasm-go这个由阿里团队开发的包,目前2024-03-01已经集成了redis,目前只在阿里mse上使用,不支持本地化使用,目前本地化envoy环境还不支持这个东西。
可关注它的sdk,github.com/higress-group/proxy-wasm-go-sdk,目前最新版是202402026号的,再更新后,应该就支持了
没有封装的redis命令,可以这样使用
没有的命令可以先用 Command(cmds []interface{}, callback RedisResponseCallback),通过 []interface{}{"set", "id", 1} 这种方式执行redis命令
重写onHttpRequestBody之后需要设置请求体限制
- 当你需要接收请求体时,你需要将mse->参数配置->DownstreamConnectionBufferLimits,默认是32768 byte
- DownstreamConnectionBufferLimits:作用于网关连接,单条链接的buffer大小,配置后会影响吞吐和网关的内存使用
func onHttpRequestBody(ctx wrapper.HttpContext, config MyConfig, body []byte, log wrapper.Log) types.Action {
}
这句话的意思是:当配置单条链接的buffer大小时,这个配置会影响网关连接的吞吐量(即单位时间内处理的请求或数据量)和网关所使用的内存量。具体来说:
吞吐量影响:单条链接的buffer大小会直接影响数据在网关连接中的传输速度和效率。较大的buffer大小可能会提高数据传输的速度,从而增加吞吐量;而较小的buffer大小可能会导致数据传输速度变慢,降低吞吐量。
内存使用影响:配置单条链接的buffer大小后,会占用一定量的内存空间来存储这些buffer。如果buffer大小较大,将会消耗更多的内存资源;反之,如果buffer大小较小,则消耗的内存资源也相对较少。因此,合理配置buffer大小可以平衡吞吐量和内存使用之间的关系,以达到更好的性能表现。
对return types.ActionPause的理解
- return types.ActionPause请求被阻塞后,通过proxywasm.ResumeHttpRequest()恢复执行,这样其它插件(filter)可以继续执行
- 当前方法中,如果return types.ActionPause后面还有其它代码,这些代码不会被执行,因为方法已经退出了
如下代码,当eptid不为空时,执行了return types.ActionPause,及时它proxywasm.ResumeHttpRequest()了,那下面的代码username这块,也不会被执行
if eid != "" {
err := blackProcess(ctx, config, log, != "" {, BLACKLIST_EPTID)
if err != nil {
log.Errorf("blackProcess error while calling redis")
return types.ActionContinue
}
return types.ActionPause
}
if username != "" {
err := blackProcess(ctx, config, log, username, BLACKLIST_KCUSERNAME)
if err != nil {
log.Errorf("blackProcess error while calling redis")
return types.ActionContinue
}
return types.ActionPause
}
以下这两个方法定义有什么区别
- func (config RedisConfig) BlackProcess(ctx wrapper.HttpContext, log wrapper.Log, val string, blackType string)
- func (config *RedisConfig) BlackProcess(ctx wrapper.HttpContext, log wrapper.Log, val string, blackType string)
这两个方法定义的区别在于它们的接收者(Receiver)不同:
func (config RedisConfig) BlackProcess(ctx wrapper.HttpContext, log wrapper.Log, val string, blackType string):这是一个针对RedisConfig类型值的方法,即使用值接收者。在调用该方法时,会对传入的RedisConfig对象进行值拷贝,方法内部对对象的修改不会影响原始对象。func (config *RedisConfig) BlackProcess(ctx wrapper.HttpContext, log wrapper.Log, val string, blackType string):这是一个针对RedisConfig类型指针的方法,即使用指针接收者。在调用该方法时,会直接操作指向RedisConfig对象的指针,方法内部对对象的修改会影响原始对象。
通常情况下,如果需要在方法内部修改接收者对象的状态或属性,应该使用指针接收者;如果不需要修改对象状态,只是对对象进行操作,可以使用值接收者。根据具体需求选择合适的接收者类型来定义方法。
go~wasm插件的开发的更多相关文章
- WebAssembly 助力云原生:APISIX 如何借助 Wasm 插件实现扩展功能?
本文将介绍 Wasm,以及 Apache APISIX 如何实现 Wasm 功能. 作者朱欣欣,API7.ai 技术工程师 原文链接 什么是 Wasm Wasm 是 WebAssembly 的缩写.W ...
- Android组件化和插件化开发
http://www.cnblogs.com/android-blogs/p/5703355.html 什么是组件化和插件化? 组件化开发就是将一个app分成多个模块,每个模块都是一个组件(Modul ...
- 大熊君JavaScript插件化开发------(第一季)
一,开篇分析 Hi,大家!大熊君又来了,今天这系列文章主要是说说如何开发基于“JavaScript”的插件式开发,我想很多人对”插件“这个词并不陌生, 有的人可能叫“组件”或“部件”,这不重要,关键是 ...
- 使用 WordPress 插件模板开发高质量插件
WordPress 插件样板是标准化的,有组织的,面向对象的基础,用于构建高品质的 WordPress 插件.样板遵循编码标准和文件标准,所以你不必自己学习这些,根据注释编写代码即可. 官方网站 ...
- TinyFrame升级之八:实现简易插件化开发
本章主要讲解如何为框架新增插件化开发功能. 在.net 4.0中,我们可以在Application开始之前,通过PreApplicationStartMethod方法加载所需要的任何东西.那么今天我们 ...
- Android插件化开发
客户端开发给人的印象往往是小巧,快速奔跑.但随着产品的发展,目前产生了大量的门户型客户端.功能模块持续集成,开发人员迅速增长.不同的开发小组开发不同的功能模块,甚至还有其他客户端集成进入.能做到功能模 ...
- C#学习笔记-----基于AppDomain的"插件式"开发
很多时候,我们都想使用(开发)USB式(热插拔)的应用,例如,开发一个WinForm应用,并且这个WinForm应用能允许开发人员定制扩展插件,又例如,我们可能维护着一个WinService管理系统, ...
- Android应用插件式开发解决方法
转自:http://blog.csdn.net/arui319/article/details/8109650 一.现实需求描述 一般的,一个Android应用在开发到了一定阶段以后,功能模块将会越来 ...
- MS CRM 2011的自定义和开发(11)——插件(plugin)开发(三)
http://www.cnblogs.com/StoneGarden/archive/2012/02/06/2340661.html MS CRM 2011的自定义和开发(11)——插件(plugin ...
- MS CRM 2011的自定义和开发(11)——插件(plugin)开发(四)
http://www.cnblogs.com/StoneGarden/archive/2012/02/08/2343294.html MS CRM 2011的自定义和开发(11)——插件(plugin ...
随机推荐
- 【Java】关于获取注解的问题发现
同事设置了个注解,想用Spring获取的Bean来找到Class获取注解 但是发现是空的,在查看的Spring返回Bean之后,发现这个Bean对象并不是原生的实例 而是被Spring代理增强的代理对 ...
- 【Git】03 撤销 & 版本回退
回退分为三种情况,每种情况对应了我们文件的存储区域 工作区 | 暂存区 | 版本区(当前分支) 1.文件可能存放在工作区,没有被Git追踪[红色标记状态] 2.文件可能已经添加到暂存区,没有被Git提 ...
- docker 容器(container)使用ssh服务登录一段时间无操作后自动断开问题解决
如题,ssh登录建立好的docker容器,无操作一段时间后,发现ssh自动断开: 解决方法: 修改配置文件 /ect/ssh/sshd_config 在文件最后添加下面内容: PermitRootLo ...
- php 常用文件操作
判断文件或文件夹是否存在 file_exists() 打开文件 fopen() 关闭文件 fclose() 判断是否可写入 is_writable() 写入数据 fwrite() 测试文件指针是否到了 ...
- Java和LWJGL的关于OpenAL的文章
一.OpenAL的原理和基本概念: 1.1 OpenAL的架构 OpenAL的架构同样基于三个核心组件:Context(上下文).Source(声源)和Buffer(缓冲区).Context代表了音频 ...
- Go 链路追踪入门 Opentelemetry
前言 Opentelemetry 分布式链路跟踪( Distributed Tracing )的概念最早是由 Google 提出来的,发展至今技术已经比较成熟,也是有一些协议标准可以参考.目前在 Tr ...
- 记一次解决OTA死机重启bug,如何分析与解决措施?!
背景: 平台:stm32mp151平台 什么是OTA? 说起OTA我们应该都不陌生,它是一种可以为设备无损失升级系统的方式,能将新功能远程部署到产品上. 我们不仅可以通过网络下载OTA升级包,也可以通 ...
- 全志TinyVision芯片文章汇总
全志TinyVision芯片 TinyVision开发交流QQ群:821628986 文章目录汇总 教程共计14章,下面是章节汇总: 第0章_TinyVision套件简述 第1章_源码工具文档手册 第 ...
- .NET 网络唤醒
本文介绍下电脑设备关机的情况下如何通过网络唤醒设备,之前电源S状态 计算机Power电源状态- 唐宋元明清2188 - 博客园 (cnblogs.com) 有介绍过远程唤醒设备,后面这俩天了解多了点所 ...
- Java多线程并发之同步容器和并发容器-第一篇
Java多线程并发之同步容器和并发容器-第一篇 概述 本文主要讲解在Java多线程并发开发中,集合中有哪些支持并发的的.什么是同步容器(集合),什么是并发容器(集合)?并发容器分类有哪些?每个分类都有 ...