Тестирование методом инъекции ошибок с помощью API-шлюза

💁 В этой статье блога описывается, как API-шлюз, такой как Apache APISIX, полезен для тестирования надежности и устойчивости API микросервисов.

Исследование стабильности распределенных систем 💪

Распределенные системы, такие как микросервисы, привели к увеличению сложности систем, с которыми мы работаем. Трудно быть полностью уверенным в такой архитектуре, когда есть много компонентов и «множество движущихся частей», которые потенциально могут выйти из строя. Очень важно изящно справляться с отказами в звонках между сервисами. Кроме того, мы хотим быть уверены, что все имеющиеся у нас механизмы отказоустойчивости, такие как код обработки ошибок, автоматический выключатель, проверки работоспособности, повторные попытки, резервные экземпляры и так далее, работают. Мы можем проверить это с помощью метода тестирования Fault Injection 💉.

В этом посте мы познакомимся с типами возможных инъекций сбоев с помощью Fault Injection Plugin 🔌 и смоделируем сбои на нашей существующей службе Product backend (разработанной с помощью ASP.NET Core WEB API).

Вот краткий обзор того, что мы рассмотрим 👇

  • ✅ Инъекция сбоев в программное обеспечение.
  • ✅ Тестирование внедрения сбоев (FIT) с помощью API-шлюза.
  • ✅ Apache APISIX Fault Injection Plugin.
  • ✅ Инъекция отказов различных типов.
  • ✅ Эксперимент с Fault Injection Plugin.

Приложение корректно, если оно работает так, как указано. Оно надежно, если может выдерживать высокую нагрузку до тех пор, пока не выйдет из строя. Приложение устойчиво, если оно может вернуться к нормальной работе после сбоя.

Инъекция неисправностей в программное обеспечение 💻💉

Среди множества методов выявления неисправностей, техника выявления неисправностей программного обеспечения становится особенно популярной среди компаний, управляющих большими, сложными и распределенными системами. В этой технике тестирования программного обеспечения специальный фрагмент кода, связанный с тестируемой системой, пытается имитировать неисправности. Обычно это делается до развертывания системы, чтобы выявить потенциальные недостатки в работающем программном обеспечении 😱. Инъекция неисправностей позволяет лучше определить характер и причину производственных сбоев.

Тестирование методом инъекции неисправностей с помощью шлюза API

Метод инъекции ошибок на уровне шлюза API можно использовать для тестирования устойчивости API приложений или микросервисов к различным формам сбоев для создания уверенности в производственной среде. Этот метод можно использовать для инъекции задержек и прерывания запросов с заданными пользователем кодами ошибок, что дает возможность инсценировать различные сценарии отказов, такие как отказы сервисов, перегрузки сервисов, высокие сетевые задержки, сетевые разделы и т.д. Инжекция сбоев может быть ограничена определенным набором запросов на основе (целевого) кластера восходящего потока запроса и/или набора предварительно определенных заголовков запроса.

Для такого гиганта потокового вещания, как Netflix, переход на сложную облачную архитектуру микросервисов был бы невозможен без революционного метода тестирования, известного как инъекция ошибок 👊. Существует такая очень известная стратегия, как Chaos engineering, которая использует внедрение ошибок для достижения цели создания более надежных систем. И команды Netflix создали свой собственный инструмент хаос-инженерии под названием Chaos Monkey.

Apache APISIX Fault Injection Plugin 🔌

Apache APISIX Fault Injection Plugin также предлагает механизм инъекции некоторых ошибок в наши API и обеспечивает эффективность наших мер по повышению отказоустойчивости.

Apache APISIX работает в двух различных режимах, оба настраиваются с помощью атрибутов плагина fault-injection⤵️:

  1. Задержки: Задержки — это временные сбои. Они имитируют повышенную задержку в сети или перегруженный вышестоящий сервис.

  2. Прерывания: Прерывания — это сбои в работе. Они имитируют сбои в работе вышестоящих служб. Прерывания обычно проявляются в виде кодов ошибок HTTP или сбоев TCP-соединения.

Подробные инструкции по настройке задержек и прерываний см. в разделе Инъекция сбоев. Вы также можете попробовать централизованную платформу API7 Cloud ☁️ для использования более продвинутых функций API Gateway. API7 Cloud предоставляет полностью управляемый сервис хаос-инжиниринга с приборной панелью для простой настройки политики Fault Injection👍🏻.

Эксперимент с плагином Fault Injection Plugin 🔬

В этой части вы узнаете, как внедрять сбои для проверки отказоустойчивости вашего приложения.

Прежде чем начать 🙅

☝️ Ознакомьтесь с концепцией инъекции ошибок.
☝️ Если вы следили за предыдущей статьей блога об управлении .NET API микросервисами с помощью Apache APISIX API Gateway, убедитесь, что вы прочитали ее и выполнили шаги по настройке APISIX, etcd и ASP.NET WEB API, прежде чем продолжить демонстрационную сессию. Или вы можете посмотреть полный исходный код на Github и инструкцию по созданию многоконтейнерного APISIX с помощью Docker CLI.

Понимание демонстрационного сценария

Я предполагаю, что у вас запущен демонстрационный проект apisix-dotnet-docker. В проекте ASP.NET Core есть простой API для получения списка всех продуктов из сервисного уровня в файле ProductsController.cs.

