APISIX介绍

APISIX 架构设计
如何整合NACOS

apisix 是由openresty 团队开发并开源的微服务api gateway

OpenResty(又称:ngx_openresty) 是一个基于 NGINX 的可伸缩的 Web 平台,由中国人章亦春发起,提供了很多高质量的第三方模块。
OpenResty 是一个强大的 Web 应用服务器,Web 开发人员可以使用 Lua 脚本语言调动 Nginx 支持的各种 C 以及 Lua 模块,更主要的是在性能方面,OpenResty可以 快速构造出足以胜任 10K 以上并发连接响应的超高性能 Web 应用系统。
360,UPYUN,阿里云,新浪,腾讯网,去哪儿网,酷狗音乐等都是 OpenResty 的深度用户。

Nginx 采用一个 master 进程管理多个 worker 进程(master-worker)模式,基本的事件处理都在 woker 中,master 负责一些全局初始化,以及对 worker 的管理。
OpenResty中,每个 woker 使用一个 LuaVM,当请求被分配到 woker 时,将在这个 LuaVM 里创建一个 coroutine(协程)。协程之间数据隔离,每个协程具有独立的全局变量_G。OpenResty致力于将服务器应用完全运行与nginx中,充分利用nginx事件模型进行非阻塞I/O通信。其对MySQL、redis、Memcached的I\O通信操作也是非阻塞的,可以轻松应对10K以上的超高连接并发。

1 APISIX安装

1.1 安装前准备

本文基于docker-compose安装APISIX, 所以需要提前安装好docker、docker-compose
centos7.2上部署docker、docker-compose的步骤
Docker安装
Docker-Compose安装

查看版本 docker-compose -v, 显示为 docker-compose version 1.25.4, build 8d51620a

1.2 安装APISIX

# 切换到安装目录,如/opt
cd /opt
#将 Apache APISIX 的 Docker 镜像下载到本地
git clone https://github.com/apache/apisix-docker.git

#赋权限(不执行,会报:ETCD容器启动时报错:cannot access data directory: mkdir /bitnami/etcd/data: permission denied,表示etcd启动时未没有创建db的权限)
chmod -R 777 /opt/apisix-docker/example/

# 将当前的目录切换到 apisix-docker/example 路径下
cd apisix-docker/example
# 运行 docker-compose 命令,安装 Apache APISIX
docker-compose -p docker-apisix up -d

其中example目录结构如下:
在这里插入图片描述

1.3 验证

1.3.1 查看容器

docker ps 查看以下5个容器是否都已经启动

CONTAINER IDIMAGECOMMANDCREATEDSTATUSPORTSNAMES
68276ee6b3a3apache/apisix:2.6-alpine“sh -c '/usr/bin/api…”4 hours agoUp 4 hours0.0.0.0:9080->9080/tcp, 0.0.0.0:9091->9091/tcp, 0.0.0.0:9443->9443/tcpdocker-apisix_apisix_1
8940925dc2adbitnami/etcd:3.4.15“/opt/bitnami/script…”4 hours agoUp 4 hours0.0.0.0:2379->2379/tcp, 2380/tcpdocker-apisix_etcd_1
0354de29f2b8nginx:1.19.0-alpine“/docker-entrypoint.…”4 hours agoUp 4 hours0.0.0.0:9081->80/tcpdocker-apisix_web1_1
5001f6c35680nginx:1.19.0-alpine“/docker-entrypoint.…”4 hours agoUp 4 hours0.0.0.0:9082->80/tcpdocker-apisix_web2_1
6704d5ef8426apache/apisix-dashboard:2.7“/usr/local/apisix-d…”4 hours agoUp 4 hours0.0.0.0:9000->9000/tcpdocker-apisix_apisix-dashboard_1

1.3.2 查看日志

可以查看容器运行情况,查看处于重启状态的容器日志

docker logs -f containerId

1.3.3 请求验证

curl "http://127.0.0.1:9080/apisix/admin/services/" -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'

返回数据如下所示,表示Apache APISIX 成功启动:

{
  "count":1,
  "action":"get",
  "node":{
    "key":"/apisix/services",
    "nodes":{},
    "dir":true
  }
}

1.3.4 访问apisix-dashboard

