Apinto 网关进阶教程,插件开发入门指南

news2024/11/15 18:18:28

Apinto 是基于Go语言,由 Eolink 自主研发的一款高性能、可扩展、易维护的云原生 API 网关。Apinto 能够帮助用户简单、快速、低成本、低风险地实现:系统微服务化、系统集成、向合作伙伴、开发者开放功能和数据。

通过 Apinto,企业能够专注于自身业务的发展,并且让企业间能互相借力,实现共赢。

借助 Apinto 强大的插件拓展能力,用户可像乐高积木一样根据需要自行拓展Apinto 的插件,丰富 Apinto 的能力。

本篇文章将给大家介绍如何开发 Apinto插件,自行拓展 Apinto 网关能力

前置知识

插件执行流程

插件系统定义了 Access 、Proxy 两个插件执行周期,其执行阶段定义如下:

  • Access:客户端请求 Apinto,将请求转发给上游服务前执行;
  • Proxy:将响应返回给客户端前执行;

请求从客户端发出,到达路由进行转发前,按顺序从上到下进行每个插件的 Access 执行阶段,转发获取响应后,从下到上执行每个插件的 Proxy 执行阶段。

插件执行流程如下图,请求处理即为转发前执行的操作,响应处理即为转发获得响应后的操作。

 

插件实现 UML 图

插件实现采用工厂设计模式,系统初始化时,自动将插件工厂注册到插件管理器中,当有新增插件/修改插件需求时,插件工厂实例会创建插件执行器实例。

开发插件

为了更加直观介绍自定义开发插件,本文将以开发 响应重写 插件为例,完整代码可参考 [Apinto 项目响应插件]

定义插件配置

开发插件前,先确定插件的功能和界限,根据需求定义插件配置格式,此处以 响应重写 插件为例。


{
    "status_code":0,
    "body":"",
    "body_base64":true,
    "headers":{},
    "match":{
        "code":[]
    }
}

根据上述配置,定义插件配置结构体。


type Config struct {
 StatusCode int               `json:"status_code" label:"响应状态码" minimum:"100" description:"最小值:100"`
 Body       string            `json:"body" label:"响应内容"`
 BodyBase64 bool              `json:"body_base64" label:"是否base64加密"`
 Headers    map[string]string `json:"headers" label:"响应头部"`
 Match      *MatchConf        `json:"match" label:"匹配状态码列表"`
}

type MatchConf struct {
 Code []int `json:"code" label:"状态码" minimum:"100" description:"最小值:100"`
}

实现插件执行器

1. 定义执行器结构


type ResponseRewrite struct {
 drivers.WorkerBase
 statusCode int
 body       string
 headers    map[string]string
 match      *MatchConf
}

2. 实现 eosc.IWorker 接口


type IWorker interface {
   Id() string
   Start() error
   Reset(conf interface{}, workers map[RequireId]IWorker) error
   Stop() error
   CheckSkill(skill string) bool
}

当插件配置被修改时,将会调用 Reset 方法,重置执行器内置数据,当插件被删除时,将会调用 Stop 方法。

3. 实现 eosc.IFilter 接口


type IFilter interface {
   DoFilter(ctx EoContext, next IChain) (err error)
   Destroy()
}

该接口在转发流程中被调用,其中 DoFilter 方法执行插件主流程,Destory 方法则在插件被删除时,销毁实例。

由于插件有顺序,在实际调用时,会将插件编排成调用链,并通过 next.DoChain(ctx) 操作调用下一个插件,您可以自定义调用插件前的操作,即 Access阶段 ,也可以自定义调用插件后的操作,即 Proxy 阶段 。代码示例如下:


func (r *ResponseRewrite) DoFilter(ctx eocontext.EoContext, next eocontext.IChain) (err error) {
 return http_service.DoHttpFilter(r, ctx, next)
}

func (r *ResponseRewrite) DoHttpFilter(ctx http_service.IHttpContext, next eocontext.IChain) error {
 if next != nil {
  err := next.DoChain(ctx)
  if err != nil {
   log.Error(err)
  }
 }

 return r.rewrite(ctx)
}

func (r *ResponseRewrite) Destroy() {
 r.statusCode = 0
 r.body = ""
 r.headers = nil
 r.match = nil
}

定义工厂创建方法


func NewFactory() eosc.IExtenderDriverFactory {
 return drivers.NewFactory[Config](Create, Check)
}

