cba得分上双

admin · 2009-02-01

  

  除了 APISIX 官方内置的插件以外,咱们也可能凭据我方的需要去自界说插件,要自界说插件必要行使到 APISIX 供给的 Runner,现在曾经接济 Java、Go 和 Python 叙话的 Runner,这个 Runner 相称因而 APISIX 和自界说插件之间的桥梁,譬喻 apache-apisix-python-runner 这个名目经由过程 Python Runner 可能把 Python 直接运用到 APISIX 的插件开辟中,总体架构如下所示:

  

  此中的 Plugin Runner 便是各叙话的插件运转器,当设置装备摆设 Plugin Runner 后,APISIX 会启动一个子过程运转 Plugin Runner,该子过程与 APISIX 过程属于统一个用户,当咱们重启或从头加载 APISIX 时,Plugin Runner 也将被重启。

  假如你为一个给定的途由设置装备摆设了 ext-plugin-* 插件,吁请掷中该途由时将触发 APISIX 经由过程 Unix Socket 向 Plugin Runner 倡导 RPC 移用。移用分为两个阶段:

   ext-plugin-pre-req:正在实践 APISIX 内置插件以前 ext-plugin-post-req:正在实践 APISIX 内置插件以后

  接上去咱们就以 Python 为例来阐明怎么自界说插件,开始获取 apache-apisix-python-runner 名目:

  

➜gitclonehttps://github.com/apache/apisix-python-plugin-runner.git➜cdapisix-python-plugin-runner➜gitcheckout0.1.0#切换刀0.1.0版本

 

  假如是开辟形式,则咱们可能直接行使上面的夂箢启动 Python Runner:

  

➜APISIX_LISTEN_ADDRESS=unix:/tmp/runner.sockpython3apisix/main.pystart

 

  启动后必要正在 APISIX 设置装备摆设文献中新增外部插件设置装备摆设,如下所示:

  

➜vim/path/to/apisix/conf/config.yamlapisix:admin_key:-name:"admin"key:edd1c9f034335f136f87ad84b625c8f1role:adminext-plugin:path_for_test:/tmp/runner.sock

 

  经由过程 ext-plugin.path_for_test 指定 Python Runner 的 unix socket 文献途径便可,假如是临盆境况则可能经由过程 ext-plugin.cmd 来指定 Runner 的启动夂箢便可:

  

ext-plugin:cmd:["python3","/path/to/apisix-python-plugin-runner/apisix/main.py","start"]

 

  咱们这里的 APISIX 是运转 Kubernetes 集群中的,是以要正在 APISIX 的 Pod 中去实践 Python Runner 的代码,咱们天然必要将咱们的 Python 代码放到 APISIX 的容器中去,而后按部就班自界说插件的干系依附,直接正在 APISIX 设置装备摆设文献中增加下面的设置装备摆设便可,是以咱们这里基于 APISIX 的镜像来从头定制包蕴插件的镜像,正在 apisix-python-plugin-runner 名目根目次下新增如下所示的 Dockerfile 文献:

  

FROMapache/apisix:2.10.0-alpineADD./apisix-python-plugin-runnerRUNapkadd--updatepython3py3-pip&&cd/apisix-python-plugin-runner&&python3-mpipinstall--upgradepip&&python3-mpipinstall-rrequirements.txt--ignore-installed&&python3setup.pyinstall--force

 

  基于下面 Dockerfile 修建一个新的镜像,推送到 Docker Hub:

  

➜dockerbuild-tcnych/apisix:py3-plugin-2.10.0-alpine.#推送到DockerHub➜dockerpushcnych/apisix:py3-plugin-2.10.0-alpine

 

  接上去咱们必要行使下面修建的镜像来按部就班 APISIX,咱们这里行使的是 Helm Chart 举行按部就班的,是以必要经由过程 Values 文献举行笼盖,如下所示:

  

#ci/prod.yamlapisix:enabled:trueimage:repository:cnych/apisixtag:py3-plugin-2.10.0-alpine......

 

  因为官方的 Helm Chart 没有供给对 ext-plugin 设置装备摆设的接济,是以必要咱们手动窜改模板文献 templates/configmap.yaml,正在 apisix 属性同级目次上面新增 ext-plugin 干系设置装备摆设,如下所示:

  

{{-if.Values.extPlugins.enabled}}ext-plugin:{{-if.Values.extPlugins.pathForTest}}path_for_test:{{.Values.extPlugins.pathForTest}}{{-end}}{{-if.Values.extPlugins.cmds}}cmd:{{-range$cmd:=.Values.extPlugins.cmds}}-{{$cmd}}{{-end}}{{-end}}{{-end}}nginx_config:user:root#fix实践pythonrunner没权限的成绩

 

  而后正在定制的 Values 文献中增加如下所示的设置装备摆设:

  

