高能勸退:lua開發,適合小白看!!!java
前段時間有個項目,用的java程序作網關,壓測tps只有1k多點,慘不忍睹。git
後來公司有個大佬改用apisix作網關,tps飆升到1w多。github
因而對神奇的apisix產生了深深的崇敬。感興趣之餘,便學習了一點apisix的插件開發。web
固然,只是一些入門基本的開發。源碼什麼的確定看不懂。docker
爲了開發方便,這裏用了docker。能夠選擇本身構建,也能夠從dockerhub拉取我構建好的鏡像shell
docker pull xshower/apisix:centos8
本身構建一個apisix的docker鏡像,Dockerfile內容以下apache
FROM centos:8 MAINTAINER xShower<https://gitee.com/syher> ARG APISIX_VERSION=1.5 LABEL apisix_version="${APISIX_VERSION}" RUN yum -y install yum-utils gcc automake autoconf libtool make \ && yum-config-manager --add-repo https://openresty.org/package/centos/openresty.repo \ && yum install -y openresty \ && yum install -y https://github.com/apache/apisix/releases/download/$APISIX_VERSION/apisix-$APISIX_VERSION-0.el7.noarch.rpm \ && yum clean all \ && sed -i 's/PASS_MAX_DAYS\t99999/PASS_MAX_DAYS\t60/g' /etc/login.defs ADD entrypoint.sh . ADD apisix-dashboard.tar /usr/local/apisix/ WORKDIR /usr/local/apisix ENTRYPOINT sh /entrypoint.sh && /bin/bash
基於centos8構建了最基礎的apisix鏡像,apisix-dashboard.tar是apisix的webui。須要本身解壓到apisix的安裝目錄。centos
鏡像構建完之後會執行entrypoint.sh腳本。api
#! /bin/sh INIT_DIR=/prepare-init.d LUAROCKS_DIR=/usr/local/apisix/third function run_script() { sh script_file } # 執行$INIT_DIR中的shell腳本 function init() { run_script } # 加載luarocks function init_luarocks() { } # 啓動apisix function start() { } init init_luarocks start
腳本內容很簡單,在啓動apisix以前加載$INIT_DIR目錄下的shell腳本及構建$LUAROCKS_DIR目錄下的luarocks依賴。bash
爲了方便開發,我在$INIT_DIR目錄下放了安裝lua和luarocks的腳本。就是簡單的wget/tar/make。腳本內容就不貼代碼了,能夠在個人git上面看。
這樣一個簡單的apisix鏡像就構建好了,由於apisix依賴etcd。因此這裏採用docker-compose容器編排。
version: '3.1' services: apisix: #build: # context: ./docker # dockerfile: Dockerfile image: xshower/apisix:centos8 restart: always depends_on: - etcd ports: - 9080:9080 - 9443:9443 - 9180:9180 volumes: - ./docker/prepare-init.d:/prepare-init.d - ./conf/config.yaml:/usr/local/apisix/conf/config.yaml:ro - ./third:/usr/local/apisix/third - ./logs:/usr/local/apisix/logs - ./docker/entrypoint.sh:/entrypoint.sh etcd: image: bitnami/etcd:3.4.9 user: root restart: always volumes: - ./etcd_data:/etcd_data environment: ETCD_DATA_DIR: /etcd_data ETCD_ENABLE_V2: "true" ALLOW_NONE_AUTHENTICATION: "yes" ETCD_ADVERTISE_CLIENT_URLS: "http://0.0.0.0:2379" ETCD_LISTEN_CLIENT_URLS: "http://0.0.0.0:2379" ports: - "2379:2379/tcp"
指定了apisix依賴以及文件路徑映射和端口映射。這樣,一個簡單的apisix開發環境就搭建好了。
apisix自己自帶了不少插件都在$APISIX_HOME/apisix/plugins目錄裏:limit-req.lua限流;proxy-rewrite.lua地址匹配;jwt-auth.lua受權認證;kafka-logger.lua日誌等。
有時候這些自帶的插件不能很好的知足咱們應用需求時,須要咱們本身開發。
咱們能夠在$APISIX_HOME/apisix/plugins目錄下編寫lua腳本。
固然也能夠添加自定義的插件目錄,這須要修改/usr/bin/apisix文件
# 第二行內容修改前 package.path = "/usr/local/apisix/?.lua;" .. package.path #修改後 package.path = "/usr/local/apisix/?.lua;/usr/local/apisix/third/?.lua;/usr/local/apisix/third/deps/share/lua/5.1/?.lua;" .. package.path
其中,/usr/local/apisix/third就是咱們自定義的插件目錄,這樣apisix既會讀取默認的插件目錄,又會讀取咱們定義的插件目錄。
目錄定義好之後,記得把自定義的插件放在third/plugins目錄下,不能直接放在third目錄中。
而後咱們寫一個lua插件,內容很簡單:每次請求的時候,打印日誌。
local core = require("apisix.core") local plugin_name = "third-plugin" local schema = { type = "object", properties = { content = { type = "string" } } } local _M = { version = 0.2, priority = 5000, name = plugin_name, schema = schema, } function _M.access(conf, ctx) // 打印日誌 core.log.warn(conf.content) end return _M
而後修改$APISIX_HOME/conf/config.yaml
#allow_admin: # - 127.0.0.0/24 #開啓dashboard遠程訪問 #- "::/64" port_admin: 9180 #開啓dashboard web端口
etcd: host: - "http://主機IP:2379" # 修改爲主機的ip,不能直接用127.0.0.1 plugins: - ...省略自帶插件 - third-plugin
啓動docker。如圖是IDEA啓動docker-compose的設置。你們也能夠在docker-compose.yml所在目錄下執行docker-compose up -d命令
啓動好咱們就能夠訪問http://127.0.0.1:9180/apisix/dashboard。
首先配置upstream並保存
配置service並保存
配置route並保存
保存完之後,不須要重啓apisix既可生效。
首先訪問原來的接口地址:http://192.168.34.229:6789/#/cluster
而後訪問咱們配置的apisix的接口地址:http://127.0.0.1:9080/rocketmq/#/cluster(和dashboard web端口不一致,web端口是9180.)
結果是同樣的。最後看看咱們加入插件的效果。
如圖,咱們在頁面配置的content內容都在日誌裏面打印出來了。