func Create(id, name string, conf *Config, workers map[eosc.RequireId]eosc.IWorker) (eosc.IWorker, error) {
 err := conf.doCheck()
 if err != nil {
  return nil, err
 }

 //若body非空且需要base64转码
 if conf.Body != "" && conf.BodyBase64 {
  conf.Body, err = utils.B64DecodeString(conf.Body)
  if err != nil {
   return nil, err
  }
 }

 r := &ResponseRewrite{
  WorkerBase: drivers.Worker(id, name),
  statusCode: conf.StatusCode,
  body:       conf.Body,
  headers:    conf.Headers,
  match:      conf.Match,
 }

 return r, nil
}

结合上文代码,当插件新建时,插件工厂会调用 Create 方法和 Check 方法,Create 方法负责初始化插件执行器实例,Check 方法一般用来校验插件配置的合法性,Check 方法用户可以按需实现,但 Create 方法必须实现。

定义工厂注册方法


const (
 Name = "response_rewrite"
)

func Register(register eosc.IExtenderDriverRegister) {
 register.RegisterExtenderDriver(Name, NewFactory())
}

将插件注册到拓展驱动管理器中

文件名:app/apinto/worker.go

 

使用插件

开发完成后,新插件就会被同步到节点插件中。我们可以在控制台界面 基础设施 > 节点插件新建插件

 

 新建插件时选择 eolinker.com:apinto:{插件名},本次演示的插件名为 response_rewrite,因此选择插件 eolinker.com:apinto:response_rewrite

若想了解插件的详细使用教程,可点击链接。

写在最后

本文简单介绍了插件入门相关细节,使用者可以根据业务需要,自行开发、安装/卸载、开启/关闭、编排插件,丰富网关能力,强化网关功能。

未来我们计划支持多语言插件,引入插件市场,个人开发者/企业可以将开发的插件贡献到插件市场中,与 Apinto 社区的使用者共享,合作共赢。

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

天锐绿盾加密软件——「文件数据防泄密系统」

文件加密功能 采用透明加解密技术, 企业内部文件自动加密,内部正常使用,不改变使用习惯。加密后的文件未经许可,私自外发拷贝到公司以外,都将显示为乱码无法使用,从源头上保障核心数据安全。 产品跨平台支持…

Vulhub之sick0s篇

靶场 靶机wp:【网络安全】sick0s 靶场实践之getshell - 知乎 靶机地址:https://download.vulnhub.com/sickos/sick0s1.1.7z 环境搭建 将虚拟机网络配置为nat与kali同一网络模式 kali扫描同一网段内存活的ip 访问目标端口web服务 3128端口是squid代理…

Python Pandas 处理Excel数据 制图

目录 1、饼状图 2、条形统计图 1、饼状图 import pandas as pd import matplotlib.pyplot as plt import numpy as np #from matplotlib.ticker import MaxNLocator # 解决中文乱码 plt.rcParams[font.sans-serif][SimHei] plt.rcParams[font.sans-serif]Microsoft YaHei …

Android事件分发机制被我翻烂了

作者:积木zz 这次说下Android中的事件分发机制 从开始点击屏幕开始,就会产生从Activity开始到decorview一直到最里层的view一连串事件传递。每一层view或者viewgroup都会首先调用它的dispatchTouchEvent方法,然后判断是否就在当前一层消费掉事…

软件设计风格(干货)-架构师之路(九)

一、软件架构风格概念 Architecture架构,体系结构 软件体系结构风格是 描述某一特定应用领域中 系统组织方式 的惯用模式。架构风格定义一个系统家族,即 一个架构的定义、一个词汇表和一组约束。词汇表包含 一些构建和连接类型,而一组约束 …

监控 FTP 服务器

文件传输协议 (FTP) 用于在 TCP/IP 网络中的服务器和客户端之间传输文件,它是一种标准协议,广泛用于在各个垂直行业的组织之间从集中位置存储和分发数据。FTP协议的其他一些安全版本如下: SSH 文件传输协议 &#xff…

SpringBoot-1-Spring Boot实战:快速搭建你的第一个应用,以及了解原理

SpringBoot-1-Spring Boot实战:快速搭建你的第一个应用,以及了解原理 今日内容 SpringBootWeb入门 前言 我们在之前介绍Spring的时候,已经说过Spring官方(Spring官方)提供很多开源项目,点击projects,看到spring家族…

中国CV军团,危矣?!

