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

Esta é a documentação do Apigee Edge.
Acesse 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, Developer apps, desenvolvedores, chaves do consumidor 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. Esses serviços podem ser invocados facilmente com a ajuda de uma API de gerenciamento simples chamadas.

Às vezes, podemos precisar usar um ou mais desses serviços dos proxies de API no ambiente de execução. Isso é porque as entidades como KeyValueMaps, OAuth Access Tokens, API Products, Developer Apps "Desenvolvedores", "Chaves de consumidor" etc. contêm informações úteis na forma de pares de chave-valor, atributos ou como parte de seu 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 de 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 com eficiência no tempo de execução para ativar o comportamento dinâmico em políticas ou código personalizado no Apigee Edge.

Antipadrão

As APIs de gerenciamento são preferíveis e úteis para tarefas administrativas e não devem ser usadas para executando qualquer lógica de tempo de execução no fluxo de proxies de API. Isso ocorre pelos seguintes motivos:

  • Uso de APIs de gerenciamento para acessar informações sobre as entidades como KeyValueMaps, OAuth Tokens de acesso ou para qualquer outra finalidade de proxies de API leva à dependência do gerenciamento Servidores.
  • Os servidores de gerenciamento não fazem parte do componente do Edge Runtime e, portanto, podem não ser altamente disponível.
  • 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 à API de gerenciamento é feita pelo código JavaScript personalizado para recupere 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 não estiver disponível, o código JavaScript que invoca a API de gerenciamento falha. 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 local seguro como a Encrypted KVM.
  • 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á formas mais eficazes de recuperar informações de entidades como KeyValueMaps, API Produtos, DeveloperApps, Desenvolvedores, Chaves do consumidor etc. no momento da 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. Este é um exemplo de código que mostra como recuperar o nome e as informações created_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 perfis de produtos de API, apps para desenvolvedores etc. usando as variáveis de entidade de acesso e extração políticas:
      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