Python 带你快速上手 Apache APISIX 插件开发

目录
  • 一、了解:项目架构
  • 二、安装:部署测试
    • 1. 下载安装 Python Runner
    • 2. 配置 Python Runner
    • 3. 启动 Python Runner
    • 4. 测试 Python Runner
  • 三、实践:插件开发
    • 1. 插件目录
    • 2. 插件示例
    • 3. 插件格式
    • 4. 插件规范及注意事项

前言:

熟悉 Apache APISIX 的小伙伴都知道,之前在社区中我们已经支持了 Java 和 Go 语言的 Runner,今天 Apache APISIX Python Runner 也来了,社区中的小伙伴们在开发 Apache APISIX 插件时又多了一种新选择。

Python 语言作为一个解释型的高级编程语言,它语法简洁易上手、代码可读性好 ,在跨平台 、可移植性 、开发效率上都有很好的表现,同时作为一个高级编程语言它的封装抽象程度比较高屏蔽了很多底层细节(例如:GC )让我们在开发的过程中可以更专注应用逻辑的开发。

同时作为一个有 30 年历史的老牌开发语言,它的生态以及各种模块已经非常完善,我们大部分的开发和应用场景都可以从社区中找到很成熟的模块或解决方案。

Python 其他的优点就不再一一赘述,当然它的缺点也比较明显:Python 作为一门解释性语言,相较于 C++ 和 Go 这样的编译型语言,在性能上的差距还是比较大的。

一、了解:项目架构

apache-apisix-python-runner 这个项目可以理解为 Apache APISIX Python 之间的一道桥梁,通过 Python Runner 可以把 Python 直接应用到 Apache APISIX 的插件开发中,最重要的还是希望让更多对 Apache APISIX 和 API 网关感兴趣的 Python 开发者通过这个项目,更多地了解和使用 Apache APISIX,以下为 Apache APISIX 多语言支持的架构图。

上图左边是 Apache APISIX 的工作流程,右边的 Plugin Runner 是各语言的插件运行器,本文介绍的 apisix-python-plugin-runner 就是支持 Python 语言的 Plugin Runner

Apache APISIX 中配置一个 Plugin Runner 时,Apache APISIX 会启动一个子进程运行 Plugin Runner,该子进程与 Apache APISIX 进程属于同一个用户,当我们重启或重新加载 Apache APISIX 时,Plugin Runner 也将被重启。

如果你为一个给定的路由配置了 ext-plugin-* 插件,请求命中该路由时将触发 Apache APISIX 通过 Unix Socket Plugin Runner 发起 RPC 调用。调用分为两个阶段:

  • ext-plugin-pre-req :在执行 Apache APISIX 内置插件(Lua 语言插件)之前
  • ext-plugin-post-req :在执行 Apache APISIX 内置插件(Lua 语言插件)之后

大家可以根据需要选择并配置 Plugin Runner 的执行时机。Plugin Runner 会处理 RPC 调用,在其内部创建一个模拟请求,然后运行多语言编写的插件,并将结果返回给 Apache APISIX

多语言插件的执行顺序是在 ext-plugin-* 插件配置项中定义的,像其他插件一样,它们可以被启用并在运行中重新定义。

二、安装:部署测试

基础运行环境:Apache APISIX 2.7、Python 3.6+

