apisix閘道器-構建docker映象構建及外掛化開發

Braska。發表於2020-09-19

高能勸退:lua開發,適合小白看!!!

前段時間有個專案,用的java程式做閘道器,壓測tps只有1k多點,慘不忍睹。

後來公司有個大佬改用apisix做閘道器,tps飆升到1w多。

於是對神奇的apisix產生了深深的崇敬。感興趣之餘,便學習了一點apisix的外掛開發。

當然,只是一些入門基本的開發。原始碼什麼的肯定看不懂。

docker構建

為了開發方便,這裡用了docker。可以選擇自己構建,也可以從dockerhub拉取我構建好的映象

docker pull xshower/apisix:centos8

  

自己構建一個apisix的docker映象,Dockerfile內容如下

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的安裝目錄。

映象構建完以後會執行entrypoint.sh指令碼。

#! /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依賴。

為了方便開發,我在$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內容都在日誌裡面列印出來了。 

gitee地址

https://gitee.com/syher/api-gateway

相關文章