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

Você está lendo a documentação do Apigee Edge.
Acesse a documentação da Apigee X.
info

O Edge tem um utilitário avançado chamado "APIs de gerenciamento", que oferece serviços como:

  • Implantar ou remover proxies de API
  • Configurar hosts virtuais, keystores e truststores etc.
  • Criar, excluir e/ou atualizar entidades, como KeyValueMaps, produtos de API, apps para desenvolvedores, desenvolvedores, chaves de cliente etc.
  • Recuperação de informações sobre essas entidades

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

Às vezes, podemos precisar usar um ou mais desses serviços dos proxies de API no ambiente de execução. Isso ocorre porque as entidades como KeyValueMaps, tokens de acesso do OAuth, produtos de API, apps para desenvolvedores, desenvolvedores, chaves de cliente etc. contêm informações úteis no formato de pares de chave-valor, atributos personalizadas 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 Edge.

Antipadrão

As APIs de gerenciamento 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 de APIs de gerenciamento para acessar informações sobre as entidades, como KeyValueMaps, tokens de acesso OAuth ou para qualquer outra finalidade de proxies de API leva à dependência nos servidores de gerenciamento.
  • Os servidores de gerenciamento não fazem parte do componente de ambiente de execução do Edge 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 não seja possível ver os dados mais recentes imediatamente nos proxies da API se realizarmos gravações e leituras em um curto período.
  • Aumento dos saltos de rede no tempo de execução

No exemplo de código abaixo, a chamada de API de gerenciamento é feita com o código JavaScript personalizado para recuperar as informações do KeyValueMap:

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

Se o servidor de gerenciamento estiver indisponível, haverá falha no código JavaScript que invoca a chamada da API de gerenciamento. Isso fará com que a solicitação de 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 de gerenciamento 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 KeyValueMaps, produtos de API, apps para desenvolvedores, desenvolvedores, chaves de cliente etc. no ambiente de execução. Veja alguns exemplos:

  • Use uma política KeyValueMapOperations para acessar informações de KeyValueMaps. Confira um exemplo de código que mostra como recuperar informações do 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>
  • Para acessar informações sobre produtos de API, apps para desenvolvedores, desenvolvedores, chaves de cliente etc. no proxy de API, realize uma das seguintes ações:
    • 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. Confira um exemplo de código que mostra como recuperar o nome e as informações de 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 de proxy de API não tiver uma política VerifyAPIKey, será possível acessar os perfis de produtos de API, apps para desenvolvedores etc. usando as políticas de entidade de acesso e variáveis de extração:
      1. Recupere o perfil do DeveloperApp 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. Extraia o appId do DeveloperApp 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