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

Você está vendo a documentação do Apigee Edge.
Acesse a documentação da Apigee X.
informações

O Edge tem um utilitário poderoso 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 de desenvolvedor, desenvolvedores, chaves de cliente etc.
  • Recuperação de informações sobre essas entidades

Esses serviços são disponibilizados por meio de um componente chamado Servidor de gerenciamento na plataforma Apigee Edge. Esses serviços 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 entidades como KeyValueMaps, tokens de acesso OAuth, produtos de API, apps de desenvolvedor, desenvolvedores, chaves de cliente etc. 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, é possível receber a lista de produtos da API ou o endereço de e-mail do desenvolvedor no momento da execução. Essas informações estarão disponíveis como parte do perfil dos apps para desenvolvedores.

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

Antipadrão

As APIs de gerenciamento são preferenciais e úteis para tarefas administrativas e não devem ser usadas para executar qualquer lógica de execução no fluxo de proxies de 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, aumenta a dependência dos 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 da API de gerenciamento é feita usando 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, o código JavaScript que invoca a chamada da API de gerenciamento falhará. 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 de gerenciamento precisam ser armazenadas localmente ou em algum armazenamento seguro, como a KVM criptografada.
  • 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 eficazes de recuperar informações de entidades como KeyValueMaps, produtos de API, DeveloperApps, desenvolvedores, chaves de cliente etc. no ambiente de execução. Veja alguns exemplos:

  • Use uma política KeyValueMapOperations para acessar informações de KeyValueMaps. Este é 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 de desenvolvedores, desenvolvedores, chaves de cliente etc. no proxy de 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 exemplo de código que mostra como recuperar o nome e as informações criadas_by de um app do desenvolvedor 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 de API não tiver uma política VerifyAPIKey, acesse os perfis de produtos da API, apps de desenvolvedores etc. usando as políticas de acesso de entidade e de extração de variáveis:
      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>
        

Leia mais