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<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
apisix网关-构建docker镜像构建及插件化开发的更多相关文章
- apisix docker镜像构建及插件化开发
高能劝退:lua开发,适合小白看!!! 前段时间有个项目,用的java程序做网关,压测tps只有1k多点,惨不忍睹. 后来公司有个大佬改用apisix做网关,tps飙升到1w多. 于是对神奇的apis ...
- 使用docker Maven插件本地构建docker镜像并发布到远程服务器
1.登录网站https://start.spring.io/,生成一个基本的SpringBoot应用. 2.将应用导入Eclipse IDE并创建Application类.目录结构如下: Applic ...
- Maven插件构建Docker镜像
背景 微服务架构下,微服务在带来良好的设计和架构理念的同时,也带来了运维上的额外复杂性,尤其是在服务部署和服务监控上.单体应用是集中式的,就一个单体跑在一起,部署和管理的时候非常简单,而微服务是一个网 ...
- 使用Jenkins pipeline流水线构建docker镜像和发布
新建一个pipeline job 选择Pipeline任务,然后进入配置页面. 对于Pipeline, Definition选择 "Pipeline script from SCM" ...
- Docker:使用Jenkins构建Docker镜像
Docker 彭东稳 1年前 (2016-12-27) 10709次浏览 已收录 0个评论 一.介绍Jenkins Jenkins是一个开源项目,提供了一种易于使用的持续集成系统,使开发者从 ...
- 使用Buildpacks高效构建Docker镜像
1. 前言 Spring Boot 2.3.0.RELEASE 正式发布了几天了,其中有个新的特性:可以将Spring Boot应用代码直接打包为Docker镜像.这是什么科技?我赶紧去官网查了一番才 ...
- SpringBoot 构建 Docker 镜像的 3 种方式
本文将介绍3种技术,通过 Maven 把 SpringBoot 应用构建成 Docker 镜像. (1)使用 spring-boot-maven-plugin 内置的 build-image. (2) ...
- SpringBoot 构建 Docker 镜像的最佳 3 种方式
本文将介绍3种技术,通过 Maven 把 SpringBoot 应用构建成 Docker 镜像. (1)使用 spring-boot-maven-plugin 内置的 build-image. (2) ...
- Java SpringBoot 项目构建 Docker 镜像调优实践
PS:已经在生产实践中验证,解决在生产环境下,网速带宽小,每次推拉镜像影响线上服务问题,按本文方式构建镜像,除了第一次拉取.推送.构建镜像慢,第二.三-次都是几百K大小传输,速度非常快,构建.打包.推 ...
随机推荐
- Docker 的前世今生
虚拟化 「要解释清楚 Docker,首先要解释清楚容器(Container)的概念」.要解释容器的话,就需要从操作系统说起.操作系统太底层,细说的话一两本书都说不清楚.这里就一句话来总结一下:操作系统 ...
- Jmeter系列(55)- 详解 Throughput Controller 吞吐量控制器
如果你想从头学习Jmeter,可以看看这个系列的文章哦 https://www.cnblogs.com/poloyy/category/1746599.html 简单介绍 自行调整该控制器下的子项的执 ...
- Robot Framework(1)——环境搭建及安装
一.了解Robot Framework Robot Framework不是一个测试工具,准确来说,它是一个自动化测试框架,或者说它是一个自动化测试平台 特性如下: 1.支持关键字驱动.数据驱动和行为驱 ...
- Spring Boot 集成 Memcached
Memcached 介绍 Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站 ...
- python之常用正则表达式
以下整理python中常用的正则符号,相信能够熟悉掌握这些正则符号,大部分字符串处理将会游刃有余. 符号 含义 示例 . 可以匹配任意字符,但不包含换行符'\n' Pyt.on ->Pytmon ...
- 从零搭建Spring Boot脚手架(7):整合OSS作为文件服务器
1. 前言 文件服务器是一个应用必要的组件之一.最早我搞过FTP,然后又用过FastDFS,接私活的时候我用MongoDB也凑合凑合.现如今时代不同了,开始流行起了OSS. Gitee: https: ...
- 记一个Selenium自动化测试网页
今天想跟大家分享的是Selenium自动化测试网页,就是关于selenium的自动化测试一些基础的东西,如有不对的地方请多多指教. 一.安装环境 1.Python环境 安装完成后通过Windows命令 ...
- 极简 Node.js 入门 - 3.5 文件夹操作
极简 Node.js 入门系列教程:https://www.yuque.com/sunluyong/node 本文更佳阅读体验:https://www.yuque.com/sunluyong/node ...
- 2. Bean Validation声明式校验方法的参数、返回值
你必须非常努力,才能干起来毫不费力.本文已被 https://www.yourbatman.cn 收录,里面一并有Spring技术栈.MyBatis.JVM.中间件等小而美的专栏供以免费学习.关注公众 ...
- 【转】Tomcat搭建文件服务器
http://blog.csdn.net/yin_jw/article/details/43524659 1. 配置在tomcat目录下 直接把文件放在 tomcat6/webapps/ROOT 目录 ...