高能劝退: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. asp.net core 应用docke部署到centos7

    前言 前期准备 win10 (不要安装hyper-V) VMware-Workstation-Pro/15.0 Xshell6 (非必需) VS2019 以上环境请自行安装 都是默认安装没什么可说的 ...

  2. Sublime Text 3关闭更新新版本的提醒

    1 关闭更新提示前首先需要 输入激活码,下边是我的,亲测有效,无效的话,自行百度填写. ----- BEGIN LICENSE ----- ZYNGA INC. 50 User License EA7 ...

  3. antd-vue的select组件实现既可以输入添加,又可以下拉选择

    最近,项目中碰到需求,要求任务类型可以从下拉框(后台返回的数据)中选择,也可以手动输入添加新项,项目用的是antd-vue,所以最接近的组件就是a-select组件了,废话不多说,改造方法如下: HT ...

  4. map[string]interface{} demo

    package main import ( "encoding/json" "fmt" "reflect" ) func demo1() { ...

  5. golang grpc demo

    1.grpm 安装: git clone https://github.com/grpc/grpc-go.git $GOPATH/src/google.golang.org/grpc 2.proto, ...

  6. AI and Neuroscience: A virtuous circle

    转载:https://deepmind.com/blog/article/ai-and-neuroscience-virtuous-circle AI领域最近取得了显著进展.人工系统现在优于人类专家A ...

  7. shell 三剑客之 awk

    awk 是shell 里的常用命令,非常强大!

  8. mybatis逆向工程介绍

    项目的model一旦多了起来,复杂了起来,我们很自然的想到使用mybatis的逆向工程来生成相应的pojo和mapper,能节省很多精力. MyBatis Generator(MBG)是 MyBati ...

  9. 常被问到的八个 Java 面试题

    想要找到一份好的工作,面试是少不了的,可能你觉得自己技术应该不错了,但是面试却是一团糟.下面我收集了八个常常被问到的Java面试题.   1. 阐述 Java 7 和 Java 8 的区别. 实话说, ...

  10. 程序员小哥教你秋招拿大厂offer

    快要到秋招了,对于应届生来说,秋招是一个特别重要的机会.对于社招同学来说,金九银十也是一个很好的跳槽窗口. 而我呢,因为是从上海到广州工作,就没有提前先把工作定下来.刚好也趁这个机会出去旅游了两个月. ...