Вы просматриваете документацию Apigee Edge .
Перейдите в документацию Apigee X.info
Цель данного документа — предоставить набор стандартов и лучших практик для разработки с использованием Apigee Edge. В нем рассматриваются такие темы, как проектирование, кодирование, использование политик, мониторинг и отладка. Информация собрана на основе опыта разработчиков, работающих с Apigee и успешно внедряющих API-приложения. Этот документ постоянно обновляется.
В дополнение к приведенным здесь рекомендациям, вам также может пригодиться сообщение в сообществе Apigee Edge Antipatterns .
стандарты развития
Комментарии и документация
- Добавьте встроенные комментарии в конфигурации ProxyEndpoint и TargetEndpoint. Комментарии улучшают читаемость потока, особенно в тех случаях, когда имена файлов политик недостаточно информативны для описания базовой функциональности потока.
- Оставляйте полезные комментарии. Избегайте банальных замечаний.
- Используйте одинаковые отступы, интервалы, вертикальное выравнивание и т. д.
Кодирование в стиле фреймворка
В стиле фреймворкового программирования ресурсы API-прокси хранятся в собственной системе контроля версий для повторного использования в локальных средах разработки. Например, чтобы повторно использовать политику, сохраните её в системе контроля версий, чтобы разработчики могли синхронизировать её и использовать в своих собственных средах разработки прокси.
- Чтобы обеспечить принцип DRY («не повторяйся»), по возможности, конфигурации политик и скрипты должны реализовывать специализированные, многократно используемые функции. Например, отдельная политика для извлечения параметров запроса из сообщений запроса может называться
ExtractVariables.ExtractRequestParameters. Отдельная политика для внедрения заголовков CORS может называтьсяAssignMessage.SetCORSHeaders. Затем эти политики можно хранить в вашей системе контроля версий и добавлять к каждому API-прокси, которому необходимо извлекать параметры или устанавливать заголовки CORS, без необходимости создания избыточных (и, следовательно, менее управляемых) конфигураций. - Удалите неиспользуемые политики и ресурсы (JavaScript, Java, XSLT и т. д.) из API-прокси, особенно крупные ресурсы, которые могут замедлить процедуры импорта и развертывания.
Правила именования
- Атрибут «
nameполитики» и имя XML-файла политики должны совпадать. - Атрибуты
nameполитики Script и ServiceCallout, а также имя файла ресурсов должны совпадать. -
DisplayNameдолжен точно описывать функцию политики для человека, который никогда раньше не работал с этим API-прокси. - Называйте политики в соответствии с их функцией. Apigee рекомендует установить единообразную систему именования для ваших политик. Например, используйте короткие префиксы, за которыми следует последовательность описательных слов, разделенных дефисами. Например,
AM-xxxдля политик AssignMessage. См. также инструмент apigeelint . - Используйте соответствующие расширения для файлов ресурсов:
.jsдля JavaScript,.pyдля Python и.jarдля JAR-файлов Java. - Названия переменных должны быть единообразными. Если вы выбираете стиль, например camelCase или under_score, используйте его во всем API-прокси.
- По возможности используйте префиксы переменных для организации переменных в зависимости от их назначения, например,
Consumer.usernameиConsumer.password.
разработка API-прокси
Первоначальные соображения по проектированию
- Для получения рекомендаций по проектированию RESTful API скачайте электронную книгу «Web API Design: The Missing Link» .
- Используйте политики и функциональные возможности Apigee Edge везде, где это возможно, для создания API-прокси. Избегайте написания всей логики прокси на JavaScript, Java или Python.
- Создавайте потоки событий организованным образом. Предпочтительнее использовать несколько потоков, каждый с одним условием, чем несколько условных привязок к одному и тому же предварительному и последующему потокам.
- В качестве «подстраховки» создайте прокси-сервер API по умолчанию с базовым путем ProxyEndpoint
/. Это можно использовать для перенаправления базовых запросов API на сайт разработчика, для возврата пользовательского ответа или для выполнения другого действия, более полезного, чем возвратmessaging.adaptors.http.flow.ApplicationNotFoundпо умолчанию.
- Используйте ресурсы TargetServer для отделения конфигураций TargetEndpoint от конкретных URL-адресов, что позволит поддерживать продвижение между средами.
См. раздел «Балансировка нагрузки между серверами бэкэнда» . - Если у вас несколько правил маршрутизации (RouteRules), создайте одно из них в качестве «правила по умолчанию», то есть как правило маршрутизации без условий. Убедитесь, что правило маршрутизации по умолчанию определено последним в списке условных маршрутов. Правила маршрутизации оцениваются сверху вниз в ProxyEndpoint.
См. справочник по настройке API-прокси . - Размер пакета API-прокси: размер пакета API-прокси не может превышать 15 МБ. В Apigee Edge for Private Cloud вы можете изменить ограничение размера, изменив свойство
thrift_framed_transport_size_in_mbв следующих местах: cassandra.yaml (в Cassandra) и conf/apigee/management-server/repository.properties. - Версионирование API: С мнением и рекомендациями Apigee по версионированию API можно ознакомиться в разделе «Версионирование» в электронной книге «Проектирование веб-API: недостающее звено ».
Включение CORS
Перед публикацией ваших API вам необходимо включить CORS на ваших API-прокси для поддержки междоменных запросов на стороне клиента.
CORS (Cross-origin resource sharing) — это стандартный механизм, позволяющий вызовам JavaScript XMLHttpRequest (XHR), выполняемым на веб-странице, взаимодействовать с ресурсами из доменов, не являющихся доменами вашего источника. CORS — это широко распространенное решение проблемы политики одного источника , которая применяется всеми браузерами. Например, если вы выполняете вызов XHR к API Twitter из кода JavaScript, работающего в вашем браузере, вызов завершится неудачей. Это происходит потому, что домен, обслуживающий страницу в вашем браузере, не совпадает с доменом, обслуживающим API Twitter. CORS решает эту проблему, позволяя серверам «добровольно» включать функцию совместного использования ресурсов между источниками, если они этого хотят.
Для получения информации о включении CORS в ваших API-прокси перед публикацией API см. раздел «Добавление поддержки CORS в API-прокси» .
Размер полезной нагрузки сообщения
Во избежание проблем с памятью в Edge размер полезной нагрузки сообщения ограничен 10 МБ. Превышение этого размера приводит к ошибке protocol.http.TooBigBody .
Этот вопрос также обсуждается в этом сообщении на форуме Apigee Community .
Ниже приведены рекомендуемые стратегии обработки сообщений большого размера в Edge:
- Потоковая передача запросов и ответов. Обратите внимание, что при потоковой передаче политики больше не имеют доступа к содержимому сообщения. См. раздел «Потоковая передача запросов и ответов» .
- В Edge for Private Cloud версии 4.15.07 и более ранних версиях отредактируйте файл
http.propertiesобработчика сообщений, увеличив лимит в параметреHTTPResponse.body.buffer.limit. Обязательно протестируйте изменения перед развертыванием в рабочей среде. - В Edge for Private Cloud версии 4.16.01 и более поздних версиях запросы с полезной нагрузкой должны включать заголовок Content-Length, или, в случае потоковой передачи, заголовок "Transfer-Encoding: chunked". Для POST-запроса к API-прокси с пустой полезной нагрузкой необходимо передать Content-Length равный 0.
- В Edge for Private Cloud версии 4.16.01 и более поздних версиях для изменения ограничений установите следующие параметры в файлах /opt/apigee/router.properties или message-processor.properties. Дополнительную информацию см. в разделе «Установка ограничения размера сообщения на маршрутизаторе или обработчике сообщений» .
Оба параметра имеют значение по умолчанию "10m", что соответствует 10 МБ:- conf_http_HTTPRequest.body.buffer.limit
- conf_http_HTTPResponse.body.buffer.limit
Обработка ошибок
- Используйте правила обработки ошибок (FaultRules) для обработки всех ошибок. (Политики RaiseFault используются для остановки потока сообщений и отправки обработки в поток правил обработки ошибок.)
- В потоке FaultRules используйте политики AssignMessage для формирования ответа об ошибке, а не политики RaiseFault. Условно выполняйте политики AssignMessage в зависимости от типа возникшей ошибки.
- Всегда включает обработчик ошибок по умолчанию, позволяющий сопоставлять системные ошибки с заданными пользователем форматами ответов на запросы.
- По возможности всегда оформляйте ответы на сообщения об ошибках в соответствии со стандартными форматами, доступными в вашей компании или проекте.
- Используйте содержательные, понятные человеку сообщения об ошибках, предлагающие решение возникшей проблемы.
См. раздел «Обработка ошибок» .
Рекомендации по передовым отраслевым практикам см. в разделе «Проектирование RESTful-ответов на ошибки» .
Упорство
Карты ключ/значение
- Используйте карты ключ/значение только для ограниченных наборов данных. Они не предназначены для долговременного хранения данных.
- При использовании сопоставления ключ/значение следует учитывать производительность, поскольку эта информация хранится в базе данных Cassandra.
См. политику работы с картой ключевых значений .
Кэширование ответов
- Не заполняйте кэш ответов, если ответ не был успешным или если запрос не является GET-запросом. Кэширование операций создания, обновления и удаления не требуется.
<SkipCachePopulation>response.status.code != 200 or request.verb != "GET"</SkipCachePopulation> - Заполните кэш одним согласованным типом контента (например, XML или JSON). После получения записи в responseCache преобразуйте ее в необходимый тип контента с помощью JSONtoXML или XMLToJSON. Это предотвратит хранение двойных, тройных или более повторяющихся данных.
- Убедитесь, что ключ кэша соответствует требованиям кэширования. Во многих случаях в качестве уникального идентификатора можно использовать
request.querystring. - Не включайте ключ API (
client_id) в ключ кэша, если это явно не требуется. Чаще всего API, защищенные только ключом, возвращают одни и те же данные всем клиентам для одного и того же запроса. Хранить одно и то же значение для нескольких записей на основе ключа API неэффективно. - Установите подходящие интервалы истечения срока действия кэша, чтобы избежать некорректного чтения.
- По возможности старайтесь, чтобы политика кэширования ответов, заполняющая кэш, выполнялась как можно позже в PostFlow ответа ProxyEndpoint. Другими словами, пусть она выполняется после этапов преобразования и медиации, включая медиацию на основе JavaScript и преобразование между JSON и XML. Кэширование обработанных данных позволяет избежать затрат на производительность, связанных с выполнением этапа медиации каждый раз при получении кэшированных данных.
Обратите внимание, что в случае, если в результате обработки данных ответ будет отличаться от запроса к запросу, возможно, вам стоит кэшировать данные без посредничества.
- Политика кэширования ответов для поиска записи в кэше должна выполняться в предварительном потоке запроса ProxyEndpoint. Избегайте реализации слишком сложной логики, за исключением генерации ключа кэша, перед возвратом записи в кэше. В противном случае преимущества кэширования будут сведены к минимуму.
- В целом, поиск в кэше ответов следует проводить как можно ближе к моменту запроса клиента. И наоборот, заполнение кэша ответов следует проводить как можно ближе к моменту ответа клиента.
- При использовании нескольких различных политик кэширования ответов в прокси-сервере следуйте этим рекомендациям, чтобы обеспечить различное поведение для каждой из них:
- Выполняйте каждую политику на основе взаимоисключающих условий. Это поможет гарантировать, что будет выполнена только одна из нескольких политик кэширования ответов.
- Для каждой политики кэширования ответов задайте разные ресурсы кэша. Ресурс кэша указывается в элементе <CacheResource> политики.
См. политику кэширования ответов .
Политика и пользовательский код
Политика или пользовательский код?
- В первую очередь (по возможности) используйте встроенные политики. Политики Apigee усилены, оптимизированы и поддерживаются. Например, используйте стандартные политики AssignMessage и ExtractVariables вместо JavaScript (по возможности) для создания полезных нагрузок, извлечения информации из полезных нагрузок (XPath, JSONPath) и т. д.
- JavaScript предпочтительнее Python и Java. Однако, если производительность является основным требованием, следует использовать Java вместо JavaScript.
JavaScript
- Используйте JavaScript, если это более интуитивно понятно, чем политики Apigee (например, при установке
target.urlдля множества различных комбинаций URI). - Сложный анализ полезной нагрузки, например, итерация по объекту JSON и кодирование/декодирование Base64.
- В политике JavaScript существует ограничение по времени, поэтому бесконечные циклы блокируются.
- Всегда используйте шаги JavaScript и размещайте файлы в папке ресурсов
jsc. Тип политики JavaScript предварительно компилирует код во время развертывания.
См. раздел «Программирование API-прокси с помощью JavaScript» .
Java
- Используйте Java, если производительность имеет наивысший приоритет или если логику невозможно реализовать на JavaScript.
- Включайте исходные файлы Java в систему отслеживания исходного кода.
См. разделы «Преобразование ответа в верхний регистр с помощью вызова Java» и «Политика вызова Java» для получения информации об использовании Java в прокси-серверах API.
Python
- Не используйте Python, если это не абсолютно необходимо. Скрипты на Python могут создавать узкие места в производительности при простом выполнении, поскольку они интерпретируются во время выполнения.
Вызовы скриптов (Java, JavaScript, Python)
- Используйте глобальный блок try/catch или аналогичный.
- Генерируйте осмысленные исключения и корректно перехватывайте их для использования в ответах на ошибки.
- Выбрасывайте и перехватывайте исключения на ранних этапах. Не используйте глобальный блок try/catch для обработки всех исключений.
- При необходимости выполняйте проверки на null и undefined. Например, это может потребоваться при получении необязательных переменных потока.
- Избегайте выполнения HTTP/S-запросов внутри вызова скрипта. Вместо этого используйте политику Apigee ServiceCallout, поскольку она корректно обрабатывает соединения.
JavaScript
- JavaScript на платформе API поддерживает XML через E4X .
См. объектную модель JavaScript .
Java
- При доступе к содержимому сообщений старайтесь использовать
context.getMessage()вместоcontext.getResponseMessageилиcontext.getRequestMessage. Это гарантирует, что код сможет получить содержимое как в потоке запроса, так и в потоке ответа. - Импортируйте библиотеки в организацию или среду Apigee Edge, но не включайте их в JAR-файл. Это уменьшит размер пакета и позволит другим JAR-файлам получать доступ к тому же репозиторию библиотек.
- Импортируйте JAR-файлы, используя API ресурсов Apigee, вместо того, чтобы включать их в папку ресурсов прокси-сервера API. Это сократит время развертывания и позволит использовать одни и те же JAR-файлы несколькими прокси-серверами API. Еще одно преимущество — изоляция загрузчика классов.
- Не используйте Java для управления ресурсами (например, для создания и управления пулами потоков).
См. Преобразование ответа в верхний регистр с помощью вызова Java .
Python
- Генерируйте осмысленные исключения и корректно перехватывайте их для использования в ответах Apigee на ошибки.
См. политику использования скриптов Python .
Вызовы сервисной службы
- Существует множество обоснованных сценариев использования цепочки прокси-серверов, когда вызов сервиса в одном API-прокси используется для вызова другого API-прокси. При использовании цепочки прокси-серверов обязательно избегайте «бесконечных циклов» рекурсивных вызовов обратно в один и тот же API-прокси.
Если вы устанавливаете соединение между прокси-серверами, находящимися в одной организации и среде, обязательно ознакомьтесь с разделом «Объединение API-прокси в цепочку» для получения дополнительной информации о реализации локального соединения, позволяющего избежать ненужных сетевых накладных расходов.
- Создайте сообщение запроса ServiceCallout, используя политику AssignMessage, и заполните объект запроса в переменной сообщения. (Это включает в себя установку полезной нагрузки запроса, пути и метода.)
- URL-адрес, настраиваемый в политике, требует указания протокола, то есть часть URL-адреса, отвечающая за протокол, например,
https://, не может быть указана переменной. Кроме того, необходимо использовать отдельные переменные для доменной части URL-адреса и для остальной части URL-адреса. Например:https://{domain}/{path} - Сохраните объект ответа для вызова службы в отдельной переменной сообщения. Затем вы можете проанализировать эту переменную сообщения, сохранив при этом исходную полезную нагрузку сообщения для использования другими политиками.
См. правила вызова сервисной службы .
Доступ к сущностям
Политика AccessEntity
- Для повышения производительности ищите приложения по
uuid, а не по названию приложения.
См. Политику доступа к сущностям .
Ведение журнала
- Используйте единую политику syslog для всех пакетов и внутри одного пакета. Это обеспечит согласованный формат логирования.
См. политику ведения журнала сообщений .
Мониторинг
Клиентам облачной платформы не требуется проверять отдельные компоненты Apigee Edge (маршрутизаторы, обработчики сообщений и т. д.). Глобальная операционная команда Apigee тщательно отслеживает все компоненты, а также проводит проверки работоспособности API по запросам клиентов.
Apigee Analytics
Аналитические инструменты могут обеспечивать мониторинг некритичных API-интерфейсов, поскольку измеряется процент ошибок.
См. панели аналитики .
След
Инструмент трассировки в пользовательском интерфейсе управления API Edge полезен для отладки проблем API во время выполнения, как в процессе разработки, так и в процессе эксплуатации API.
См. раздел «Использование инструмента трассировки» .
Безопасность
- Используйте политики ограничения доступа по IP-адресам, чтобы ограничить доступ к вашей тестовой среде. Разрешите доступ для IP-адресов ваших машин или сред разработки и запретите доступ для всех остальных. Политика AccessControl .
- Всегда применяйте политики защиты контента (JSON и/или XML) к API-прокси, развернутым в производственной среде. Политика JSONThreatProtection .
- Дополнительные рекомендации по обеспечению безопасности см. в следующих разделах: