APISIX-quickstart

已经被证实,下文比较水,如有不适,请前往官方进行阅读APISIX(https://apisix.apache.org/zh/docs/apisix/getting-started/README/)

https://run.api7.ai/apisix/quickstart

整体流程

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进行编码那是一件非常有意思的事情。

posted @ 2025-01-26 18:34  zoxm  阅读(57)  评论(0)    收藏  举报