Предположим, что у нас есть пример приложения для интернет-магазина, которое состоит из множества микросервисов, таких как Каталог, Продукт, Заказ и т.д.. Когда мы получаем данные о товарах, принадлежащих определенному каталогу, между сервисами Catalog и Product будет происходить межсервисное взаимодействие. В этом случае по ряду причин что-то может пойти не так.

Чтобы проверить микросервисы торгового приложения на отказоустойчивость, мы будем имитировать неправильное поведение сервиса Product как неисправного сервиса:

  • Добавляя задержку к HTTP-запросу.
  • Прерывая HTTP-запросы и возвращая пользовательский код состояния.

Внедрение ошибки задержки HTTP

В первом примере мы вводим 5-секундную задержку для каждого запроса к службе продукта, чтобы проверить, правильно ли мы установили таймаут соединения для вызовов службы продукта из службы Catalog.

Обратите внимание, что вы также можете указать процент задерживаемых запросов в числах. Например, 10 означает: 10% всех запросов будут задержаны. В нашем демонстрационном примере мы сделали 100%, чтобы легко проверить задержку по времени.

Следующий пример конфигурации маршрута создает новый восходящий поток для нашего внутреннего сервиса (productapi), который работает на порту 80, и регистрирует маршрут с включенным плагином fault-injection. Вы можете заметить, что мы установили задержку инъекции в настройках плагина:

curl http://127.0.0.1:9080/apisix/admin/routes/1 
-H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
  "name": "Route for Fault Injection with the delay",
  "methods": [
    "GET"
  ],
  "uri": "/api/products",
  "plugins": {
    "fault-injection": {
      "delay": {
        "duration": 5,
        "percentage": 100
      }
    }
  },
  "upstream": {
    "type": "roundrobin",
    "nodes": {
      "productapi:80": 1
    }
  }
}'
Войти в полноэкранный режим Выйти из полноэкранного режима

Ниже мы подтвердим, что правило было создано, выполнив еще одну команду curl с измерением времени:

time curl http://127.0.0.1:9080/api/products -i
Войти в полноэкранный режим Выйти из полноэкранного режима

После выполнения команды вы увидите, что была введена некоторая задержка:

HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive

[{"name":"Macbook Pro","price":1500.9},{"name":"SurfaceBook 3","price":1599.9}]
real    0m5.004s
user    0m0.004s
sys     0m0.000s
Войти в полноэкранный режим Выйти из полноэкранного режима

Результат внедрения ошибки соответствует нашим ожиданиям.👏

Инъекция ошибки прерывания HTTP

В следующем примере мы внедрим HTTP-аборт в микросервис Product, чтобы проверить, как наш воображаемый сервис Catalog немедленно реагирует на сбои, вызванные зависимым сервисом. Допустим, при сбое сервиса Product мы должны ожидать HTTP-ошибку с сообщением об ошибке Product service currently unavailable.

Мы можем проверить это в действии. Теперь мы можем включить инъекцию прерывания со следующими настройками маршрута.

curl http://127.0.0.1:9080/apisix/admin/routes/1 
-H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
  "name": "Route for Fault Injection with the abort",
  "methods": [
    "GET"
  ],
  "uri": "/api/products",
  "plugins": {
    "fault-injection": {
      "abort": {
        "http_status": 503,
        "body": "The product service is currently unavailable.",
        "percentage": 100
      }
    }
  },
  "upstream": {
    "type": "roundrobin",
    "nodes": {
      "productapi:80": 1
    }
  }
}'
Войти в полноэкранный режим Выйти из полноэкранного режима

Если вы запустите curl cmd, чтобы попасть на маршрут APISIX, теперь он быстро отвечает ошибкой HTTP 503, что, в свою очередь, очень удобно для тестирования службы каталога, как она реагирует на подобные ошибки сервера от нижестоящих служб.

curl  http://127.0.0.1:9080/api/products -i

HTTP/1.1 503 Service Temporarily Unavailable
Content-Type: text/plain; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Server: APISIX/2.13.1
Вход в полноэкранный режим Выход из полноэкранного режима

На этом мы можем завершить наш демонстрационный пример.

Резюме

Как мы узнали, используя метод инъекции ошибок, инженеры могут создавать более совершенные и стабильные системы. А проекты с открытым исходным кодом, такие как Apache APISIX, делают более доступными для нас некоторые методы тестирования методом инъекции ошибок и помогают планировать неизвестные сбои в распределенной архитектуре.

Связанные ресурсы

➔ Реализация отказоустойчивых приложений с помощью API Gateway (Circuit breaker).

➔ Реализация отказоустойчивых приложений с API Gateway (проверка работоспособности).

Рекомендуемый контент 💁

➔ Смотрите видеоурок:

  • Начало работы с Apache APISIX.

  • Управление API микросервисов .NET с помощью шлюза API Apache APISIX.

➔ Читайте статьи в блоге:

  • Обзор плагинов Apache APISIX API Gateway.

  • Запуск Apache APISIX на контейнерном инстансе Microsoft Azure.

  • Безопасность API с OIDC с помощью Apache APISIX и Microsoft Azure AD.

  • Наблюдаемость API с помощью плагинов Apache APISIX.

Сообщество⤵️

🙋 Присоединяйтесь к сообществу Apache APISIX.
🐦 Следите за нами в Twitter
📝 Найдите нас в Slack
📧 Пишите нам со своими вопросами.

Оцените статью
devanswers.ru
Добавить комментарий