Антипаттерн: вызов вызовов Management API из прокси-сервера API

Вы просматриваете документацию Apigee Edge .
Перейдите в документацию Apigee
X.info

Edge обладает мощной утилитой под названием «API управления», которая предоставляет такие услуги, как:

  • Развертывание или удаление API-прокси
  • Настройка виртуальных хостов, хранилищ ключей и доверенных сертификатов и т. д.
  • Создание, удаление и/или обновление таких сущностей, как KeyValueMaps, API-продукты, приложения для разработчиков, разработчики, ключи потребителей и т. д.
  • Получение информации об этих объектах

Доступ к этим сервисам обеспечивается через компонент под названием Management Server в платформе Apigee Edge. Вызов этих сервисов осуществляется легко с помощью простых вызовов API управления.

Иногда нам может потребоваться использовать один или несколько из этих сервисов из API-прокси во время выполнения. Это связано с тем, что такие сущности, как KeyValueMaps, токены доступа OAuth, API-продукты, приложения для разработчиков, разработчики, ключи потребителей и т. д., содержат полезную информацию в виде пар ключ-значение, пользовательских атрибутов или в рамках профиля.

Например, в KeyValueMap можно хранить следующую информацию, чтобы сделать ее более безопасной и доступной во время выполнения:

  • Целевые URL-адреса бэкэнда
  • Свойства окружающей среды
  • Учетные данные безопасности внутренних или сторонних систем

Аналогичным образом, вам может потребоваться получить список продуктов API или адрес электронной почты разработчика во время выполнения. Эта информация будет доступна в профиле приложения разработчика.

Вся эта информация может быть эффективно использована во время выполнения для обеспечения динамического поведения в политиках или пользовательском коде в Apigee Edge.

Антипаттерн

API управления предпочтительны и полезны для административных задач и не должны использоваться для выполнения какой-либо логики во время выполнения в потоке API-прокси. Это связано с тем, что:

  • Использование API управления для доступа к информации о сущностях, таких как KeyValueMaps, токены доступа OAuth или для любых других целей через API-прокси, приводит к зависимости от серверов управления.
  • Серверы управления не являются частью компонента среды выполнения Edge, поэтому их доступность может быть невысокой.
  • Кроме того, серверы управления могут быть развернуты в разных сетях или центрах обработки данных, что может привести к задержкам в сети во время работы.
  • Записи на серверах управления кэшируются на более длительный период времени, поэтому мы можем не сразу увидеть самые свежие данные в API-прокси, если будем выполнять операции записи и чтения в течение короткого промежутка времени.
  • Увеличивает количество сетевых переходов во время выполнения.

В приведенном ниже примере кода вызов API управления осуществляется с помощью пользовательского кода JavaScript для получения информации из KeyValueMap:

var response = httpClient.send('https://api.enterprise.apigee.com/v1/o/org_name/e/env_name/keyvaluemaps/kvm_name')

Если сервер управления недоступен, то выполнение кода JavaScript, вызывающего API управления, завершается с ошибкой. Это, в свою очередь, приводит к сбою запроса к API.

Влияние

  • Вводит дополнительную зависимость от серверов управления во время выполнения. Любой сбой на серверах управления повлияет на вызовы API.
  • Учетные данные пользователей для API управления необходимо хранить либо локально, либо в защищенном хранилище, например, в зашифрованном KVM-сервере.
  • Влияние на производительность из-за вызова службы управления по сети.
  • Обновленные значения могут отобразиться не сразу из-за более длительного срока действия кэша на серверах управления.

Передовая практика

Существуют более эффективные способы извлечения информации из таких сущностей, как KeyValueMaps, API-продукты, приложения для разработчиков, разработчики, ключи потребителей и т. д., во время выполнения. Вот несколько примеров:

  • Для доступа к информации из KeyValueMap используйте политику KeyValueMapOperations . Вот пример кода, демонстрирующий, как получить информацию из KeyValueMap:
    <!-- /antipatterns/examples/2-6.xml -->
    <KeyValueMapOperations mapIdentifier="urlMap" async="false"
        continueOnError="false" enabled="true" name="GetURLKVM">
      <DisplayName>GetURLKVM</DisplayName>
      <ExpiryTimeInSecs>86400</ExpiryTimeInSecs>
      <Scope>environment</Scope>
      <Get assignTo="urlHosti" index="2">
        <Key>
          <Parameter>urlHost_1</Parameter>
        </Key>
      </Get>
    </KeyValueMapOperations>
  • Для доступа к информации о продуктах API, приложениях для разработчиков, разработчиках, ключах потребителей и т. д. в API-прокси вы можете выполнить одно из следующих действий:
    • Если в вашем потоке API-прокси используется политика VerifyAPIKey , то вы можете получить доступ к информации, используя переменные потока, заполняемые в рамках этой политики. Вот пример кода, демонстрирующий, как получить информацию об имени и созданном пользователем приложении разработчика с помощью JavaScript:
      <!-- /antipatterns/examples/2-7.xml -->
      print("Application Name ", context.getVariable(""verifyapikey. VerifyAPIKey.app.name"));
      print("Created by:", context.getVariable("verifyapikey. VerifyAPIKey.app.created_by"));
    • Если в вашем потоке API-прокси отсутствует политика VerifyAPIKey, то вы можете получить доступ к профилям продуктов API, приложений разработчиков и т. д., используя политики Access Entity и Extract Variables:
      1. Получите профиль приложения DeveloperApp с политикой AccessEntity :
        <!-- /antipatterns/examples/2-8.xml -->
        <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
        <AccessEntity async="false" continueOnError="false" enabled="true" name="GetDeveloperApp">
          <DisplayName>GetDeveloperApp</DisplayName>
          <EntityType value="app"></EntityType>
          <EntityIdentifier ref="developer.app.name" type="appname"/>
          <SecondaryIdentifier ref="developer.id" type="developerid"/>
        </AccessEntity>
      2. Извлеките appId из DeveloperApp с помощью политики ExtractVariables :
        <!-- /antipatterns/examples/2-9.xml -->
        <ExtractVariables name="Extract-Developer App-Info">
          <!--
            The source element points to the variable populated by AccessEntity policy.
            The format is <policy-type>.<policy-name>
            In this case, the variable contains the whole developer profile.
          -->
          <Source>AccessEntity.GetDeveloperApp"</Source>
          <VariablePrefix>developerapp</VariablePrefix>
          <XMLPayload>
            <Variable name="appld" type="string">
              <!-- You parse elements from the developer profile using XPath. -->
              <XPath>/App/AppId</XPath>
            </Variable>
          </XMLPayload>
        </ExtractVariables>

Дополнительная информация