当前位置: 首页 > 后端技术 > Python

不知道路亚?Python助你快速上手ApacheAPISIX插件开发

时间:2023-03-25 22:15:33 Python

熟悉ApacheAPISIX的朋友都知道,之前我们在社区支持Java和Go语言的runner,今天ApacheAPISIXPythonRunner也来了。社区的朋友我们在开发ApacheAPISIX插件时有了一个新的选择。Python语言作为一种解释型高级编程语言,语法简单易用,代码可读性好,在跨平台性、可移植性、开发效率等方面表现良好。同时,作为一种高级编程语言,其封装性相对较高的抽象层次屏蔽了很多底层细节(例如:GC),使得我们在开发过程中可以更专注于应用逻辑的开发。同时,作为一门有30年历史的开发语言,其生态和各个模块已经非常完备。我们大部分的开发应用场景都可以从社区中找到非常成熟的模块或者解决方案。Python的其他优点我就不一一赘述了。当然,它的缺点也很明显:Python作为一种解释型语言,与C++、Go等编译型语言相比,性能差距比较大。理解:项目架构apache-apisix-python-runner这个项目可以理解为ApacheAPISIX和Python之间的桥梁。通过PythonRunner,可以直接将Python应用到ApacheAPISIX的插件开发中。最重要的是让更多对ApacheAPISIX和API网关感兴趣的Python开发者可以通过这个项目更多地了解和使用ApacheAPISIX。下面是ApacheAPISIX多语言支持的架构图。上图左边是ApacheAPISIX的工作流程,右边的PluginRunner是各个语言的插件运行器。本文介绍的apisix-python-plugin-runner就是支持Python语言的PluginRunner。在ApacheAPISIX中配置PluginRunner时,ApacheAPISIX会启动一个子进程来运行PluginRunner,该子进程与ApacheAPISIX进程属于同一用户。当我们重新启动或重新加载ApacheAPISIX时,PluginRunner也会重新启动。如果您为给定路由配置ext-plugin-*插件,则命中该路由的请求将触发ApacheAPISIX通过Unix套接字对PluginRunner进行RPC调用。调用分为两个阶段:ext-plugin-pre-req:执行ApacheAPISIX内置插件(Lua语言插件)之前ext-plugin-post-req:执行ApacheAPISIX内置插件之后插件(Lua语言插件),可以按照需要选择配置PluginRunner的执行时机。PluginRunner处理RPC调用,在内部创建模拟请求,然后运行用多种语言编写的插件,并将结果返回给ApacheAPISIX。多语言插件的执行顺序在ext-plugin-*插件配置项中定义,与其他插件一样,它们可以动态启用和重新定义。安装:部署与测试基本运行环境:ApacheAPISIX2.7、Python3.6+ApacheAPISIX安装部署可参考ApacheAPISIX官方文档:HowtobuildApacheAPISIX(https://github.com/apache/api...)用于部署。1.下载并安装PythonRunner$gitclonehttps://github.com/apache/apisix-python-plugin-runner.git$cdapisix-python-plugin-runner$makeinstall2.配置PythonRunner开发模式进行配置并运行PythonRunner$cd/path/to/apisix-python-plugin-runner$APISIX_LISTEN_ADDRESS=unix:/tmp/runner.sockpython3apisix/main.py开始修改ApacheAPISIX配置文件$vim/path/to/apisix/会议/配置。yamlapisix:admin_key:-name:"admin"key:edd1c9f034335f136f87ad84b625c8f1role:adminext-plugin:path_for_test:/tmp/runner.sock生产模式配置修改ApacheAPISIX配置文件$ml.ixvimconfigs/path/toapi/apiadmin_key:-名称:“admin”密钥:edd1c9f034335f136f87ad84b625c8f1角色:adminext-plugin:cmd:[“python3”,“/path/to/apisix-python-plugin-runner/apisix/main.py”,“开始”]PythonRunner配置(可选)如果需要调整LogLevel或UnixDomainSocket环境变量,可以修改Runner配置文件$vim/path/to/apisix-python-plugin-runner/apisix/config.yamlsocket:file:$env。APISIX_LISTEN_ADDRESS#环境变量或绝对路径记录:级别:调试#错误警告信息debug3。启动PythonRunner$cd/path/to/apisix#启动或重新启动$./bin/apisix[start|restart]启动或重启ApacheAPISIX,则ApacheAPISIX和PythonRunner已经配置并启动4.测试PythonRunner配置ApacheAPISIX路由和插件信息#使用默认的demo插件进行测试$curlhttp://127.0.0.1:9080/apisix/admin/routes/1-H'X-API-KEY:edd1c9f034335f136f87ad84b625c8f1'-XPUT-d'{"uri":"/get","plugins":{"ext-plugin-pre-req":{"conf":[{"name":"stop","value":"{\"body\":\"hello\"}"}]}},"upstream":{"type":"roundrobin","nodes":{"127.0.0.1:1980":1}}}'plugins.ext-plugin-pre-req.conf为Runner插件配置,conf为数组格式,多个插件可以同时设置。插件配置对象中的名称为插件名称,需要与插件代码文件和对象名称保持一致。插件配置对象中的值为插件配置,可以是JSON字符串。2.访问验证$curlhttp://127.0.0.1:9080/get-iHTTP/1.1200OKDate:Fri,13Aug202113:39:18GMTContent-Type:text/plain;charset=utf-8Transfer-Encoding:chunkedConnection:keep-alivehost:127.0.0.1:9080accept:*/*user-agent:curl/7.64.1X-Resp-A6-Runner:PythonServer:APISIX/2.7Hello,APISIX的PythonRunner实践:插件开发1.插件目录/path/to/apisix-python-plugin-runner/apisix/plugins会自动加载该目录下的.py文件。2.插件示例/path/to/apisix-python-plugin-runner/apisix/plugins/stop.py/path/to/apisix-python-plugin-runner/apisix/plugins/rewrite.py3。插件格式fromapisix.runner.plugin.baseimportBasefromapisix.runner.http.requestimportRequestfromapisix.runner.http.responseimportResponseclassStop(Base):def__init__(self):"""`stop`类型的示例插件,功能:此类插件可以自定义响应`body`、`header`、`http_code`此类插件将中断请求“””super(Stop,selfdef).__init__(self.__.__name__)(自我,请求:请求,响应:响应):“”“插件执行主函数:param请求:请求参数和信息:param响应:响应参数和信息:返回:“”##在在插件通过self.config`获取配置信息,如果插件配置为JSON将自动转换为典型结构#print(self.config)#设置响应头信息headers=request.headersheaders["X-Resp-A6-Runner"]="Python"response.headers=headers#设置响应体信息response.body="Hello,PythonXRunner"#APISI设置响应状态码response.status_code=201#通过调用`self.stop()`中断请求过程,请求会立即响应给客户端#如果没有显示调用`self.stop()`或显示调用`self.rewrite()`会继续请求#默认为`self.rewrite()`self.stop()4.插件规范及注意事项实现插件对象必须继承基类插件必须实现filter函数filter函数参数只能包含Request和Response类对象作为参数Request对象参数可以获取请求信息Response对象参数可以设置响应信息self.config可以获取插件配置信息在filter中调用self.stop()时功能,请求将是跨立即中断,响应数据会在过滤器函数self.rewrite()中调用,请求继续。投稿:参与项目目前各语言的ApacheAPISIXRunner还处于早期开发阶段,我们会逐步完善其功能。一个成功的开源项目离不开您的参与和贡献。欢迎大家参与ApacheAPISIXRunner的开发,让我们一起搭建ApacheAPISIX与各种语言的桥梁。具体项目请参考:apisix-python-plugin-runner(https://github.com/apache/api...)apisix-go-plugin-runner(https://github.com/apache/api...)apisix-java-plugin-runner(https://github.com/apache/api...)推荐阅读:Go让ApacheAPISIX更强大是一个动态的、实时的、高性能的开源API网关,提供负载均衡、动态上游、灰度发布、服务熔断、身份认证、可观察性等丰富的流量管理功能。ApacheAPISIX可以帮助企业快速安全地处理API和微服务流量,包括网关、KubernetesIngress和服务网格。全球已有数百家企业使用ApacheAPISIX处理关键业务流量,涵盖金融、互联网、制造、零售、运营商等,如NASA、欧盟数字工厂、中国航信、中国移动、腾讯、华为、微博、网易、贝壳找房、360、泰康、奈雪的茶等200多个贡献者创建了全球最活跃的开源网关项目ApacheAPISIX。聪明的开发商!快来加入这个活跃多元的社区,让我们为这个世界带来更多美好!ApacheAPISIXGitHub地址:https://github.com/apache/apisixApacheAPISIX官网:https://apisix.apache.org/ApacheAPISIX文档:https://apisix.apache.org/zh/...