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以上的超高连接并发。
本文基于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
# 切换到安装目录,如/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
docker ps 查看以下5个容器是否都已经启动
CONTAINER ID | IMAGE | COMMAND | CREATED | STATUS | PORTS | NAMES |
---|---|---|---|---|---|---|
68276ee6b3a3 | apache/apisix:2.6-alpine | “sh -c '/usr/bin/api…” | 4 hours ago | Up 4 hours | 0.0.0.0:9080->9080/tcp, 0.0.0.0:9091->9091/tcp, 0.0.0.0:9443->9443/tcp | docker-apisix_apisix_1 |
8940925dc2ad | bitnami/etcd:3.4.15 | “/opt/bitnami/script…” | 4 hours ago | Up 4 hours | 0.0.0.0:2379->2379/tcp, 2380/tcp | docker-apisix_etcd_1 |
0354de29f2b8 | nginx:1.19.0-alpine | “/docker-entrypoint.…” | 4 hours ago | Up 4 hours | 0.0.0.0:9081->80/tcp | docker-apisix_web1_1 |
5001f6c35680 | nginx:1.19.0-alpine | “/docker-entrypoint.…” | 4 hours ago | Up 4 hours | 0.0.0.0:9082->80/tcp | docker-apisix_web2_1 |
6704d5ef8426 | apache/apisix-dashboard:2.7 | “/usr/local/apisix-d…” | 4 hours ago | Up 4 hours | 0.0.0.0:9000->9000/tcp | docker-apisix_apisix-dashboard_1 |
可以查看容器运行情况,查看处于重启状态的容器日志
docker logs -f containerId
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
}
}
将IP换成实际的部署APISIX的服务器IP
http://IP:9000/user/login?redirect=%2F
输入 admin / admin ,如果正确登录,则apisix-dashboard成功启动。
#拉取镜像
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
#停止、启动、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
{
"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"
}
{
"username": "john",
"plugins": {
"key-auth": {
"key": "key-of-john"
}
}
}
{
"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
}
以下是在POSTMAN中,请求服务网关的示例,因为upstream配置了2个且是轮询方式,所以请求结果在hello web1、hello web2中交替出现。
{
"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"
}
{
"uris": [
"/dolphinscheduler/*"
],
"name": "ds--route",
"methods": [
"GET",
"POST",
"PUT",
"DELETE"
],
"upstream_id": "369818690893382334",
"labels": {
"API_VERSION": "V1.0",
"ds": "ds"
},
"status": 1
}
确保所需的所有端口(默认的 9080/9091/9443/2379/9000)未被其他系统/进程使用
#查询端口占用情况
fuser -i 9443/tcp
netstat -antp |grep 9443
#终止正在侦听特定端口(基于 unix 的系统)的进程的命令。
fuser -k 9443/tcp
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/
如果 Docker 容器持续不断地重启或失败,请登录容器并观察日志以诊断问题。
docker ps
docker logs -f containerId
#进入到容器内部
docker exec -it containerId /bin/sh