成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

使用 Python 自定義 APISIX 插件

開發 后端
除了 APISIX 官方內置的插件之外,我們也可以根據自己的需求去自定義插件,要自定義插件需要使用到 APISIX 提供的 Runner,目前已經支持 Java、Go 和 Python 語言的 Runner。

除了 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 項目:

  1. ➜ git clone https://github.com/apache/apisix-python-plugin-runner.git 
  2. ➜ cd apisix-python-plugin-runner 
  3. ➜ git checkout 0.1.0  # 切換刀0.1.0版本 

如果是開發模式,則我們可以直接使用下面的命令啟動 Python Runner:

  1. ➜ APISIX_LISTEN_ADDRESS=unix:/tmp/runner.sock python3 apisix/main.py start 

啟動后需要在 APISIX 配置文件中新增外部插件配置,如下所示:

  1. ➜ vim /path/to/apisix/conf/config.yaml 
  2. apisix: 
  3.   admin_key: 
  4.     - name"admin" 
  5.       key: edd1c9f034335f136f87ad84b625c8f1 
  6.       role: admin 
  7.  
  8. ext-plugin: 
  9.   path_for_test: /tmp/runner.sock 

通過 ext-plugin.path_for_test 指定 Python Runner 的 unix socket 文件路徑即可,如果是生產環境則可以通過 ext-plugin.cmd 來指定 Runner 的啟動命令即可:

  1. ext-plugin: 
  2.   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 文件:

  1. FROM apache/apisix:2.10.0-alpine 
  2.  
  3. ADD . /apisix-python-plugin-runner 
  4.  
  5. RUN apk add --update python3 py3-pip && \ 
  6.     cd /apisix-python-plugin-runner && \ 
  7.     python3 -m pip install --upgrade pip && \ 
  8.     python3 -m pip install -r requirements.txt --ignore-installed && \ 
  9.     python3 setup.py install --force 

基于上面 Dockerfile 構建一個新的鏡像,推送到 Docker Hub:

  1. ➜ docker build -t cnych/apisix:py3-plugin-2.10.0-alpine . 
  2. # 推送到DockerHub 
  3. ➜ docker push cnych/apisix:py3-plugin-2.10.0-alpine 

接下來我們需要使用上面構建的鏡像來安裝 APISIX,我們這里使用的是 Helm Chart 進行安裝的,所以需要通過 Values 文件進行覆蓋,如下所示:

  1. # ci/prod.yaml 
  2. apisix: 
  3.   enabled: true 
  4.  
  5.   image: 
  6.     repository: cnych/apisix 
  7.     tag: py3-plugin-2.10.0-alpine 
  8. ...... 

由于官方的 Helm Chart 沒有提供對 ext-plugin 配置的支持,所以需要我們手動修改模板文件 templates/configmap.yaml,在 apisix 屬性同級目錄下面新增 ext-plugin 相關配置,如下所示:

  1. {{- if .Values.extPlugins.enabled }} 
  2. ext-plugin: 
  3.   {{- if .Values.extPlugins.pathForTest }} 
  4.   path_for_test: {{ .Values.extPlugins.pathForTest }} 
  5.   {{- end }} 
  6.   {{- if .Values.extPlugins.cmds }} 
  7.   cmd: 
  8.   {{- range $cmd := .Values.extPlugins.cmds }} 
  9.   - {{ $cmd }} 
  10.   {{- end }} 
  11.   {{- end }} 
  12. {{- end }} 
  13.  
  14. nginx_config: 
  15.   user: root  # fix 執行 python runner沒權限的問題 

