Istio 实战:WasmPlugin(Proxy-Wasm 插件)功能拓展

功能一:添加 header(在代码里写死的 header,不做修改)

代码分析

主要是通过 proxywasm 库提供的 AddHttpRequestHeaderAddHttpResponseHeader 添加 header,同理可以实现 header 的删除和修改

部署生效

tinygo 编译生成 wasm 文件,dockerfile 生成镜像,然后在 wasmplugin 文件中引用该镜像

修改命名空间,执行 kubectl apply -f xxx.yaml 可以查看效果

apiVersion: extensions.istio.io/v1alpha1
kind: WasmPlugin
metadata:
  name: my-go-wasm-plugin
  namespace: mm-tmp
spec:
  selector:
    matchLabels:
      app: httpbin
  url: oci://registry.cn-hangzhou.aliyuncs.com/ydkmm/mm-github:1

查看效果

reponse header
在这里插入图片描述

request header
在这里插入图片描述

功能二:通过配置文件的方式,读取字段完成添加 header

代码分析

首先通过 GetPluginConfiguration 获取到 yaml 中配置的数据,创建对应的结构体,通过 json 解析并存储,然后再对数据做处理后添加到对应的 header 上

部署生效

配置文件的方式与代码里写死的区别就是只需要生成一次镜像,每次改动 header 的配置不需要修改代码重新生成镜像,直接修改 wasmplugin 的 yaml 文件后重新 apply 就可以了

修改命名空间,执行 kubectl apply -f xxx.yaml 可以查看效果

apiVersion: extensions.istio.io/v1alpha1
kind: WasmPlugin
metadata:
  name: my-go-wasm-plugin
  namespace: mm-tmp
spec:
  selector:
    matchLabels:
      app: httpbin
  url: oci://registry.cn-hangzhou.aliyuncs.com/ydkmm/mm-github:2
  pluginConfig:
    additionalRequestHeaders:
      - "sddad:813"
      - "reqrw:828"
    additionalResponseHeaders:
      - "oiuoi:814"
      - "lkjlkj:829"

查看效果

可以看到手动配置的 header 已经在 request 和 response 的 header 上了
在这里插入图片描述
在这里插入图片描述

功能三:实现方法级限流

代码分析

对方法级实现限流,因此 path+method 可以作为所有操作的唯一标识。采用 map 类型的数据结构可以很好的存储与处理数据

type pluginContext struct {
	// Embed the default plugin context here,
	// so that we don't need to reimplement all the methods.
	types.DefaultPluginContext

	// 指定方法的限流信息
	requestAndRateLimitInfo map[string]*RateLimitInfo
}

在 OnHttpRequestHeaders 中处理限流逻辑

	current := time.Now().UnixNano()
	// 超过填充时间直接填充令牌
	if current > ctx.pluginContext.requestAndRateLimitInfo[requestInfo].RefillNanoSec+10e9 {
		ctx.pluginContext.requestAndRateLimitInfo[requestInfo].RemainToken = ctx.pluginContext.requestAndRateLimitInfo[requestInfo].TokenNumber
		ctx.pluginContext.requestAndRateLimitInfo[requestInfo].RefillNanoSec = current
	}

	proxywasm.LogCriticalf("Current time %v, last refill time %v, the remain token %v",
		current, ctx.pluginContext.requestAndRateLimitInfo[requestInfo].RefillNanoSec,
		ctx.pluginContext.requestAndRateLimitInfo[requestInfo].RemainToken)

	if ctx.pluginContext.requestAndRateLimitInfo[requestInfo].RemainToken == 0 {
		if err := proxywasm.SendHttpResponse(403, [][2]string{
			{"powered-by", "proxy-wasm-go-sdk!!"},
		}, []byte("rate limited, wait and retry."), -1); err != nil {
			proxywasm.LogErrorf("failed to send local response: %v", err)
			proxywasm.ResumeHttpRequest()
		}
		return types.ActionPause
	}

部署生效

修改命名空间,执行 kubectl apply -f xxx.yaml 可以查看效果

apiVersion: extensions.istio.io/v1alpha1
kind: WasmPlugin
metadata:
  name: my-go-wasm-plugin
  namespace: mm-tmp
spec:
  selector:
    matchLabels:
      app: httpbin
  url: oci://registry.cn-hangzhou.aliyuncs.com/ydkmm/mm-github:3
  pluginConfig:
    # 路径:方法:时间:次数
    rateLimitConfig:
      - "/get:GET:10:5"
      - "/delete:DELETE:10:3"
      - "/get:DELETE:10:5"

查看效果

在这里插入图片描述

有任何需求帮助,欢迎私信

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/326290.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【控制篇 / 分流】(7.4) ❀ 02. 对不同运营商IP网段访问进行分流 ❀ FortiGate 防火墙

【简介】公司有两条宽带用来上网,一条电信,一条联通,访问常用的某些网站速度时快时慢。领导要求,根据上网流量的目标运营商IP归属,将流量送到相应的运营商出口去,避免跨运营商上网。那么应该怎么做&#xf…

vivado 使用IP Integrator源

使用IP Integrator源 在Vivado Design Suite中,您可以在RTL中添加和管理IP子系统块设计(.bd)项目或设计。使用Vivado IP集成程序,您可以创建IP子系统块设计。IP集成程序使您能够通过实例化和将Vivado IP目录中的多个IP核互连。可…

【PostgreSQL内核学习(二十一)—— 执行器(InitPlan)】

执行器(InitPlan) 概述InitPlan 函数代码段解释ExecInitNode 函数 总结 声明:本文的部分内容参考了他人的文章。在编写过程中,我们尊重他人的知识产权和学术成果,力求遵循合理使用原则,并在适用的情况下注明…

