APISIX-quickstart
已经被证实,下文比较水,如有不适,请前往官方进行阅读APISIX(https://apisix.apache.org/zh/docs/apisix/getting-started/README/)
整体流程
graph TD
A1[【入门指南】安装APISIX和etcd]
A2[验证APISIX容器是否正常]
A3[验证etcd容器是否正常]
B1[【配置路由】创建路由]
B2[验证路由是否正常]
C1[【负载均衡】启用负载均衡]
C2[验证负载均衡是否正常]
D[【密钥验证】创建消费者]
E1[给指定的路由增加认证授权插件]
E2[验证认证授权插件是否正常]
e1[发送不带任何密钥的请求]
e2[发送携带错误密钥的请求]
e3[发送携带正确密钥的请求]
E3[禁用认证授权插件]
H1[【限速】给指定的路由增加限流插件]
H2[验证限流插件是否正常]
h1[同时生成100个请求测试限流插件效果]
H3[禁用限流插件]
X1[【插件】给指定的路由增加XXX插件]
X2[验证XXX插件是否正常]
x1[测试1]
x2[测试2...]
xn[测试n...]
X3[禁用XXX插件]
A1 --> A2
A1 --> A3
A2 --> B1
A3 --> B1
B1 --> B2
B1 --> C1
C1 --> C2
B1 --> D
D --> E1
D --> H1
D --> X1
E1 --> E2
E1 --> E3
E2 --> e1
E2 --> e2
E2 --> e3
H1 --> H2
H1 --> H3
H2 --> h1
X1 --> X2
X1 --> X3
X2 --> x1
X2 --> x2
X2 --> xn
style e1 fill:#f96,stroke:#333,stroke-width:4px
style e2 fill:#f96,stroke:#333,stroke-width:4px
style e3 fill:#f96,stroke:#333,stroke-width:4px
style E2 fill:#bbf,stroke:#333,stroke-width:4px
style E3 fill:#bbf,stroke:#333,stroke-width:4px
style H2 fill:#ddf,stroke:#333,stroke-width:4px
style H3 fill:#ddf,stroke:#333,stroke-width:4px
style X2 fill:#dff,stroke:#333,stroke-width:4px
style X3 fill:#dff,stroke:#333,stroke-width:4px
启动
curl -sL https://run.api7.ai/apisix/quickstart | sh
什么?如何拉取镜像
目前的环境拉取镜像确实是一个大问题,这里需要参考【ZOXM的魔法篇】,下面我会附上我的quickstart文件改造,可以看出来用的镜像也是自己做的。
这一步需要自己安排了。下面脚本的镜像可能也是无法拉取的,mac笔记本跑起来也是没有任何问题。可以走完上面流程图的所有步骤。
改动的部分放在这里
DEFAULT_ETCD_IMAGE_NAME="5000-jtzt.vip.cpolar.cn/etcd"
DEFAULT_ETCD_IMAGE_TAG="3.5.17"
# 注意这里的变量官方的脚本是没有的。etcd的编排里面增加了这一行,请对比 -e ETCD_DATA_DIR=${DEFAULT_ETCD_DATA_DIR} \ 这一行
# ETCD_DATA_DIR 变量是指定etcd存储数据的目录的,关于etcd所有的参数都在dockerhub官方镜像中有说明,如果无法访问官方的docker镜像,请前往https://github.com/bitnami/containers查看对应的etcd不同的版本的yaml文件中的 ETCD_DATA_DIR 的变化
DEFAULT_ETCD_DATA_DIR=/etcd_data
DEFAULT_APISIX_IMAGE_NAME="5000-jtzt.vip.cpolar.cn/apisix"
DEFAULT_APISIX_IMAGE_TAG="3.11.0-debian"
quickstart脚本
#!/bin/bash
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# 这里修改成可以拉取到的镜像地址
DEFAULT_ETCD_IMAGE_NAME="5000-jtzt.vip.cpolar.cn/etcd"
DEFAULT_ETCD_IMAGE_TAG="3.5.17"
DEFAULT_ETCD_DATA_DIR=/etcd_data
DEFAULT_APISIX_IMAGE_NAME="5000-jtzt.vip.cpolar.cn/apisix"
DEFAULT_APISIX_IMAGE_TAG="3.11.0-debian"
DEFAULT_ETCD_LISTEN_PORT=2379
DEFAULT_APISIX_PORT=9180
DEFAULT_ETCD_NAME="etcd-quickstart"
DEFAULT_APP_NAME="apisix-quickstart"
DEFAULT_NET_NAME="apisix-quickstart-net"
usage() {
echo "Runs a Docker based Apache APISIX."
echo
echo "See the document for more information:"
echo " https://docs.api7.ai/apisix/getting-started"
exit 0
}
echo_fail() {
printf "\e[31m✘ \e[0m$@\n"
}
echo_pass() {
printf "\e[32m✔ \e[0m$@\n"
}
echo_warning() {
printf "\e[33m⚠ $@\e[0m\n"
}
ensure_docker() {
{
docker ps -q >/dev/null 2>&1
} || {
return 1
}
}
ensure_curl() {
{
curl -h >/dev/null 2>&1
} || {
return 1
}
}
install_apisix() {
echo "Installing APISIX with the quickstart options."
echo ""
echo "Creating bridge network ${DEFAULT_NET_NAME}."
docker network create -d bridge $DEFAULT_NET_NAME && echo_pass "network ${DEFAULT_NET_NAME} created" || {
echo_fail "Create network failed!"
return 1
}
echo ""
echo "Starting the container ${DEFAULT_ETCD_NAME}."
docker run -d \
--name ${DEFAULT_ETCD_NAME} \
--network=$DEFAULT_NET_NAME \
-e ETCD_DATA_DIR=${DEFAULT_ETCD_DATA_DIR} \
-e ALLOW_NONE_AUTHENTICATION=yes \
-e ETCD_ADVERTISE_CLIENT_URLS=http://${DEFAULT_ETCD_NAME}:${DEFAULT_ETCD_LISTEN_PORT} \
${DEFAULT_ETCD_IMAGE_NAME}:${DEFAULT_ETCD_IMAGE_TAG} && echo_pass "etcd is listening on ${DEFAULT_ETCD_NAME}:${DEFAULT_ETCD_LISTEN_PORT}" || {
echo_fail "Start etcd failed!"
return 1
}
echo ""
APISIX_DEPLOYMENT_ETCD_HOST="[\"http://${DEFAULT_ETCD_NAME}:${DEFAULT_ETCD_LISTEN_PORT}\"]"
echo "Starting the container ${DEFAULT_APP_NAME}."
docker run -d \
--name ${DEFAULT_APP_NAME} \
--network=$DEFAULT_NET_NAME \
-p9080:9080 -p9180:9180 -p9443:9443/tcp -p9443:9443/udp -p9090:9092 -p9100:9100 -p9091:9091 \
-e APISIX_DEPLOYMENT_ETCD_HOST=${APISIX_DEPLOYMENT_ETCD_HOST} \
${DEFAULT_APISIX_IMAGE_NAME}:${DEFAULT_APISIX_IMAGE_TAG} && validate_apisix && sleep 2 || {
echo_fail "Start APISIX failed!"
return 1
}
docker exec ${DEFAULT_APP_NAME} /bin/bash -c "echo '
apisix:
enable_control: true
control:
ip: "0.0.0.0"
port: 9092
deployment:
role: traditional
role_traditional:
config_provider: etcd
admin:
admin_key_required: false
allow_admin:
- 0.0.0.0/0
plugin_attr:
prometheus:
export_addr:
ip: 0.0.0.0
port: 9091
' > /usr/local/apisix/conf/config.yaml"
docker exec ${DEFAULT_APP_NAME} apisix reload >>/dev/null 2>&1
echo_warning "WARNING: The Admin API key is currently disabled. You should turn on admin_key_required and set a strong Admin API key in production for security."
echo ""
}
destroy_apisix() {
echo "Destroying existing ${DEFAULT_APP_NAME} container, if any."
echo ""
docker rm -f $DEFAULT_APP_NAME >>/dev/null 2>&1
docker rm -f $DEFAULT_ETCD_NAME >>/dev/null 2>&1
docker network rm $DEFAULT_NET_NAME >>/dev/null 2>&1
sleep 2
}
validate_apisix() {
local rv=0
retry 30 curl "http://localhost:${DEFAULT_APISIX_PORT}/apisix/admin/services" >>/dev/null 2>&1 && echo_pass "APISIX is up" || rv=$?
}
main() {
ensure_docker || {
echo_fail "Docker is not available, please install it first"
exit 1
}
ensure_curl || {
echo_fail "curl is not available, please install it first"
exit 1
}
destroy_apisix
install_apisix || {
exit 1
}
echo_pass "APISIX is ready!"
}
main "$@"
常见问题
1./bitnami/etcd/data目录已存在,该异常是警告。
可以忽略,也可以设定指定的目录权限为-rwx------,警告问题,生产环境建议处理
{"level":"warn","ts":"2025-01-26T11:44:53.504Z","caller":"fileutil/fileutil.go:53","msg":"check file permission","error":"directory \"/bitnami/etcd/data\" exist, but the permission is \"drwxrwxr-x\". The recommended permission is \"-rwx------\" to prevent possible unprivileged access to the data"}
2.无法找到/bitnami/etcd/data目录,警告问题,有没有影响暂时没有论证。
关于ETCD_DATA_DIR这个参数的问题都可以查找dockerhub官方的文档,里面有关于这个参数的说明,也可以直接创建对应的目录。
{"level":"warn","ts":"2025-01-26T11:44:53.502Z","caller":"etcdmain/etcd.go:446","msg":"found invalid file under data directory","filename":"member_id","data-dir":"/bitnami/etcd/data"}
{"level":"info","ts":"2025-01-26T11:44:53.502Z","caller":"etcdmain/etcd.go:116","msg":"server has been already initialized","data-dir":"/bitnami/etcd/data","dir-type":"member"}
注:
1.创建资源成功返回状态码是201,关于状态码的描述可以查看官方文档(https://apisix.apache.org/zh/blog/2023/02/08/what-is-restful-api/#善用-http-状态码)
2.没有对脚本做出修改之前,请使用环回地址127.0.0.1,使用其它地址即使返回状态创建资源成功
如果能把这些流程走完,就会感觉到增强路由,限流网关,所有的事情都可以串联起来,岂不是业务和架构完全分离。如果用JPA JPA Buddy Introduction creating a CRUD进行编码那是一件非常有意思的事情。

浙公网安备 33010602011771号