首页 > 其他分享 >go~wasm插件的开发

go~wasm插件的开发

时间:2024-04-03 16:57:41浏览次数:21  
标签:插件 log buffer TinyGo wrapper Go wasm go types

Go和TinyGo是两种不同的Go语言编译器,它们之间有以下几点区别:

  1. 目标平台

    • Go:Go语言编译器主要面向通用计算机平台,如Windows、Linux、macOS等。
    • TinyGo:TinyGo专注于支持嵌入式系统和物联网设备等资源受限的平台,如微控制器、嵌入式设备、WebAssembly等。
  2. 性能

    • Go:Go编译器生成的可执行文件通常较大,运行速度较快,适合在通用计算机上运行。
    • TinyGo:TinyGo针对嵌入式系统做了优化,生成的可执行文件更小,运行速度可能会受到一定影响,但更适合在资源受限的环境下运行。
  3. 语言特性支持

    • Go:Go语言拥有完整的标准库和语言特性,适合构建各类应用程序。
    • TinyGo:由于针对嵌入式系统,TinyGo对部分Go语言特性和标准库进行了裁剪,不支持所有Go标准库,但提供了适用于嵌入式系统的替代方案。
  4. 编译器实现

    • 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)不同:

  1. func (config RedisConfig) BlackProcess(ctx wrapper.HttpContext, log wrapper.Log, val string, blackType string):这是一个针对RedisConfig类型值的方法,即使用值接收者。在调用该方法时,会对传入的RedisConfig对象进行值拷贝,方法内部对对象的修改不会影响原始对象。

  2. func (config *RedisConfig) BlackProcess(ctx wrapper.HttpContext, log wrapper.Log, val string, blackType string):这是一个针对RedisConfig类型指针的方法,即使用指针接收者。在调用该方法时,会直接操作指向RedisConfig对象的指针,方法内部对对象的修改会影响原始对象。

通常情况下,如果需要在方法内部修改接收者对象的状态或属性,应该使用指针接收者;如果不需要修改对象状态,只是对对象进行操作,可以使用值接收者。根据具体需求选择合适的接收者类型来定义方法。

标签:插件,log,buffer,TinyGo,wrapper,Go,wasm,go,types
From: https://www.cnblogs.com/lori/p/18113050

相关文章

  • go~连接redis的方法
    在Go语言中使用Redis,通常需要使用第三方库来实现与Redis服务器的交互。目前比较流行的Go语言Redis客户端库有go-redis和redigo等。这里以go-redis为例,简单介绍如何在Go语言中使用Redis。使用go-redis连接Redis数据库安装go-redis库:可以使用go命令行工具安装go-redis库:goget......
  • GO——变量定义规范,,类型,,常量,,函数,,包
    #1变量定义规范#25关键字forif。。。。#37个保留字intint8panic。。。#2变量定义1完整定义var变量名变量类型=变量值var变量名变量类型2类型推导(变量类型在定义阶段固定了,后期不能改变)var变量名=值......
  • Go_ if else语句 ,,循环,,switch,,数组
    if-else语句//if语法if定义变量;条件{}elseif条件{}else{}//输入分数,打印成绩等级packagemainimport"fmt"//iffuncmain(){ //1接收用户输入 varscoreint=0 fmt.Print("请输入分数:") fmt.Scan(&score) showLevel(score)......
  • django原生FBV
    1,django原生FBVurls.py#1,django原生FBVpath('origin/',FBV.view),path('origin2/<str:id>/',FBV.view_detail)view.pyimportjsonfromdjango.db.modelsimportQfromdjango.views.decorators.csrfimportcsrf_exempt,csrf_pro......
  • 30-ORM:CURD神器GORM包介绍及实战
      目前,GitHub上star数最多的是GORM,它也是当前Go项目中使用最多的ORM。 GORM基础知识介绍GORM是Go语言的ORM包,功能强大,调用方便。像腾讯、华为、阿里这样的大厂,都在使用GORM来构建企业级的应用。 功能全。使用ORM操作数据库的接口,GORM都有,可以满足我们开发中对数据库......
  • 2024-04-03:用go语言,在一个小城市里,有 m 个房子排成一排, 你需要给每个房子涂上 n 种颜
    2024-04-03:用go语言,在一个小城市里,有m个房子排成一排,你需要给每个房子涂上n种颜色之一(颜色编号为1到n),有的房子去年夏天已经涂过颜色了,所以这些房子不可以被重新涂色,我们将连续相同颜色尽可能多的房子称为一个街区。比方说houses=[1,2,2,3,3,2,1,1],它包含5个街......
  • Linux系统下安装MongoDB的详细步骤
    一、概述MongoDB由C++语言编写,是一个介于关系型数据库和非关系型数据之间的产品,是非关系型数据库中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似与json的bson格式,因此可以存储比较复杂的数据类型。MongoDB最大的特点是它支持的查询语言非常强大,其语......
  • golang—踩坑之切片
    1.记录一次切片引用错误,希望大家不要踩坑,用来惊醒自己!修改之前:import("context""encoding/json""feishu/global""feishu/structure""feishu/utils""fmt""github.com/gin-gonic/gin"......
  • 关于Unity Asset Store搜不到画线插件Vectrosity的问题(附带最新版本下载)
    Vectrosity是一个很好用的画线的插件,可以画出2D,3D,贝塞尔,圆,椭圆等各种线条图案,还可以给线段添加纹理,进行碰撞检查等,如果有多段线段的话,还能够检测到当前点击的是那段线段,我在项目中一直用的它,感觉还是挺稳定挺好用的。最近要开发另一个项目了,也要画线,就想着还用Vectrosity,去Asset......
  • 由浅到深认识Go语言(7):数组
    该文章Github地址:https://github.com/AntonyCheng/go-notes【有条件的情况下推荐直接访问GitHub以获取最新的代码更新】在此介绍一下作者开源的SpringBoot项目初始化模板(Github仓库地址:https://github.com/AntonyCheng/spring-boot-init-template【有条件的情况下推荐直......