#ci/prod.yamlextPlugins:enabled:truecmds:["python3","/apisix-python-plugin-runner/apisix/main.py","start"]

 

  接着便可能从头计划 APISIX 了:

  

➜helmupgrade--installapisix./apisix-f./apisix/ci/prod.yaml-napisix

 

  计划实现后正在 APISIX 的 Pod 中可能看到会启动一个 Python Runner 的子过程:

  

  正在插件目次 /apisix-python-plugin-runner/apisix/plugins 中的 .py 文献都市被主动加载,下面示例中有两个插件 stop.py 和 rewrite.py,咱们以 stop.py 为例举行阐明,该插件代码如下所示:

  

fromapisix.runner.plugin.baseimportBasefromapisix.runner.http.requestimportRequestfromapisix.runner.http.responseimportResponseclassStop(Base):def__init__(self):super(Stop,self).__init__(self.__class__.__name__)deffilter(self,request:Request,response:Response):#可能经由过程`self.config`获取配相信息,假如插件设置装备摆设为JSON将主动转换为字典机闭#print(self.config)#筑设相应Header头response.headers["X-Resp-A6-Runner"]="Python"#筑设相应bodyresponse.body="Hello,PythonRunnerofAPISIX"#筑设相应状况码response.status_code=201#经由过程移用`self.stop()`停止吁请流程,此时将立刻相应吁请给客户端#假如未外现移用`self.stop()`或外现移用`self.rewrite()`将接续将吁请#默以为`self.rewrite()`self.stop()

 

  告终插件开始必须要经受 Base 类,必需告终 filter 函数,插件实践焦点营业逻辑便是正在 filter 函数中,该函数只包蕴 Request 和 Response 类工具行为参数,Request 工具参数可能获取吁请音讯,Response 工具参数可能筑设相应音讯 ,self.config 可能获取插件配相信息,正在 filter 函数中移用 self.stop() 时将赶疾停止吁请,相应数据,移用 self.rewrite() 时,将会接续吁请。

  而后咱们正在后面的 Nexus 运用中新增一个途由来测试咱们下面的 stop 插件,正在 ApisixRoute 工具中新增一个途由规矩,如下所示:

  

apiVersion:apisix.apache.org/v2beta2kind:ApisixRoutemetadata:name:nexusnamespace:defaultspec:http:-name:extmatch:hosts:-ops.qikqiak.compaths:-"/extPlugin"plugins:-name:ext-plugin-pre-req#启用ext-plugin-pre-req插件enable:trueconfig:conf:-name:"stop"#行使stop这个自界说插件value:"{"body":"hello"}"backends:-serviceName:nexusservicePort:8081

 

  直接创筑下面的途由便可,焦点设置装备摆设是启用 ext-plugin-pre-req 插件(条件是正在设置装备摆设文献中曾经启用该插件,正在 Helm Chart 的 Values 中增加上),而后正在 config 上面行使 conf 属性举行设置装备摆设,conf 为数组方式可能同时筑设众个插件,插件设置装备摆设工具中 name 为插件称号,该称号必要与插件代码文献和工具称号划一,value 为插件设置装备摆设,可认为 JSON 字符串。

  创筑后同样正在 Dashboard 中也可能看到 APISIX 中的途由设置装备摆设方式:

  

  接着咱们可此后会见 http://ops.qikqiak.com/extPlugin 这个途径来验证咱们的自界说插件:

  

➜curl-ihttp://ops.qikqiak.com/extPluginHTTP/1.1201CreatedDate:Thu,13Jan202207:04:50GMTContent-Type:text/plain;charset=utf-8Transfer-Encoding:chunkedConnection:keep-aliveaccept:*/*user-agent:curl/7.64.1host:ops.qikqiak.comX-Resp-A6-Runner:PythonServer:APISIX/2.10.0Hello,PythonRunnerofAPISIX

 

  会见吁请了局中有一个 X-Resp-A6-Runner: Python 头音讯,前往的 body 数据为 Hello, Python Runner of APISIX,和咱们正在插件中的界说是合适的。到这里就实现了行使 Python 举行 APISIX 自界说插件,咱们有任何的营业逻辑必要解决直接去界说一个对应的插件便可。

文章推荐:

2022 年中国人工智能行业发展现状与市场规模分析 市场规模超 3000 亿元

该来的总要来! 切尔西老板将彻底退出英国市场

雷神黑武士四代开售:i7搭RTX3060不到9千元

智慧城市中 5G 和物联网的未来