高能劝退: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本身自带了甚多插件。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仅127访问
# - "::/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

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

gitee地址

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

apisix docker镜像构建及插件化开发的更多相关文章

  1. apisix网关-构建docker镜像构建及插件化开发

    高能劝退:lua开发,适合小白看!!! 前段时间有个项目,用的java程序做网关,压测tps只有1k多点,惨不忍睹. 后来公司有个大佬改用apisix做网关,tps飙升到1w多. 于是对神奇的apis ...

  2. 插件化开发—动态加载技术加载已安装和未安装的apk

    首先引入一个概念,动态加载技术是什么?为什么要引入动态加载?它有什么好处呢?首先要明白这几个问题,我们先从 应用程序入手,大家都知道在Android App中,一个应用程序dex文件的方法数最大不能超 ...

  3. 插件化开发—动态载入技术载入已安装和未安装的apk

    首先引入一个概念,动态载入技术是什么?为什么要引入动态载入?它有什么优点呢?首先要明确这几个问题.我们先从 应用程序入手,大家都知道在Android App中.一个应用程序dex文件的方法数最大不能超 ...

  4. [Songqw.Net 基础]WPF实现简单的插件化开发

    原文:[Songqw.Net 基础]WPF实现简单的插件化开发 版权声明:本文为博主原创文章,未经博主允许可以随意转载 https://blog.csdn.net/songqingwei1988/ar ...

  5. Android 插件化开发(四):插件化实现方案

    在经过上面铺垫后,我们可以尝试整体实现一下插件化了.这里我们先介绍一下最简单的实现插件化的方案. 一.最简单的插件化实现方案 最简单的插件化实现方案,对四大组件都是适用的,技术面涉及如下: 1). 合 ...

  6. Android组件化和插件化开发

    http://www.cnblogs.com/android-blogs/p/5703355.html 什么是组件化和插件化? 组件化开发就是将一个app分成多个模块,每个模块都是一个组件(Modul ...

  7. TinyFrame升级之八:实现简易插件化开发

    本章主要讲解如何为框架新增插件化开发功能. 在.net 4.0中,我们可以在Application开始之前,通过PreApplicationStartMethod方法加载所需要的任何东西.那么今天我们 ...

  8. Android插件化开发

    客户端开发给人的印象往往是小巧,快速奔跑.但随着产品的发展,目前产生了大量的门户型客户端.功能模块持续集成,开发人员迅速增长.不同的开发小组开发不同的功能模块,甚至还有其他客户端集成进入.能做到功能模 ...

  9. Android 使用动态载入框架DL进行插件化开发

    如有转载,请声明出处: 时之沙: http://blog.csdn.net/t12x3456    (来自时之沙的csdn博客) 概述: 随着应用的不断迭代.应用的体积不断增大,项目越来越臃肿,冗余添 ...

随机推荐

  1. python3 输出中文、日文等等乱码问题的解决办法

    例如: url = 'https://zozo.jp/shop/mrolive/goods-sale/44057773/?did=73037089' resp = requests.get(url=u ...

  2. Jmeter 常用函数(29)- 详解 __eval

    如果你想查看更多 Jmeter 常用函数可以在这篇文章找找哦 https://www.cnblogs.com/poloyy/p/13291704.html 作用 和 __V 的作用基本一致,执行变量名 ...

  3. python 计算文件md5值

    md5是一种常见不可逆加密算法,使用简单,计算速度快,在很多场景下都会用到,比如:给用户上传的文件命名,数据库中保存的用户密码,下载文件后检验文件是否正确等.下面讲解在python中如何使用md5算法 ...

  4. JavaGUI之Swing简单入门示例

    简介 AWT(译:抽象窗口工具包),是Java的平台独立的窗口系统,图形和用户界面器件工具包. Swing 是为了解决 AWT 存在的问题而以 AWT 为基础新开发的包(在使用Swing时也常会用到j ...

  5. latex:矩阵环境

    矩阵的最大列数值是在MaxMatrixCols计数器中设定的,默认值是10.可使用计数器设置命令修改其值,例如需要用到15列:\setcounter{MaxMatrixCols}{15};当超宽矩阵排 ...

  6. 升级的华为云“GaussDB”还能战否?

    摘要:芯片.操作系统.数据库是现代信息技术领域的三大核心基础,做数据库,不仅需要技术和投入,对华为这种做通讯起家的企业,更需要的是一种并非玩票性质的态度. GaussDB,不仅蕴含着华为对数学和科学的 ...

  7. 重温Java Web的技术细节

    目录 一.背景 二.请求与响应 2.1.Http请求 2.2.Http响应 三.ServletConfig 3.1 测试ServletConfig参数 四.ServletContext 4.1 测试S ...

  8. AlexNet实现cifar10数据集分类

    import tensorflow as tf import os from matplotlib import pyplot as plt import tensorflow.keras.datas ...

  9. Java/后端学习路线

    点赞再看,养成习惯,微信搜一搜[三太子敖丙]关注这个喜欢写情怀的程序员. 本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试完整考点.资料以及我的系 ...

  10. Python 快速验证代理IP是否有效

    有时候,我们需要用到代理IP,比如在爬虫的时候,但是得到了IP之后,可能不知道怎么验证这些IP是不是有效的,这时候我们可以使用Python携带该IP来模拟访问某一个网站,如果多次未成功访问,则说明这个 ...