将IP换成实际的部署APISIX的服务器IP
http://IP:9000/user/login?redirect=%2F

输入 admin / admin ,如果正确登录,则apisix-dashboard成功启动。
在这里插入图片描述

1.4 启停命令

1.4.1 docker-compose操作

#拉取镜像
docker-compose pull
#创建并启动镜像
docker-compose -p docker-apisix up -d
#停止并删除镜像
docker-compose -p docker-apisix down
#启动服务
docker-compose -p docker-apisix start
#停止服务
docker-compose -p docker-apisix stop

1.4.2 docker操作

#停止、启动、kill指定容器
docker stop containerid
docker start containerid
docker kill containerid

# 查看运行的容器
docker ps

#停止指定容器
docker stop $(docker ps -qa)
#删除全部容器
docker rm $(docker ps -qa)
#删除指定容器
docker rmi containerid
#查看所有镜像
docker images
#查看容器日志
docker logs -f containerid
#进入到容器内部
docker exec -it containerid /bin/sh

2 配置

2.1 官方示例配置

2.1.1 upstream配置

{
  "nodes": [
    {
      "host": "172.25.xx.22",
      "port": 9081,
      "weight": 1
    },
    {
      "host": "172.25.xx.22",
      "port": 9082,
      "weight": 1
    }
  ],
  "timeout": {
    "connect": 6,
    "read": 6,
    "send": 6
  },
  "type": "roundrobin",
  "scheme": "http",
  "pass_host": "pass",
  "name": "httpbin.org--80"
}

2.1.2 消费者配置

{
  "username": "john",
  "plugins": {
    "key-auth": {
      "key": "key-of-john"
    }
  }
}

2.1.3 路由配置

{
  "uris": [
    "/samplePrefix/get"
  ],
  "name": "example-route",
  "plugins": {
    "key-auth": {
      "header": "apikey"
    },
    "proxy-rewrite": {
      "regex_uri": [
        "^/samplePrefix/get(.*)",
        "/get$1"
      ]
    }
  },
  "upstream_id": "1",
  "labels": {
    "API_VERSION": "V1.0",
    "example": "example"
  },
  "status": 1
}

2.1.4 请求示例

以下是在POSTMAN中,请求服务网关的示例,因为upstream配置了2个且是轮询方式,所以请求结果在hello web1、hello web2中交替出现。
在这里插入图片描述

2.2 配置调度系统API的路由

2.2.1 upstream配置

{
  "nodes": [
    {
      "host": "172.25.21.17",
      "port": 12345,
      "weight": 1
    }
  ],
  "retries": 3,
  "timeout": {
    "connect": 6,
    "read": 6,
    "send": 6
  },
  "type": "roundrobin",
  "scheme": "http",
  "pass_host": "pass",
  "name": "dolphinscheduler--12345"
}

2.2.2 路由配置

{
  "uris": [
    "/dolphinscheduler/*"
  ],
  "name": "ds--route",
  "methods": [
    "GET",
    "POST",
    "PUT",
    "DELETE"
  ],
  "upstream_id": "369818690893382334",
  "labels": {
    "API_VERSION": "V1.0",
    "ds": "ds"
  },
  "status": 1
}

2.1.4 请求示例

以下是在POSTMAN中,请求服务网关的示例
在这里插入图片描述

3 常见问题

3.1 端口被占用

确保所需的所有端口(默认的 9080/9091/9443/2379/9000)未被其他系统/进程使用

#查询端口占用情况
fuser -i 9443/tcp
netstat -antp |grep 9443
#终止正在侦听特定端口(基于 unix 的系统)的进程的命令。
fuser -k 9443/tcp

3.2 cannot access data directory

ETCD出现报错:cannot access data directory: mkdir /bitnami/etcd/data: permission denied,表示etcd启动时未没有创建db的权限,

在opt目录下执行:ETCD会把安装目录下的etcd_data 映射到容器内部的/bitnami/etcd/目录,并在此目录下创建data存储DB数据

chmod -R 777 /opt/apisix-docker/example/

3.3 容器持续地重启或失败

如果 Docker 容器持续不断地重启或失败,请登录容器并观察日志以诊断问题。

docker ps
docker logs -f containerId

#进入到容器内部
docker exec -it containerId /bin/sh
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