Antipadrão: invocar chamadas da API Apigee de um proxy de API

Esta é a documentação da Apigee e da Apigee híbrida.
Confira a documentação da Apigee Edge.

A Apigee tem um utilitário avançado chamado API da Apigee, que oferece serviços como:

  • Implantar ou remover proxies de API
  • Configurar hosts virtuais, keystores e truststores etc.
  • Criar, excluir e atualizar entidades, como mapas de chave-valor (KVMs), produtos de API, apps para desenvolvedores, desenvolvedores, chaves de consumidor e assim por diante;
  • Recuperação de informações sobre essas entidades

Esses serviços podem ser acessados por um componente chamado servidor de gerenciamento na plataforma Apigee. Eles também podem ser invocados facilmente com a ajuda de chamadas simples da API.

Às vezes, podemos precisar usar um ou mais desses serviços dos proxies de API no ambiente de execução. Isso ocorre porque entidades como KVMs, tokens de acesso OAuth, produtos de API, aplicativospara desenvolvedores, desenvolvedores, chaves do consumidor e assim por diante contêm informações úteis na forma de pares de chave-valor, atributos personalizados ou como parte do perfil.

Por exemplo, é possível armazenar as seguintes informações em KeyValueMap para torná-la mais segura e acessível no ambiente de execução:

  • URLs de destino de back-end
  • Propriedades de ambiente
  • Credenciais de segurança de sistemas de terceiros ou de back-end

Da mesma forma, pode querer obter a lista de produtos de API ou o endereço de e-mail do desenvolvedor no tempo de execução. Essas informações estarão disponíveis como parte do perfil dos apps para desenvolvedores.

Todas essas informações podem ser usadas efetivamente no ambiente de execução para permitir comportamento dinâmico em políticas ou código personalizado na Apigee.

Antipadrão

As APIs da Apigee são preferenciais e úteis para tarefas administrativas e não devem ser usadas para executar nenhuma lógica de ambiente de execução no fluxo de proxies da API. Isso ocorre pelos seguintes motivos:

  • O uso das APIs da Apigee para acessar informações sobre entidades como KVMs, tokens de acesso OAuth ou para qualquer outra finalidade dos proxies de API leva à dependência dos servidores de gerenciamento.
  • Os servidores de gerenciamento não fazem parte dos componentes do ambiente de execução da Apigee e, portanto, podem não estar altamente disponíveis.
  • Os servidores de gerenciamento também não podem ser provisionados dentro da mesma rede ou data center e portanto, podem introduzir latências de rede no ambiente de execução.
  • As entradas nos servidores de gerenciamento são armazenadas em cache por um período maior. Portanto, talvez você não consiga ver os dados mais recentes imediatamente nos proxies da API se executar gravações e leituras em um curto período.
  • Aumento dos saltos de rede no tempo de execução

Na amostra de código abaixo, a chamada da API Apigee é feita com o código JavaScript personalizado para recuperar as informações da KVM:

var response = httpClient.send('https://apigee.googleapis.com/v1/organizations/$ORG/environments/$ENV/keyvaluemaps')

Se o servidor de gerenciamento estiver indisponível, haverá falha no código JavaScript que invoca a chamada da API Apigee. Isso fará com que a solicitação da API falhe.

Impacto

  • Apresenta dependência adicional nos servidores de gerenciamento durante o ambiente de execução. Qualquer falha nos servidores de gerenciamento afetará as chamadas de API.
  • As credenciais do usuário para APIs da Apigee precisam ser armazenadas localmente ou em algum repositório seguro, como um KVM criptografado.
  • Implicações de desempenho, relacionadas à invocação do serviço de gerenciamento pela rede.
  • Pode não exibir os valores atualizados imediatamente devido à expiração mais longa do cache nos servidores de gerenciamento.

Prática recomendada

Há maneiras mais eficientes de recuperar informações de entidades como KVMs, produtos de API, aplicativos para desenvolvedores, desenvolvedores, chaves de consumidor e assim por diante no tempo de execução. Veja alguns exemplos:

  • Use uma política KeyValueMapOperations para acessar informações de KVMs. Este é um código de amostra que mostra como recuperar informações da KVM:
    <!-- /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>
    
  • Para acessar informações sobre produtos de API, apps para desenvolvedores, desenvolvedores, chaves de consumidor e assim por diante no proxy da API, siga um destes procedimentos:
    • Se o fluxo do proxy de API tiver uma política VerifyAPIKey, você poderá acessar as informações usando as variáveis de fluxo preenchidas como parte dessa política. Veja um código de amostra que mostra como recuperar o nome e as informações created_by de um app para desenvolvedores usando 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"));
      
    • Se o fluxo do proxy da API não tiver uma política VerifyAPIKey, você poderá acessar os perfis de produtos, aplicativos de desenvolvedor e assim por diante usando as políticas AccessEntity e ExtractVariables:
      1. Recuperar o perfil do app para desenvolvedores com a política 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. Extrair o appId do app para desenvolvedores com a política 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>
        

Leitura adicional