最新使用宝塔反代openai官方API接口搭建详细教程及502 Bad Gateway错误问题解决

一、前言 宝塔反代openai官方API接口详细教程,实现国内使用ChatGPT502 Bad Gateway问题解决, 此方法最简单快捷,没有复杂步骤,不容易出错,即最简单,零代码、零部署的方法。 二、实现前提 一台海外VPS服务…

SpringBoot教程(七) | SpringBoot解决跨域问题

SpringBoot教程(七) | SpringBoot解决跨域问题 上篇文章我们介绍了SpringBoot的拦截器的写法,其中有一个比较重要的步骤,就是把我们写好的拦截器注册到Spring的一个配置类中,这个类是实现了WebMvcConfigurer 接口,这个类很重要&a…

PRU pruss, rproc_pru和prueth uboot源码分析

概述 首先看一下PRU_ICSSG的功能框图,对于AM64来说,包含两个PRU_ICSSG模块。每个PRU_ICSSG共包含两个slice。 每个PRU core自己Local Instruction RAM, 容量不同。 PRU 内核执行任何指令之前,…

NXP-RT1176开发(一)——环境搭建(MCUXpressoIDE/VSCode)

目录 1. 安装IDE 1.1 官方开发的IDE软件 1.2 Config工具下载 1.3 说明(需先有SDK) 2. 下载SDK 3. VScode环境下编译 3.1 安装插件 3.2 确保本地有交叉编译工具链和CMAKE 3.3 加载本地SDK 3.4 导入例程编译 1. 安装IDE 该处理器编译规则可以MDK…

科普丨数据泄露防护DLP是什么(DLP数据泄露防护系统推荐)

在数字化时代,数据泄露的风险日益严峻,给企业和组织带来了巨大的威胁。为了应对这一挑战,数据泄露防护DLP(Data Loss Prevention)应运而生,成为保护数据安全的重要手段之一。 一、DLP数据泄露防护系统是什么…

高级RAG技术、以及算法实现

知识库地址:Advanced RAG techniques 检索增强生成(Retrieval Augmented Generation, RAG)为大语言模型(Large Language Model, LLM)提供了一种机制,通过从数据源检索到的信息为其生成的答案提供依据。简而…

C语言--质数算法和最大公约数算法

文章目录 1.在C语言中,判断质数的常见算法有以下几种:1.1.试除法(暴力算法):1.2.优化试除法:1.3.埃拉托色尼筛法:1.4.米勒-拉宾素性检验:1.5.线性筛法:1.6.费马小定理&am…

【前端发版】vue前端发版 步骤

1、 提交代码 代码合并通过之后到deb分支 2、git checkout 切换到dev分支上 运行起来看看自己刚刚提交的代码有没有错误 3、拉取最新代码 git pull 3、yarn run build 4、打包好的文件叫dist 重新命名为服务器里替换包名 5、登录文件传输 开始替换 替换的过程中 首先删除备…

如何一台电脑操作两个adb 设备

1.首先使用 adb devies 命令 2.然后使用 adb -s 上面的返回的id号 shell 进入对应的开发板

优化您的服务请求,增强用户体验和服务交付

您的服务请求模板是否像一个复杂的迷宫,给您的团队带来延误和困惑?您的技术人员是否厌倦了为了解最终用户的需求而与他们来回奔波?强大且可定制的请求模板可能正是您所需要的! 服务交付团队(尤其是 IT)的…

ubuntu服务器安装Slurm

相关内容,网上不少,这里记录一下自己出现的问题和解决方法,采用的是Ubuntu22.04,方法可以参考知乎上面这篇文章Ubuntu服务器安装配置slurm,整个安装过程没有什么问题,主要步骤贴在这里但在使用过程中&#…

Vue3响应式系统(一)

一、副作用函数。 副作用函数指的是会产生副作用的函数。例如:effect函数会直接或间接影响其他函数的执行,这时我们便说effect函数产生了副作用。 function effect(){document.body.innerText hello vue3 } 再例如: //全局变量let val 2f…

【MATLAB】Linux版本 高分辨率屏 调整显示缩放

0 引言 安装了linux版本的MATLAB R2023b之后,发现工具栏字体很小不方便使用,所以上网找到了MATLAB论坛上某位大佬的教程:参考链接,放在这里供各位参考 。 1 环境 这里注明我的matlab安装环境仅供参考,未在其他环境下…

Java基础 - 黑马

我是南城余!阿里云开发者平台专家博士证书获得者! 欢迎关注我的博客!一同成长! 一名从事运维开发的worker,记录分享学习。 专注于AI,运维开发,windows Linux 系统领域的分享! 知…

msvcp140.dll丢失都有什么办法可以解决呢?分享几种解决办法

msvcp140.dll是Windows操作系统中的一个重要动态链接库文件,它与许多软件的正常运行密切相关。当系统或软件无法找到或访问到该dll文件时,就会出现msvcp140.dll丢失的问题。这可能导致某些软件无法启动或崩溃,给用户带来不便。为了解决这个问…

Proxy的使用方法和13种拦截操作

前言 proxy是ES6新推出的方法,功能很强大。属于元编程,也就是修改js本身的一些东西。可以对数组,对象,函数等引用类型的对象进行一些复杂的操作。 其中,大部分人应该最熟悉的莫过于vue3中使用proxy替换了defineProperty,而且还实现了本身defineProperty不能实现的一些东西。 …

GO——gin中间件和路由

中间件 参考:https://learnku.com/articles/66234 结构 中间件是函数中间件函数被放在调用链上调用链的末尾是路由path对应的函数 执行过程 net/http包调用到gin的serverHTTP 参考:go/pkg/mod/github.com/gin-gonic/ginv1.7.7/gin.go:506 通过path找到…