然后在定制的 Values 文件中添加如下所示的配置:

  1. # ci/prod.yaml 
  2. extPlugins: 
  3.   enabled: true 
  4.   cmds: ["python3""/apisix-python-plugin-runner/apisix/main.py""start"

接著就可以重新部署 APISIX 了:

  1. ➜ helm upgrade --install apisix ./apisix -f ./apisix/ci/prod.yaml -n apisix 

部署完成后在 APISIX 的 Pod 中可以看到會啟動一個 Python Runner 的子進程:

在插件目錄 /apisix-python-plugin-runner/apisix/plugins 中的 .py 文件都會被自動加載,上面示例中有兩個插件 stop.py 和 rewrite.py,我們以 stop.py 為例進行說明,該插件代碼如下所示:

  1. from apisix.runner.plugin.base import Base 
  2. from apisix.runner.http.request import Request 
  3. from apisix.runner.http.response import Response 
  4.  
  5.  
  6. class Stop(Base): 
  7.     def __init__(self): 
  8.         super(Stop, self).__init__(self.__class__.__name__) 
  9.  
  10.     def filter(self, request: Request, response: Response): 
  11.         # 可以通過 `self.config` 獲取配置信息,如果插件配置為JSON將自動轉換為字典結構 
  12.         # print(self.config) 
  13.  
  14.         # 設置響應 Header 頭 
  15.         response.headers["X-Resp-A6-Runner"] = "Python" 
  16.         # 設置響應body 
  17.         response.body = "Hello, Python Runner of APISIX" 
  18.         # 設置響應狀態碼 
  19.         response.status_code = 201 
  20.  
  21.         # 通過調用 `self.stop()` 中斷請求流程,此時將立即響應請求給客戶端 
  22.         # 如果未顯示調用 `self.stop()` 或 顯示調用 `self.rewrite()`將繼續將請求 
  23.         # 默認為 `self.rewrite()` 
  24.         self.stop() 

實現插件首先必須要繼承 Base 類,必須實現 filter 函數,插件執行核心業務邏輯就是在 filter 函數中,該函數只包含 Request 和 Response 類對象作為參數,Request 對象參數可以獲取請求信息,Response 對象參數可以設置響應信息 ,self.config 可以獲取插件配置信息,在 filter 函數中調用 self.stop() 時將馬上中斷請求,響應數據,調用 self.rewrite() 時,將會繼續請求。

然后我們在前面的 Nexus 應用中新增一個路由來測試我們上面的 stop 插件,在 ApisixRoute 對象中新增一個路由規則,如下所示:

  1. apiVersion: apisix.apache.org/v2beta2 
  2. kind: ApisixRoute 
  3. metadata: 
  4.   name: nexus 
  5.   namespace: default 
  6. spec: 
  7.   http: 
  8.     - name: ext 
  9.       match: 
  10.         hosts: 
  11.           - ops.qikqiak.com 
  12.         paths: 
  13.           - "/extPlugin" 
  14.       plugins: 
  15.       - name: ext-plugin-pre-req  # 啟用ext-plugin-pre-req插件 
  16.         enable: true 
  17.         config: 
  18.           conf: 
  19.           - name"stop"  # 使用 stop 這個自定義插件 
  20.             value: "{\"body\":\"hello\"}" 
  21.       backends: 
  22.       - serviceName: nexus 
  23.         servicePort: 8081 

直接創建上面的路由即可,核心配置是啟用 ext-plugin-pre-req 插件(前提是在配置文件中已經啟用該插件,在 Helm Chart 的 Values 中添加上),然后在 config 下面使用 conf 屬性進行配置,conf 為數組格式可以同時設置多個插件,插件配置對象中 name 為插件名稱,該名稱需要與插件代碼文件和對象名稱一致,value 為插件配置,可以為 JSON 字符串。

創建后同樣在 Dashboard 中也可以看到 APISIX 中的路由配置格式:

接著我們可以來訪問 http://ops.qikqiak.com/extPlugin 這個路徑來驗證我們的自定義插件:

  1. ➜ curl -i http://ops.qikqiak.com/extPlugin 
  2. HTTP/1.1 201 Created 
  3. Date: Thu, 13 Jan 2022 07:04:50 GMT 
  4. Content-Type: text/plain; charset=utf-8 
  5. Transfer-Encoding: chunked 
  6. Connection: keep-alive 
  7. accept: */* 
  8. user-agent: curl/7.64.1 
  9. host: ops.qikqiak.com 
  10. X-Resp-A6-Runner: Python 
  11. Server: APISIX/2.10.0 
  12.  
  13. Hello, Python Runner of APISIX 

訪問請求結果中有一個 X-Resp-A6-Runner: Python 頭信息,返回的 body 數據為 Hello, Python Runner of APISIX,和我們在插件中的定義是符合的。到這里就完成了使用 Python 進行 APISIX 自定義插件,我們有任何的業務邏輯需要處理直接去定義一個對應的插件即可。

 

責任編輯:姜華 來源: k8s技術圈
相關推薦

2023-03-31 07:17:16

2021-12-28 15:38:46

Traefik中間件插件

2024-01-18 08:24:08

2021-12-31 08:43:45

插件KubeScheduler

2012-11-19 11:07:42

IBMdw

2019-12-25 11:47:27

LinuxFVWM

2009-06-23 11:35:44

JSF的Naviati

2010-10-25 16:05:07

oracle自定義函數

2024-03-04 11:13:29

Django數據庫Python

2015-02-12 15:33:43

微信SDK

2011-08-25 11:44:21

LUA腳本魔獸世界

2021-05-28 08:58:41

Golang網卡metrics

2022-09-13 15:44:52

VSLook插件

2021-10-28 08:39:22

Node Export自定義 監控

2015-02-12 15:38:26

微信SDK

2016-12-26 15:25:59

Android自定義View

2016-11-16 21:55:55

源碼分析自定義view androi

2015-06-10 10:54:24

自定義路PHP

2009-02-10 12:55:39

自定義控件AJAX.NET

2021-12-24 15:46:23

鴻蒙HarmonyOS應用
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 狠狠躁天天躁夜夜躁婷婷老牛影视 | 精品国产免费人成在线观看 | 天堂中文资源在线 | 亚洲精品亚洲人成人网 | 日韩精品在线免费观看视频 | 久久av.com | a在线视频 | 欧美在线看片 | 亚洲精品视频免费观看 | 狠狠狠色丁香婷婷综合久久五月 | 日韩午夜网站 | 天堂av中文 | 夜夜av| 欧美日韩a | 天天视频一区二区三区 | 一区网站 | 午夜在线 | 免费看a| 中国91av | 久久精品91| 国产九九av | 雨宫琴音一区二区在线 | 国产一区二区三区四区 | 久久久www成人免费无遮挡大片 | 亚洲欧美一区二区三区1000 | 人人爽人人草 | 国内av在线 | www久久久| 欧美男人天堂 | 欧美精品在线一区二区三区 | 亚洲欧美久久 | 毛片一区 | 久久88 | 欧美最猛黑人xxxⅹ 粉嫩一区二区三区四区公司1 | 国产精品久久久久一区二区三区 | 精品一区二区三区在线播放 | 久久久久久久久久久久久九 | 亚洲精品欧美 | h漫在线观看 | 免费一区二区三区 | 国产成人免费视频网站视频社区 |