Anti-pola: Menggunakan Kebijakan Panggilan Layanan untuk memanggil layanan backend di Proxy API Tidak Ada Target

Anda sedang melihat dokumentasi Apigee dan Apigee Hybrid.
Lihat dokumentasi Apigee Edge.

Proxy API adalah fasad terkelola untuk layanan backend. Konfigurasi proxy API dasar terdiri dari ProxyEndpoint (menentukan URL proxy API) dan TargetEndpoint (menentukan URL layanan backend).

Apigee menawarkan banyak fleksibilitas untuk membangun perilaku canggih di atas pola ini. Misalnya, Anda dapat menambahkan kebijakan untuk mengontrol cara API memproses permintaan klien sebelum mengirimkannya ke layanan backend, atau memanipulasi respons yang diterima dari layanan backend sebelum meneruskannya ke klien. Anda dapat memanggil layanan lain menggunakan kebijakan pemanggilan layanan, menambahkan perilaku kustom dengan menambahkan kode JavaScript, dan bahkan membuat proxy API yang tidak memanggil layanan backend.

Antipola

Menggunakan pemanggilan layanan untuk memanggil layanan backend di proxy API tanpa rute ke endpoint target secara teknis dapat dilakukan, tetapi akan mengakibatkan hilangnya data analisis tentang performa layanan eksternal.

Proxy API yang tidak berisi rute target dapat berguna jika Anda tidak perlu meneruskan pesan permintaan ke TargetEndpoint. Sebagai gantinya, ProxyEndpoint melakukan semua pemrosesan yang diperlukan. Misalnya, ProxyEndpoint dapat mengambil data dari pencarian ke key/value store layanan API dan menampilkan respons tanpa memanggil layanan backend.

Anda dapat menentukan null Route dalam proxy API, seperti yang ditampilkan di sini:

<RouteRule name="noroute"/>

Proxy yang menggunakan rute null adalah proxy "tanpa target", karena tidak memanggil layanan backend target.

Secara teknis, Anda dapat menambahkan info layanan ke proxy tanpa target untuk memanggil layanan eksternal, seperti yang ditunjukkan pada contoh di bawah:

<!-- /antipatterns/examples/service-callout-no-target-1.xml -->
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ProxyEndpoint name="default">
    <Description/>
    <FaultRules/>
    <PreFlow name="PreFlow">
        <Request>
            <Step>
                <Name>ServiceCallout-InvokeBackend</Name>
            </Step>
        </Request>
        <Response/>
    </PreFlow>
    <PostFlow name="PostFlow">
        <Request/>
        <Response/>
    </PostFlow>
    <Flows/>
    <HTTPProxyConnection>
        <BasePath>/no-target-proxy</BasePath>
        <Properties/>
        <VirtualHost>secure</VirtualHost>
    </HTTPProxyConnection>
    <RouteRule name="noroute"/>
</ProxyEndpoint>

Namun, proxy tidak dapat memberikan informasi analisis tentang perilaku layanan eksternal (seperti waktu pemrosesan atau tingkat error), sehingga sulit menilai performa layanan eksternal.

Dampak

  • Informasi analisis tentang interaksi dengan layanan eksternal ( kode error, waktu respons, performa target, dll.) tidak tersedia
  • Logika tertentu yang diperlukan sebelum atau setelah pemanggilan layanan disertakan sebagai bagian dari logika proxy secara keseluruhan, sehingga lebih sulit untuk dipahami dan digunakan kembali.

Praktik Terbaik

Jika proxy API hanya berinteraksi dengan satu layanan eksternal, proxy harus mengikuti pola desain dasar, dengan layanan backend ditetapkan sebagai endpoint target proxy API. Proxy tanpa aturan perutean ke endpoint target tidak boleh memanggil layanan backend menggunakan kebijakan ServiceCallout.

Konfigurasi proxy berikut mengimplementasikan perilaku yang sama seperti contoh di atas, tetapi mengikuti praktik terbaik:

<!-- /antipatterns/examples/service-callout-no-target-2.xml -->
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ProxyEndpoint name="default">
    <Description/>
    <FaultRules/>
    <PreFlow name="PreFlow">
        <Request/>
        <Response/>
    </PreFlow>
    <PostFlow name="PostFlow">
        <Request/>
        <Response/>
    </PostFlow>
    <Flows/>
    <HTTPProxyConnection>
        <BasePath>/simple-proxy-with-route-to-backend</BasePath>
        <Properties/>
        <VirtualHost>secure</VirtualHost>
    </HTTPProxyConnection>
    <RouteRule name="default">
        <TargetEndpoint>default</TargetEndpoint>
    </RouteRule>
</ProxyEndpoint>

Gunakan Info layanan untuk mendukung skenario gabungan, ketika Anda ingin memanggil layanan eksternal sebelum atau setelah memanggil endpoint target. Pemanggilan layanan tidak dimaksudkan untuk menggantikan pemanggilan endpoint target.

Bacaan lebih lanjut