大数据产业创新服务媒体 ——聚焦数据 改变商业 近期,云从科技发布了2023年半年报。应该说,云从科技交出的成绩单很不好。事实上,商汤、旷视等CV厂商的情况也好不到哪去。云从科技的处境有一定的代表性,因此,我们将通…

Python“牵手”拼多多商品评论数据采集方法,拼多多API申请步骤说明

拼多多平台API接口是为开发电商类应用程序而设计的一套完整的、跨浏览器、跨平台的接口规范,拼多多API接口是指通过编程的方式,让开发者能够通过HTTP协议直接访问拼多多平台的数据,包括商品信息、店铺信息、物流信息,评论数据等&a…

国内常见的几款可视化Web组态软件

组态软件是一种用于控制和监控各种设备的软件,也是指在自动控制系统监控层一级的软件平台和开发环境。这类软件实际上也是一种通过灵活的组态方式,为用户提供快速构建工业自动控制系统监控功能的、通用层次的软件工具。通常用于工业控制,自动…

机器学习分类,损失函数中为什么要用Log,机器学习的应用

目录 损失函数中为什么要用Log 为什么对数可以将乘法转化为加法? 机器学习(Machine Learning) 机器学习的分类 监督学习 无监督学习 强化学习 机器学习的应用 应用举例:猫狗分类 1. 现实问题抽象为数学问题 2. 数据准备…

Electron 报gpu_process_host.cc(951)] GPU process launch faile错误

解决方法,在入口js文件中,添加如下代码: app.commandLine.appendSwitch(no-sandbox)

Vulhub之Shiro篇

CVE-2010-3863--认证绕过 1、启动靶机 在终端里进入事先进入准备好的vulhub靶场目录下 cd /vulhub-master/shiro/CVE-2010-3863 sudo docker-compose up -d 2、直接请求管理页面/admin,无法访问,将会被重定向到登录页面 3、构造恶意请求/./admin&…

Nvidia Jetson 编解码开发(5)Jetpack 5.x版本Multimedia API 硬件编码开发

1.前言 基于之前的开发程序 Nvidia Jetson 编解码开发(2)Jetpack 4.x版本Multimedia API 硬件编码开发--集成encode模块_free-xx的博客-CSDN博客 开发版本是基于JetPack 4.x版本 现在需要迁移到JetPack 5.x版本(新发布的Orin/Orin NX/Orin Nano都是JetPack 5.x版本) 尝…

Arch Linux 开发人员近日发布了 Archinstall 2.6

导读经过几个月的努力,Arch Linux 开发人员近日发布了 Archinstall 2.6,作为 Arch Linux 官方文本模式安装程序的最新稳定版本,它带来了几个新功能和许多改进。 Archinstall 2.6 支持 Hyperland 自定义动态平铺 Wayland 窗口管理器&#xff0…

Python在文件中对字母、单词频度统计

读入给定的文本文件“hamlet.txt”,编写两个函数分别实现: 1) 统计所有字母的出现频度,依据频度从高到低,显示前5个字母及其频度,同时把结果写入文件“hamlet_字母频度.txt”。 2) 统计所有单词的出现频度,依据频度从高到低,显示…

数据结构作业——哈夫曼树

/*【基本要求】 (1) 从文件中读出一篇英文文章,包含字母和空格等字符。 (2) 统计各个字符出现的频度。 (3) 根据出现的频度,为每个出现的字符建立一个哈夫曼编码,并输出。…

Open-Cascade 编译全过程-以及注意事项

1.从Github上下载 该源码库; https://github.com/Open-Cascade-SAS/OCCT 2.再从下面网站,下载需要的地方库文件: 从这个地址下载需要的文件; 3rd party Components | Open CASCADE Technology 3.使用cmak gui进行构建编译; 关键地方以及坑所在得点: 如果其编…

打破壁垒,实现高效的跨部门协作与沟通

在如今复杂多变的商业环境下,企业间需要跨越多个部门的壁垒进行协作及沟通以完成企业目标。尽管如此,许多企业仍然面临协作过程中出现不必要的误解、重复、延迟和错失机会等问题。为此,现代技术提供了一些解决方案,其中最为成功的…

【Terraform学习】使用 Terraform 创建Amazon VPC(Terraform-AWS最佳实战学习)

使用 Terraform 创建Amazon VPC 实验步骤 前提条件 安装 Terraform: 地址 下载仓库代码模版 本实验代码位于 task_vpc 文件夹中。 变量文件 variables.tf 在上面的代码中,您将声明,aws_access_key,aws_secret_key和 区域变量…