• 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	99999/PASS_MAX_DAYS	60/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/xshower/api-gateway

  • 相关阅读:
    hdu1561--树形dp<依赖背包>
    hdu--1520--树形dp<写起来就是深搜啊>-<滚动数组优化>
    hdu--1595-另类最短路
    hdu--1599--最小环<会加深你对floyd的理解>
    hdu--1851--尼姆博弈&&巴什博弈<也有人用了sg可惜我还不懂>
    hdu--4920--原来一直写了速度慢的矩阵乘法
    hdu--4912--终于解脱了
    hdu--4947--我太天真了
    hdu--2576--高中数学..
    hdu--2579--第二次与女孩的约会
  • 原文地址:https://www.cnblogs.com/braska/p/13692249.html
Copyright © 2020-2023  润新知