WebIDE编写插件

云原生API网关通过插件为用户提供定制化的扩展能力。本文介绍如何通过WebIDE一站式完成自定义插件的开发和编译。

背景信息

为解决自定义插件编写门槛较高,搭建开发环境难等问题,云原生API网关提供了一个包含插件开发环境的WebIDE Runtime,用户可以通过WebIDE一站式完成自定义插件的开发和编译。

WebIDE内置集成云效仓库,代码资源属于用户,代码提交git化管理,支持持久化管理、内置流水线标准化环境以及自动化构建。

操作步骤

1.编写网关插件

  1. 登录云原生API网关控制台

  2. 在左侧导航栏,选择插件,并在顶部菜单栏选择地域。

  3. 在插件页面单击WebIDE编写插件在编辑插件页面单击新建

  4. 新建插件页面输入插件标识与插件名称,单击确定进入WebIDE开始编写网关插件。

2.构建与发布

网关插件代码编写完毕后,需完成构建与发布后,才可在网关进行安装。

  1. WebIDE控制台右上角单击构建,然后单击确认

    说明
    • 如果存在文件未提交时进行构建,需选择提交并构建或者直接构建,直接构建不会对未提交的内容进行构建。

    • 可单击右上角构建日志实时查看构建情况。

  2. 构建完成后单击右上角发布版本

  3. 在添加版本页完成相关配置,单击发布。配置说明如下:

    配置项

    配置说明

    示例

    版本号

    版本编号,格式需符合X.Y.Z

    1.0.0

    版本描述

    版本说明

    修改返回格式

    执行阶段

    阶段处理顺序:认证阶段 > 鉴权阶段 > 统计阶段 > 默认阶段。若不依赖其他插件执行顺序,填写默认阶段即可。

    默认阶段

    执行优先级

    控制执行阶段内的优先级,数字越大优先级越高。

    100

    适配网关版本

    • 任意版本:可以安装到任意版本的网关。

    • 指定版本:仅可以安装到指定版本(含)之后的网关版本。

    任意版本

插件代码基本结构

网关插件的开发包括配置解析和处理函数两个部分,配置解析是读取插件输入配置的过程,处理函数则是指请求头处理、请求体处理、响应头处理以及响应体处理的四个函数。

func init() {
	wrapper.SetCtx(
		// 插件名称,可自定义
		"my-plugin",

		// 设置自定义函数解析插件配置,此方法适合插件全局配置和路由、域名、服务级别配置内容规则一致的场景
		wrapper.ParseConfigBy(parseConfig),

		// 网关接收到客户端发送来的请求头数据时,设置自定义函数处理请求头
		wrapper.ProcessRequestHeadersBy(onHttpRequestHeaders),

		// 网关接收到后端服务响应的应答头数据时,设置自定义函数处理响应头
		wrapper.ProcessResponseHeadersBy(onHttpResponseHeaders),

		// 网关接收到客户端发送来的请求Body数据时,设置自定义函数处理请求体
		wrapper.ProcessRequestBodyBy(onHttpRequestBody),

		// 网关接收到后端服务响应的应答Body数据时,设置自定义函数处理响应体
		wrapper.ProcessResponseBodyBy(onHttpResponseBody),

		// 设置自定义函数处理流式请求体
		wrapper.ProcessStreamingRequestBodyBy(onHttpStreamingRequestBody),

		// 设置自定义函数处理流式响应体
		wrapper.ProcessStreamingResponseBodyBy(onHttpStreamingResponseBody),

		// 设置自定义函数处理流式请求完成
		//wrapper.ProcessStreamDoneBy(onHttpStreamDone),
	)
}

// MyConfig 自定义插件配置,可自行定义;插件无需配置时,直接定义空结构体即可(type MyConfig struct {})
type MyConfig struct {
	// 是否启用
	mockEnable bool
}

// 在控制台插件配置中填写的YAML配置会自动转换为JSON,此处直接从JSON这个参数里解析配置即可
func parseConfig(json gjson.Result, config *MyConfig, log logs.Log) error {
	// 解析出配置,更新到config中
	config.mockEnable = json.Get("mockEnable").Bool()
	return nil
}

// 请求头处理函数
func onHttpRequestHeaders(ctx wrapper.HttpContext, config MyConfig, log logs.Log) types.Action {
	proxywasm.AddHttpRequestHeader("hello", "world")
	if config.mockEnable {
		proxywasm.SendHttpResponse(200, nil, []byte("hello world"), -1)
	}
	return types.ActionContinue
}

// 请求体处理函数
func onHttpRequestBody(ctx wrapper.HttpContext, config MyConfig, body []byte, log logs.Log) types.Action {
	return types.ActionContinue
}

// 响应头处理函数
func onHttpResponseBody(ctx wrapper.HttpContext, config MyConfig, body []byte, log logs.Log) types.Action {
	return types.ActionContinue
}

// 响应体处理函数
func onHttpResponseHeaders(ctx wrapper.HttpContext, config MyConfig, log logs.Log) types.Action {
	return types.ActionContinue
}

使用大模型生成插件代码

WebIDE支持用户通过自然语言描述实现一键生成插件代码,相关操作步骤如下:

  1. WebIDE控制台右上角单击一键生成

  2. 在一键生成编辑框中详细描述需求。

  3. 单击确认,等待代码生成直至结束。

相关文档

  • 如果想了解如何进行插件开发,请参见开发插件

  • 如果想了解插件的安装、启用、卸载功能,请参见管理插件