Apache APISIX 的安装部署可参考 Apache APISIX 官方文档:如何构建 Apache APISIX (https://github.com/apache/api...)进行部署。

1. 下载安装 Python Runner

$ git clone https://github.com/apache/apisix-python-plugin-runner.git
$ cd apisix-python-plugin-runner
$ make install

2. 配置 Python Runner

  • 开发模式配置

运行 Python Runner:

    $ cd /path/to/apisix-python-plugin-runner
    $ APISIX_LISTEN_ADDRESS=unix:/tmp/runner.sock python3 apisix/main.py start
    修改 Apache APISIX 配置文件
    $ vim /path/to/apisix/conf/config.yaml
    apisix:
      admin_key:
        - name: "admin"
          key: edd1c9f034335f136f87ad84b625c8f1
          role: admin
    ext-plugin:
      path_for_test: /tmp/runner.sock
    
  • 生产模式配置

修改 Apache APISIX 配置文件

    $ vim /path/to/apisix/conf/config.yaml
    apisix:
      admin_key:
        - name: "admin"
          key: edd1c9f034335f136f87ad84b625c8f1
          role: admin
    ext-plugin:
      cmd: [ "python3", "/path/to/apisix-python-plugin-runner/apisix/main.py", "start" ]
    
  • Python Runner 配置(可选)

如果需要对 Log Level Unix Domain Socket 环境变量调整可以修改 Runner 的配置文件

$ vim /path/to/apisix-python-plugin-runner/apisix/config.yaml
socket:
  file: $env.APISIX_LISTEN_ADDRESS # Environment variable or absolute path

logging:
  level: debug # error warn info debug

3. 启动 Python Runner

$ cd /path/to/apisix
# Start or Restart
$ ./bin/apisix [ start | restart ]

启动或重启 Apache APISIX 即可,此时 Apache APISIX Python Runner 已经完成配置并启动。

4. 测试 Python Runner

配置 Apache APISIX 路由及插件信息:

# 使用默认demo插件进行测试
$ curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -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.confRunner 插件配置,conf 为数组格式可以同时设置多个插件。
  • 插件配置对象中 name 为插件名称,该名称需要与插件代码文件和对象名称一致。
  • 插件配置对象中 value 为插件配置,可以为 JSON 字符串。

 访问验证:

$ curl http://127.0.0.1:9080/get -i
HTTP/1.1 200 OK
Date: Fri, 13 Aug 2021 13:39:18 GMT
Content-Type: text/plain; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
host: 127.0.0.1:9080
accept: */*
user-agent: curl/7.64.1
X-Resp-A6-Runner: Python
Server: APISIX/2.7

Hello, Python Runner of APISIX

三、实践:插件开发

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.py

3. 插件格式

from apisix.runner.plugin.base import Base
from apisix.runner.http.request import Request
from apisix.runner.http.response import Response

class Stop(Base):
    def __init__(self):
        """
        Example of `stop` type plugin, features:
            This type of plugin can customize response `body`, `header`, `http_code`
            This type of plugin will interrupt the request
        """
        super(Stop, self).__init__(self.__class__.__name__)

    def filter(self, request: Request, response: Response):
        """
        The plugin executes the main function
        :param request:
            request parameters and information
        :param response:
            response parameters and information
        :return:
        """
        # 在插件中可以通过 `self.config` 获取配置信息,如果插件配置为JSON将自动转换为字典结构
        # print(self.config)

        # 设置响应头信息
        headers = request.headers
        headers["X-Resp-A6-Runner"] = "Python"
        response.headers = headers

        # 设置响应体信息
        response.body = "Hello, Python Runner of APISIX"

        # 设置响应状态码
        response.status_code = 201

        # 通过调用 `self.stop()` 中断请求流程,此时将立即响应请求给客户端
        # 如果未显示调用 `self.stop()` 或 显示调用 `self.rewrite()`将继续将请求
        # 默认为 `self.rewrite()`
        self.stop()

4. 插件规范及注意事项

  • 实现插件对象必须继承 Base
  • 插件必须实现 filter 函数
  • filter 函数参数只能包含 Request Response 类对象作为参数
  • Request 对象参数可以获取请求信息
  • Response 对象参数可以设置响应信息
  • self.config 可以获取插件配置信息
  • filter 函数中调用 self.stop() 时将马上中断请求,响应数据。
  • filter 函数中调用 self.rewrite() 时,将会继续请求。

到此这篇关于Python 带你快速上手 Apache APISIX 插件开发的文章就介绍到这了,更多相关Python  Apache APISIX 插件开发内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python常用扩展插件使用教程解析

    扩展插件 我下载的本版自带 pip下载工具 cmd-pip 下载插件 pip install HTMLParser 如果提示版本问题,更新PIP 别用开始里面的CMD 使用管理者权限 请注意差别 输入 python -m pip install --upgrade pip 开始更新 完毕后,正常下载其他插件 插件默认安装路径 python -m site Python3.5.1 下使用HTMLParser报错 pip 安装HTMLParser之后,import HTMLParser 使用的时候,

  • Python实现E-Mail收集插件实例教程

    __import__函数 我们都知道import是导入模块的,但是其实import实际上是使用builtin函数import来工作的.在一些程序中,我们可以动态去调用函数,如果我们知道模块的名称(字符串)的时候,我们可以很方便的使用动态调用 def getfunctionbyname(module_name, function_name): module = __import__(module_name) return getattr(module, function_name) 通过这段代码,

  • python抢购软件/插件/脚本附完整源码

    距上篇关于淘宝抢购源码的文章已经过去五个月了,五个月来我通过不停的学习,掌握了更深层的抢购技术及原理,而上篇文章中我仅分享了关于加入购物车的商品的抢购源码,且有部分不足. 博主不提供任何服务器端程序,也不提供任何收费抢购软件.该文章仅作为学习selenium框架及GUI开发的一个示例代码.该思路可运用到其他任何网站,京东,天猫,淘宝均可使用,且不属于外挂或者软件之类,只属于一个自动化点击工具,如有侵犯到任何公司的合法权益,请私信联系,会第一时间将相关代码给予删除. 本篇文章我将附上完整源码,及其

  • 基于Python第三方插件实现西游记章节标注汉语拼音的方法

    起因很单纯,就是给我1年级小豆包的女儿标注三国和西游章节的汉语拼音,我女儿每天都朗读 ,结果有很多字不认识,我爱人居然让我给标记不认识的完了手动注音......我勒个去......身为程序员的我怎么能忘记用程序实现呢,特别是咱也会点Python万能语言.哈哈!列举一下使用的技术. 语言:Python3.7 插件:pypinyin0.37.0  和 openpyxl 3.0.3 开发工具:pycharm 社区版 使用openpyxl操作execl的教程多的你无法想. 使用pypinyin将汉字转换

  • Python实现SQL注入检测插件实例代码

    扫描器需要实现的功能思维导图 爬虫编写思路 首先需要开发一个爬虫用于收集网站的链接,爬虫需要记录已经爬取的链接和待爬取的链接,并且去重,用 Python 的set()就可以解决,大概流程是: 输入 URL 下载解析出 URL URL 去重,判断是否为本站 加入到待爬列表 重复循环 SQL 判断思路 通过在 URL 后面加上AND %d=%d或者OR NOT (%d>%d) %d后面的数字是随机可变的 然后搜索网页中特殊关键词,比如: MySQL 中是 SQL syntax.*MySQL Micr

  • Python使用Chrome插件实现爬虫过程图解

    做电商时,消费者对商品的评论是很重要的,但是不会写代码怎么办?这里有个Chrome插件可以做到简单的数据爬取,一句代码都不用写.下面给大家展示部分抓取后的数据: 可以看到,抓取的地址,评论人,评论内容,时间,产品颜色都已经抓取下来了.那么,爬取这些数据需要哪些工具呢?就两个: 1. Chrome浏览器: 2. 插件:Web Scraper 插件下载地址:https://chromecj.com/productivity/2018-05/942.html 最后,如果你想自己动手抓取一下,这里是这次

  • Python插件机制实现详解

    插件机制是代码/功能反向依赖注入到主体程序的一种方法,编译型语言通过动态加载动态库实现插件.对于Python这样的脚本语言,实现插件机制更简单. 机制 Python的__import__方法可以动态地加载Python文件,即以某个py脚本的文件名作为__import__的参数,在程序运行的时候加载py脚本程序模块.对应的import关键字则是静态加载依赖的py模块. 描述 __import__() 函数用于动态加载类和函数 . 如果一个模块经常变化就可以使用 __import__() 来动态载入

  • Python中Pyenv virtualenv插件的使用

    介绍:pyenv-virtualenv是pyenv的一个插件,作用如同virtualenv一样,是用来管理虚拟环境的,配合pyenv主体使用可做到python的版本管理及虚拟环境的管理 安装:在正常安装了pyenv的情况下,pyenv-virtualenv也是随之被安装上的 1. 创建虚拟环境 在test目录下,创建一个名字为venv38,python版本为3.8.5的虚拟环境 pyenv virtualenv 3.8.5 venv38 # 如果不加3.8.5即不指定版本,则会使用当前系统的py

  • 详解PyCharm安装MicroPython插件的教程

    前言 PyCharm可以说是当今最流行的一款Python IDE了,大部分购买TPYBoard的小伙伴都会使用PyCharm编写MicroPython的程序.遗憾的是,只是把PyCharm当做了一种代码编辑器,调试依然还的需要其他辅助软件,比如PuTTY.其实最近也有不少小伙伴询问PyCharm中怎么安装MicroPython插件的问题,想着正好网站也缺少这部分的教程,不如实践一下总结下经验共享给大家,也好给爱好MicroPython的小伙伴提供便利. 准备工作 硬件要求 - TPYBoard

  • Python 带你快速上手 Apache APISIX 插件开发

    目录 一.了解:项目架构 二.安装:部署测试 1. 下载安装 Python Runner 2. 配置 Python Runner 3. 启动 Python Runner 4. 测试 Python Runner 三.实践:插件开发 1. 插件目录 2. 插件示例 3. 插件格式 4. 插件规范及注意事项 前言: 熟悉 Apache APISIX 的小伙伴都知道,之前在社区中我们已经支持了 Java 和 Go 语言的 Runner,今天 Apache APISIX Python Runner 也来了

  • 带你快速上手Servlet

    一.Servlet与Tomcat的关系 (1)Tomcat是什么? Tomcat其实是Web服务器和Servlet容器的结合体 (2)什么是Web服务器? 比如,我当前在杭州,你能否用自己的电脑访问我桌面上的一张图片?恐怕不行,我们太习惯通过URL访问的一个网站.下载一部电影了.一个资源,如果没有URL映射,那么外界几乎很难访问,而Web服务器的作用说穿了就是:将某个主机上的资源映射为一个URL供外界访问 二.什么是Servlet (1)什么是Servlet容器? Servlet是运行在Web服

  • 还在用if(obj!=null)做非空判断,带你快速上手Optional

    1.前言 相信不少小伙伴已经被java的NPE(Null Pointer Exception)所谓的空指针异常搞的头昏脑涨, 有大佬说过"防止 NPE,是程序员的基本修养."但是修养归修养,也是我们程序员最头疼的问题之一,那么我们今天就要尽可能的利用Java8的新特性 Optional来尽量简化代码同时高效处理NPE(Null Pointer Exception 空指针异常) 2.认识Optional并使用 简单来说,Opitonal类就是Java提供的为了解决大家平时判断对象是否为空

  • 十分钟带你快速上手Vue3过渡动画

    目录 写在前面 Vue的transition组件 过渡demo class的命名规则 使用animation 过渡模式 appear属性 animate.css库的使用 使用动画序列 使用自定义过渡class 写在最后 写在前面 在实际开发中,为了增加用户体验,经常会使用到过渡动画,而过渡动画在CSS中是通过transition和animation实现的.而在Vue中,Vue本身中内置了一些组件和API可以帮助我们方便的实现过渡动画效果:接下来我们就学习一下. Vue的transition组件

  • Python程序语言快速上手教程

    本来打算从网上找一篇入门教程,但因为Python很少是程序员的第一次接触程序所学的语言,所以网上现有的教程多不是很基础,还是决定自己写下这些. 如果没有程序基础的话,可能会觉得本文涵盖的内容有点多.对照大学里面常教的C语言的教学速度,本文大约有四五个课时的内容:对照网上程序类的视频 教程,大致相当于两三个小时的内容:对于翻一本程序书籍,大约相当于翻一个小时书.也因此,如果有深入学习的打算的话,为了效率还是推荐看书. 如果暂时不能理解本文中的一些内容也没关系,因为都是一些经常会用到的基础知识,在实

  • Python如何快速上手? 快速掌握一门新语言的方法

    那么Python如何快速上手?找来了一篇广受好评的新语言学习方法介绍,供大家参考. 听说,你决定要为你的 "技能树" 再添加一门特定的编程语言.那该怎么办呢? 在这篇文章中,作者提出了 12 项关于学习技术的建议.记住每个人学习的方式都不一样.其中一些可能对你十分有用,而其他的则可能无法满足你的需求.如果你开始担心一个策略,请尝试另一个策略并看看它哪里适合你. 1. 将其与类似的语言进行比较.当你首次观看有关该语言的第一个教程或阅读代码时,请尝试猜测该语言的每个部分将会做什么,并检查你

  • Python语言快速上手学习方法

    最近在学习Python,后面搞机器人项目需要用到,所以要快速上手,我使用的是PyCharm这个IDE,看起来就舒服,学习起来就有劲啦,作为一名有工作经验的老司机,我学习编程语言的方法不会像大学生那样从头到尾学一遍,我会选择,够用,能用,实用即可,拒绝晦涩的语法,在不影响效率的情况下,我会采取容易看懂,后期项目可维护性等的方式来学习和编程,至于如何灵活运用Python语言,我认为是需要在项目中,才能不断精进的,毕竟,作为一门编程语言,它仅仅只是工具而已. 如果要在python中写中文,则要在xx.

  • 一篇文章带你从零快速上手Rollup

    前言 项目中一直用的都是webpack,前一段需要开发几个类库供其他平台使用,本来打算继续用webpack的,但感觉webpack用来开发js库,不仅繁琐而且打包后的文件体积也比较大.正好之前看vue源码,知道vue也是通过rollup打包的.这次又是开发类库的,于是就快速上手了rollup. 本篇文章是我有了一定的项目实践后,回过来给大家分享一下如何从零快速上手rollup. 什么是rollup? 系统的了解rollup之前,我们先来简单了解下What is rollup? 关于rollup的

  • Python实战快速上手BeautifulSoup库爬取专栏标题和地址

    目录 安装 解析标签 解析属性 根据class值解析 根据ID解析 多层筛选 提取a标签中的网址 实战-获取博客专栏 标题+网址 BeautifulSoup库快速上手 安装 pip install beautifulsoup4 # 上面的安装失败使用下面的 使用镜像 pip install beautifulsoup4 -i https://pypi.tuna.tsinghua.edu.cn/simple 使用PyCharm的命令行 解析标签 from bs4 import BeautifulS

  • Python+ChatGPT实现5分钟快速上手编程

    目录 1.chatGPT是个啥 2.chatGPT怎么注册 3.chatGPT怎么用 4.小结 最近一段时间chatGPT火爆出圈!无论是在互联网行业,还是其他各行业都赚足了话题. 俗话说:“外行看笑话,内行看门道”,今天从chatGPT个人体验感受以及如何用的角度来分享一下. 1.chatGPT是个啥 chatGPT是最近新出来的玩意?并不是!在国内,chatGPT最早是在2022年11月就由OpenAI于推出的.只是去年底火了一把,后力不足又遇春节,热度草草就结束了. 先讲一下,OpenAI

随机推荐