apisix docker镜像构建及插件化开发

高能劝退: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<//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 //openresty.org/package/centos/openresty.repo \
	&& yum install -y openresty \
	&& yum install -y //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: "//0.0.0.0:2379"
      ETCD_LISTEN_CLIENT_URLS: "//0.0.0.0:2379"
    ports:
      - "2379:2379/tcp"

  

指定了apisix依赖以及文件路径映射和端口映射。这样,一个简单的apisix开发环境就搭建好了。

插件开发

接下来说apisix插件化开发。

apisix本身自带了甚多插件。limit-req限流;proxy-rewrite地址匹配;jwt-auth授权认证;kafka-logger日志等。

但是,有时候apisix自带插件不满足我们应用需求时,这时候就只能我们自己开发。

apisix默认读取的插件目录是$APISIX_HOME/apisix/plugins,apisix自带那些插件也都在这个目录底下。

当然也可以添加自定义的插件目录,需要修改/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: - "//主机IP:2379" # 修改成主机的ip,不能直接用127.0.0.1 plugins: - ...省略自带插件 - third-plugin

  

启动docker。这里我用了idea自带的docker-compose插件。大家也可以再docker-compose.yml所在目录下执行docker-compose up -d命令

 

 

启动好我们就可以访问//127.0.0.1:9180/apisix/dashboard

首先配置upstream并保存

 

 

 配置service并保存

 

 

 

 配置route并保存

 

 

 

 

保存完以后,不需要重启apisix既可生效。

首先访问原来的接口地址://192.168.34.229:6789/#/cluster

 

 然后访问我们配置的apisix的接口地址://127.0.0.1:9080/rocketmq/#/cluster(和dashboard web端口不一致,web端口是9180.)

 

 结果是一样的。最后看看我们加入插件的效果。

 

 

 gitee地址

//gitee.com/syher/api-gateway