Antipattern: API Proxy'sinden gelen Yönetim API çağrıları

Apigee Edge belgelerini görüntülüyorsunuz.
Apigee X belgelerine gidin.
bilgi

Edge, "yönetim API'leri" adında güçlü bir yardımcı program sunar. Bu yardımcı program aşağıdaki gibi hizmetleri sunar:

  • API Proxy'lerini Dağıtma veya Dağıtımlarını Kaldırma
  • Sanal ana makineleri, anahtar depolarını, güven depolarını ve benzeri öğeleri yapılandırma.
  • KeyValueMap, API Ürünleri, Geliştirici Uygulamaları, Geliştiriciler, Tüketici Anahtarları vb. gibi varlıkları oluşturma, silme ve/veya güncelleme
  • Bu varlıklar hakkında bilgi alınıyor

Bu hizmetlere, Apigee Edge platformundaki Management Server adlı bir bileşen üzerinden erişilebilir. Bu hizmetler, basit management API çağrılarının yardımıyla kolayca çağrılabilir.

Bazen çalışma zamanında API Proxy'lerinden bu hizmetlerden birini veya daha fazlasını kullanmamız gerekebilir. Bunun nedeni, KeyValueMap, OAuth Erişim Jetonları, API Ürünleri, Geliştirici Uygulamaları, Geliştiriciler, Tüketici Anahtarları vb. varlıkların anahtar/değer çiftleri, özel özellikler biçiminde veya profil kapsamında yararlı bilgiler içermesidir.

Örneğin, çalışma zamanında daha güvenli ve erişilebilir hale getirmek için KeyValueMap'te aşağıdaki bilgileri saklayabilirsiniz:

  • Arka uç hedef URL'leri
  • Ortam özellikleri
  • Arka uç veya üçüncü taraf sistemlerin güvenlik kimlik bilgileri

Benzer şekilde, çalışma zamanında API Ürünlerinin listesini veya geliştiricinin e-posta adresini almak isteyebilirsiniz. Bu bilgiler Geliştirici Uygulamaları profilinin bir parçası olarak kullanılabilir.

Tüm bu bilgiler, Apigee Edge'deki politikalarda veya özel kodda dinamik davranış sağlamak için çalışma zamanında etkili bir şekilde kullanılabilir.

Antipattern

Yönetim API'leri tercih edilir ve yönetim görevleri için kullanışlıdır ve API Proxy'leri akışında herhangi bir çalışma zamanı mantığı gerçekleştirmek için kullanılmamalıdır. Bunun nedeni:

  • KeyValueHaritalar ve OAuth Erişim Jetonları gibi varlıklarla ilgili bilgilere erişmek veya API Proxy'lerinden başka herhangi bir amaçla ilgili bilgilere erişmek için yönetim API'lerinin kullanılması, Yönetim Sunucuları'na bağımlılığa yol açar.
  • Yönetim Sunucuları, Edge çalışma zamanı bileşeninin bir parçası olmadığı için yüksek düzeyde kullanılabilir olmayabilir.
  • Ayrıca, Yönetim Sunucuları aynı ağ veya veri merkezi içinde sağlanmamış olabilir ve bu nedenle çalışma zamanında ağ gecikmeleri yaşayabilir.
  • Yönetim sunucularındaki girişler daha uzun süre önbelleğe alınır. Bu nedenle, kısa bir süre içinde yazma ve okuma işlemleri yaparsak en son verileri API Proxy'lerinde hemen göremeyebiliriz.
  • Çalışma zamanında ağ atlamalarını artırır.

Aşağıdaki kod örneğinde, Management API çağrısı, KeyValueMap'ten bilgi almak için özel JavaScript kodu aracılığıyla yapılır:

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

Yönetim sunucusu kullanılamıyorsa Management API çağrısını çağıran JavaScript kodu başarısız olur. Bu da, daha sonra API isteğinin başarısız olmasına neden olur.

Etki

  • Çalışma zamanı sırasında Yönetim Sunucularına ek bağımlılık uygular. Yönetim sunucularındaki hatalar, API çağrılarını etkiler.
  • Yönetim API'leri için kullanıcı kimlik bilgilerinin yerel olarak veya Şifrelenmiş KVM gibi bazı güvenli mağazalarda depolanması gerekir.
  • Yönetim hizmetinin ağ üzerinden çağrılmasından kaynaklanan performans sonuçları.
  • Yönetim sunucularında önbellek sürelerinin daha uzun olması nedeniyle güncellenen değerler hemen görünmeyebilir.

En iyi uygulama

Çalışma zamanında KeyValueMap, API Ürünleri, DeveloperApps, Developers, Consumer Keys vb. gibi varlıklardan bilgi almanın daha etkili yolları vardır. Aşağıda birkaç örnek verilmiştir:

  • KeyValueMap'teki bilgilere erişmek için bir KeyValueMapoperasyon politikası kullanın. KeyValueMap'ten bilgi almayı gösteren örnek kodu aşağıda bulabilirsiniz:
    <!-- /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 Proxy'sinde API Ürünleri, Geliştirici Uygulamaları, Geliştiriciler, Tüketici Anahtarları vb. ile ilgili bilgilere erişmek için aşağıdakilerden birini yapabilirsiniz:
    • API Proxy akışınızda VerifyAPIKey politikası varsa bilgilere bu politika kapsamında doldurulan akış değişkenlerini kullanarak erişebilirsiniz. Aşağıda, JavaScript kullanarak bir Geliştirici Uygulamasının name ve create_by bilgilerinin nasıl alınacağını gösteren örnek kod verilmiştir:
      <!-- /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 Proxy akışınızın bir DoğrulamaAPIKey politikası yoksa API Ürünleri, Geliştirici Uygulamaları vb. profillerine erişmek için Varlık Erişimi ve Değişkenleri Ayıklama politikalarını kullanabilirsiniz:
      1. AccessEntity politikasına sahip DeveloperApp profilini alın:
        <!-- /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 öğesini DeveloperApp'ten ExtractVariables politikasıyla çıkarın:
        <!-- /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>
        

Daha fazla bilgi