Apache APISIXдаApacheОблачное решение в рамках Software FoundationAPIшлюз,Он обладает характеристиками динамичности, работы в реальном времени и высокой производительности.,Он обеспечивает богатые функции управления потоками, такие как балансировка нагрузки, динамический восходящий поток, выпуск оттенков серого (канареечный выпуск), автоматический выключатель Служить, аутентификация личности и наблюдаемость. Apach может использовать APISIX, обрабатывающий данные трафика север-юг, а также трафик. Восток-Запад между службами. в то же время,Он также поддерживает какK8s Ingress Controllerиспользовать。 Схема архитектуры развертывания APISIX показана ниже и включает 3 части: API. Шлюз отвечает за пересылку трафика, etcd отвечает за хранение конфигурации, API Gateway Администратор — это консоль администратора, и все три части полностью поддерживают высокую доступность.
Следующие операции основаны на последней стабильной ветке APISIX 3.4.1.
APISIX поддерживает несколько способов установки, но наиболее удобным является развертывание с помощью Docker. Поэтому при установкеAPISIXДо,Сначала нужно убедиться, что он установленDockerиDocker Compose。 Официальные шаги установки следующие:
# Апач Загрузите образ APISIX Docker локально.
# Здесь вы можете выбрать загрузку указанной версии APISIX, просто выберите указанную ветку.
# Например: вы можете выбрать ветку Release/apisix-3.4.1.
# Загрузка из основной ветки по умолчанию
git clone https://github.com/apache/apisix-docker.git
# Вы также можете скачать его из указанной ветки
git clone -b release/apisix-3.4.1 https://github.com/apache/apisix-docker.git
# Измените текущий каталог на путь apisix-docker/example.
cd apisix-docker/example
# Запустите команду docker-compose, чтобы запустить Apache. APISIX
docker-compose -p docker-apisix up -d
# Соответствующие файлы конфигурации: ./dashboard_conf/conf.yaml и ./apisix_conf/config.yaml.
После завершения установки выполните следующую команду, чтобы убедиться в успешном развертывании APISIX:
curl "http://127.0.0.1:9080" --head | grep Server
Если возвращаются данные в следующем формате, APISIX успешно развернут и запущен:
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
Server: APISIX/3.4.1 # Выводится информация о версии APISIX.
Полный сервис APISIX будет работать на нескольких портах, из которых наиболее часто используются три:
Как упоминалось выше,APISIXОпыт управления работает в9000
порт,Адрес доступаhttp://HOST:9000/
можно получить доступAPISIXизDashboardстраница,Учетная запись администратора по умолчанию: amdin/admin.
Upstreamтакже называется восходящим потоком,Upstream — это абстракция виртуальных хостов.,то есть прикладной уровень Служитьилиузелизабстрактный。 Роль восходящего канала заключается в балансировке нагрузки на сервисные узлы в соответствии с правилами конфигурации, а его адресную информацию можно напрямую настроить на маршрутах или сервисах. Если несколько маршрутов или служб ссылаются на один и тот же восходящий поток, вы можете создать восходящий объект и использовать идентификатор восходящего потока (т. е. upstream_id) в маршруте или услуге для ссылки на восходящий поток, чтобы снизить нагрузку на обслуживание.
Routeтакже известный какмаршрутизация,Это самый простой и основной объект ресурса в APISIX. APISIX может определять правила для соответствия запросам клиентов путем маршрутизации.,Загрузите и выполните соответствующийизплагин,Наконец, запрос перенаправляется в указанную вышестоящую Служить. Маршрутизация в основном состоит из трех частей: правил сопоставления, конфигурации плагина и восходящей информации.
Serviceтакже известный как Служить,Это абстракция определенного типа API (его также можно понимать как абстракцию набора Маршрутов). Обычно он имеет однозначное соответствие с вышестоящей абстракцией Служить.,Между маршрутом и сервисом,в целомдаN:1
изсвязь。
Почти все управленческие операции APISIX осуществляются вокруг этих трех.
Используйте APISIX следующим образом, чтобы практиковать Опубликовать API, Защитить API, API Диптихи и другие операции.
1. Создать апстрим
curl "http://127.0.0.1:9180/apisix/admin/upstreams/1" \
-H "X-API-KEY: edd1c9f034335f136f87ad84b625c8f1" -X PUT -d '
{
"type": "roundrobin",
"nodes": {
"httpbin.org:80": 1 # Здесь цифра 1 обозначает вес
}
}'
в пути запросаhttp://127.0.0.1:9180/apisix/admin/upstreams/1
серединаизпоследняя часть цифр1
Указывает настройкиupstream_idдля1。
Можно найти вnodes
Укажите несколько целевых адресов под объектом,Для достижения эффекта балансировки нагрузки.
2.Создать маршрут
curl "http://127.0.0.1:9180/apisix/admin/routes/1" \
-H "X-API-KEY: edd1c9f034335f136f87ad84b625c8f1" -X PUT -d '
{
"methods": ["GET"],
"host": "example.com",
"uri": "/anything/*",
"upstream_id": "1" # Укажите upstream_id в маршрутизации
}'
Уведомление: Создайте дополнительные дополнительные шаги выше по течению,Доступно в маршрутизации,добавить вupstream
объект,Чтобы добиться эффекта сначала создания Upstream, а затем создания Route.
curl "http://127.0.0.1:9180/apisix/admin/routes/1" \
-H "X-API-KEY: edd1c9f034335f136f87ad84b625c8f1" -X PUT -d '
{
"methods": ["GET"],
"host": "example.com",
"uri": "/anything/*",
"upstream": {
"type": "roundrobin",
"nodes": {
"httpbin.org:80": 1
}
}
}'
в пути запросаhttp://127.0.0.1:9180/apisix/admin/routes/1
серединаизпоследняя часть цифр1
Указывает настройкимаршрутизацияidдля1,Используется для уникальной идентификации фрагмента информации о маршрутизации.,Этот идентификатор можно увидеть в фоновом режиме управления.
Конечно, идентификатор маршрутизации также можно указать в теле сообщения запроса:
curl -i "http://127.0.0.1:9180/apisix/admin/routes?api_key=edd1c9f034335f136f87ad84b625c8f1" -X PUT -d '
{
"id": "getting-started-ip", # В теле запроса укажите ID маршрутизации
"uri": "/ip",
"upstream": {
"type": "roundrobin",
"nodes": {
"httpbin.org:80": 1
}
}
}'
проверять:
curl "http://127.0.0.1:9080/ip"
возвращаться:
{
"origin": "172.18.0.1, 124.126.139.14"
}
Кроме того, если при создании маршрута для вышестоящего сервиса указано несколько целевых узлов, клиент будет использовать механизм балансировки нагрузки для доступа к целевому сервису при доступе к API. В следующем примере показано добавление маршрута: при доступе к пути «/headers» механизм опроса будет использоваться для пересылки на «httpbin.org» или «mock.api7.ai».
curl -i "http://127.0.0.1:9180/apisix/admin/routes?api_key=edd1c9f034335f136f87ad84b625c8f1" -X PUT -d '
{
"id": "getting-started-headers", # В теле запроса укажите ID маршрутизации
"uri": "/headers",
"upstream" : {
"type": "roundrobin",
"nodes": {
"httpbin.org:443": 1,
"mock.api7.ai:443": 1
},
"pass_host": "node",
"scheme": "https"
}
}'
проверять:
curl "http://127.0.0.1:9080/headers"
Результаты ответа от «httpbin.org»:
{
"headers": {
"Accept": "*/*",
"Host": "httpbin.org",
"User-Agent": "curl/7.61.1",
"X-Amzn-Trace-Id": "Root=1-64cf349d-5d3ca35e246ed48c0e7e2b49",
"X-Forwarded-Host": "127.0.0.1"
}
}
Результаты ответа от «mock.api7.ai»:
{
"headers": {
"accept": "*/*",
"accept-encoding": "gzip",
"cf-connecting-ip": "124.126.139.14",
"cf-ipcountry": "CN",
"cf-ray": "7f25017fdb898873",
"cf-visitor": "{\"scheme\":\"https\"}",
"connection": "Keep-Alive",
"content-type": "application/json",
"host": "mock.api7.ai",
"user-agent": "curl/7.61.1",
"x-application-owner": "API7.ai",
"x-forwarded-for": "172.18.0.1",
"x-forwarded-host": "127.0.0.1",
"x-forwarded-port": "9080",
"x-forwarded-proto": "https",
"x-real-ip": "124.126.139.14",
"X-Application-Owner": "API7.ai",
"Content-Type": "application/json"
}
}
Сгенерируйте 10 запросов для проверки эффекта балансировки нагрузки:
hc=$(seq 10 | xargs -i curl "http://127.0.0.1:9080/headers" -sL | grep "httpbin" | wc -l); echo httpbin.org: $hc, mock.api7.ai: $((10 - $hc))
Выход:
httpbin.org: 6, mock.api7.ai: 4
3. Тестовый маршрут
После создания маршрута вы можете проверить, является ли маршрут нормальным, выполнив следующую команду:
curl -i -X GET "http://127.0.0.1:9080/anything/get?foo1=bar1&foo2=bar2" -H "Host: example.com"
возвращаться:
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 462
Connection: keep-alive
Date: Mon, 07 Aug 2023 02:22:28 GMT
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
Server: APISIX/3.4.1
{
"args": {
"foo1": "bar1",
"foo2": "bar2"
},
"data": "",
"files": {},
"form": {},
"headers": {
"Accept": "*/*",
"Host": "example.com",
"User-Agent": "curl/7.61.1",
"X-Amzn-Trace-Id": "Root=1-64d05564-2f4a04cc40f5806822c53bb6",
"X-Forwarded-Host": "example.com"
},
"json": null,
"method": "GET",
"origin": "172.18.0.1, 124.126.139.14",
"url": "http://example.com/anything/get?foo1=bar1&foo2=bar2"
}
существоватьAPISIXпроходитьплагиносознатьAPIЗащищать,существовать Что касается конкретной реализациидапроходить Ограничение тока и скоростии безопасностьплагин Защитить API Служить ограничивает нештатные запросы доступа и обеспечивает стабильную работу API Служить.
APISIX предлагает несколько ограничений тока и скоростиизплагин,включатьlimit-conn
、limit-req
иlimit-count
。
В дополнение к плагину Ограничение тока и скорости APISIX также предоставляет плагин многих других потоков для удовлетворения потребностей реальных сценариев:
При этом также предусмотрено множество плагинов аутентификации и авторизации пользователей:
Route
илиService
добавить в Ключ аутентификации(API key),Необходимость иConsumer
Только работая вместе, мы сможем работать,проходитьConsumer
Воляего ключдобавить вприезжать Параметры строки запросаилизаголовоксерединачтобы проверить егопросить.basic-auth
плагинможет бытьBasic_access_authentication
добавить вприезжатьRoute
илиService
середина。JWT
Аутентификациядобавить вприезжатьService
илиRoute
середина,проходитьConsumer
Воляего ключдобавить вприезжать Параметры строки запроса、Заголовок запросаилиcookie
серединаиспользуется для проверки егопросить.Keycloak Identity Server
добавить в Аутентификация。authz-casdoor
плагин Можетдобавить вCasdoor
наборсередина Сертификация Способ。wolf-rbac
плагиндляrole-based access control
Система обеспечиваетдобавить вwolf
приезжатьRoute
илиService
из Функция。этотплагин Необходимость иConsumer
Вместеиспользовать。OAuth 2.0
из Аутентификация личностипротокол,APISIX может быть подключен к аутентификации личности. Служить, поддерживающий этот протокол.,Такие как Окта, Кейклоак, Ори Hydra, Authing и т. д. реализуют аутентификацию личности для клиентских запросов.cas-auth
Запрос отSP(Служитьпоставщик)изугловой доступCAS(середина央Аутентификация Служить2.0)IdP(личностьпоставщик)аутентифицировать。HMAC authentication
добавить вприезжатьRoute
или ВОЗService
,ДолженплагиннуждатьсяиConsumer
Вместеиспользовать,Потребители API должны добавить секретный ключ в заголовок запроса для аутентификации их использования.authz-casbin
плагинда一个на основеLua Casbinизконтроль доступаплагин,Долженплагин Поддержка различныхaccess control modelsиз Мощные сценарии авторизации。ldap-auth
плагин Можно использовать, чтобы датьмаршрутизацияили Служитьдобавить вLDAPАутентификация личности,Долженплагиниспользоватьlua-resty-ldapсоединятьLDAPСлужитьустройство。opa
плагин Может использоваться сOpen Policy AgentИнтегрировать,Реализовать разделение серверной аутентификации и авторизации и доступа к функциям Служить.,Уменьшите сложность системы.forward-auth
плагиниспользоватьиздаклассический экстерьер Сертификация。когда Аутентификация личностипри неудаче,Может以实现自定义错误или ВОЗ重定向приезжать Сертификациястраницаизсцена。forward-auth
плагинумно Воля Аутентификация личностии Логическая миграция авторизацииприезжатьспециализированныйизвнешний Служитьсередина,APISIX перенаправляет запрос пользователя в службу аутентификации Служить и блокирует исходный запрос.,Затемсуществовать Сертификация Служить Следующая вещь неправильная2xx
Замена результата при ответе на статус。нравитьсянижеlimit-countплагиндляпример,представлятьнравитьсячтопроходить Ограничение тока и скоростиплагин Защитить APIСлужить。
1. Создайте восходящий поток
curl "http://127.0.0.1:9180/apisix/admin/upstreams/1" \
-H "X-API-KEY: edd1c9f034335f136f87ad84b625c8f1" -X PUT -d '
{
"type": "roundrobin",
"nodes": {
"httpbin.org:80": 1
}
}'
2. Создайте маршрут
curl -i http://127.0.0.1:9180/apisix/admin/routes/1 \
-H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
"uri": "/index.html",
"plugins": {
"limit-count": { # Используйте плагин limit-count, чтобы ограничить доступ к восходящему каналу до 2 раз в течение 60 секунд. Если используется более 2 раз, будет возвращен код состояния 503.
"count": 2,
"time_window": 60,
"rejected_code": 503,
"key_type": "var",
"key": "remote_addr"
}
},
"upstream_id": "1" # указан upstream_id
}'
3. Протестируйте плагин:
curl http://127.0.0.1:9080/index.html
После использования приведенной выше команды для доступа три раза подряд в течение 60 секунд появится следующая ошибка.
<html>
<head><title>503 Service Temporarily Unavailable</title></head>
<body>
<center><h1>503 Service Temporarily Unavailable</h1></center>
<hr><center>openresty</center>
<p><em>Powered by <a href="https://apisix.apache.org/">APISIX</a>.</em></p></body>
</html>
Сгенерируйте 100 запросов одновременно, чтобы увидеть эффект от плагина ограничения скорости:
count=$(seq 100 | xargs -i curl "http://127.0.0.1:9080/index.html" -I -sL | grep "503" | wc -l); echo \"200\": $((100 - $count)), \"503\": $count
Выход:
# Только 2 из 100 запросов могут быть выполнены нормально, а 98 из них терпят неудачу.
"200": 2, "503": 98
нравитьсянижеkey-auth
плагиндляпример,Информация для аутентификации необходима при ограничении доступа к назначенной маршрутизации.
1. Добавьте потребителя:
curl -i "http://127.0.0.1:9180/apisix/admin/consumers?api_key=edd1c9f034335f136f87ad84b625c8f1" -X PUT -d '
{
"username": "tom",
"plugins": {
"key-auth": {
"key": "abcdefghijklmnopqrstuvwxyz"
}
}
}'
2.Чтобы указатьмаршрутизациядавать возможностьKeyСертификация:getting-started-ip
curl -i "http://127.0.0.1:9180/apisix/admin/routes/getting-started-ip?api_key=edd1c9f034335f136f87ad84b625c8f1" -X PATCH -d '
{
"plugins": {
"key-auth": {}
}
}'
проверять:
# Доступ без API-ключа:
curl -i "http://127.0.0.1:9080/ip"
# возвращаться:
HTTP/1.1 401 Unauthorized
Date: Sun, 06 Aug 2023 06:07:47 GMT
Content-Type: text/plain; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Server: APISIX/3.4.1
{"message":"Missing API key found in request"}
# Доступ с помощью API-KEY (используйте правильный API-KEY):
curl -i "http://127.0.0.1:9080/ip" -H 'apikey: abcdefghijklmnopqrstuvwxyz'
# возвращаться:
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 45
Connection: keep-alive
Date: Sun, 06 Aug 2023 06:08:52 GMT
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
Server: APISIX/3.4.1
{
"origin": "172.18.0.1, 124.126.139.14"
}
# Доступ с использованием неправильного API-ключа:
curl -i "http://127.0.0.1:9080/ip" -H 'apikey: abcdefghijklmnopqrstuvwxyz123'
# возвращаться:
HTTP/1.1 401 Unauthorized
Date: Sun, 06 Aug 2023 06:09:39 GMT
Content-Type: text/plain; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Server: APISIX/3.4.1
{"message":"Invalid API key in request"}
APISIX предоставляет множество плагинов наблюдения с богатыми функциями. Используя и настраивая эти плагины, вы можете понять поведение API и сделать весь бизнес-процесс более понятным. Наблюдаемость API можно разделить на три ключевые части: бревно, индекс, трассировка. ссылок。
Бревно APISIX можно отправить в указанную бревно Служить через какой-нибудь бревноплатин APISIX.
以下示пример展示了существоватьобозначениемаршрутизация Начатьhttp-logger
из示пример。
curl http://127.0.0.1:9180/apisix/admin/routes/1 \
-H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
"plugins": {
"http-logger": {
"uri": "http://mockbin.org/bin/5451b7cd-af27-41b8-8df1-282ffea13a61"
}
},
"upstream_id": "1",
"uri": "/get"
}'
Уведомление: Может以проходить Исправлятьuri
свойство,Волявышеhttp-logger
из Служитьустройство Изменение адресадлядругой Служитьустройствоадрес:
{
"uri": "http://mockbin.org/bin/5451b7cd-af27-41b8-8df1-282ffea13a61"
}
После успешного создания,Может以проходить Следующая команда переходит кget
Конечная точка отправляет запрос на созданиебревно。
curl -i http://127.0.0.1:9080/get
После успешного выполнения запроса,Можно нажатьИмитированная ссылка на серверпросмотреть посещениебревно。 Эффект отображения следующий:
Индекс — это значение, измеренное за определенный период времени. Отличается от бревно,индекс структурирован по умолчанию,Это делает запроси Оптимизировать хранилище стало проще。
иAPISIX
Также предоставленоPrometheus
изплагинполучитьAPI
индекс,исуществоватьPrometheus
серединаразоблачить их。
проходитьиспользоватьAPISIX
поставлятьизGrafana
Метаданные информационной панели,и изPrometheus
серединаполучатьиндекс,Контролировать прощеAPI
。
проходить Следующая командадавать возможностьprometheus
плагин:
curl http://127.0.0.1:9180/apisix/admin/routes/1 \
-H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
"uri": "/get",
"plugins": {
"prometheus": {}
},
"upstream_id": "1" # Укажите идентификатор потока
}'
После успешной активации,Может以проходить/apisix/prometheus/metrics
Приобретение интерфейсаAPISIX
изиндекс。
curl -i http://127.0.0.1:9091/apisix/prometheus/metrics
还Может以проходитьhttp://localhost:9090/targets
существоватьPrometheus
Просмотр конечных точек на панели мониторингаизсостояние。
трассировка ссылки предназначены для восстановления запроса на вызывающую ссылку и отображения ситуации вызова запроса топологическим способом, например, показывая время, затраченное на каждый микроузел, через какие серверы прошел запрос, а также статус запроса каждого узла. . и т.п. содержание.
проходитьнравиться下示пример,существоватьобозначениемаршрутизациясерединадавать возможностьzipkin
плагин:
curl http://127.0.0.1:9180/apisix/admin/routes/1 \
-H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
"methods": [
"GET"
],
"uri": "/get",
"plugins": {
"zipkin": {
"endpoint": "http://127.0.0.1:9411/api/v2/spans",
"sample_ratio": 1
}
},
"upstream_id": "1" # Укажите upstream_id
}'
Запросите APISIX с помощью следующей команды:
curl -i http://127.0.0.1:9080/get
Как показано ниже,Возврат результатовсерединаизheader
Добавлены некоторые дополненияизидентификатор отслеживания(TraceId、SpanId и ParentId):
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 470
Connection: keep-alive
Date: Sun, 06 Aug 2023 10:03:16 GMT
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
Server: APISIX/3.4.1
{
"args": {},
"headers": {
"Accept": "*/*",
"Host": "127.0.0.1",
"User-Agent": "curl/7.61.1",
"X-Amzn-Trace-Id": "Root=1-64cf6fe0-09e409de516b26f632946e46",
"X-B3-Parentspanid": "1b9b7f3fe43796c2", // ParentId
"X-B3-Sampled": "1",
"X-B3-Spanid": "0e881fc8b8fe5ec6", // SpanId
"X-B3-Traceid": "267172faeb84010f3c50229afdb851d6", // TraceId
"X-Forwarded-Host": "127.0.0.1"
},
"origin": "172.18.0.1, 124.126.139.14",
"url": "http://127.0.0.1/get"
}
【ссылка】 Get APISIX Почему Апач APISIX выбирает технологический стек NGINX+Lua? Высокопроизводительный шлюз apisix — документация по разработке на китайском языке Ван Юаньшэн: Апачи APISIX Анализ максимальной производительности архитектуры микросервисного шлюза Давайте поговорим еще раз APISIX практика высокой производительности Анализ архитектуры APISIX: как динамически управлять кластером Nginx? Учебные пособия для няни, которые помогут вам быстро приступить к работе от концепции к практике. Apache APISIX Ingress После года практики vivo как на основе APISIX Развивайте бизнес-инфраструктуру Шлюз APISIX в практике производства снежных комов APISIX+Dubbo+Nacos лучшие практики