Antipattern: فراخوانی های مدیریت API از یک پروکسی API

شما در حال مشاهده مستندات Apigee Edge هستید.
به مستندات Apigee X مراجعه کنید .
اطلاعات

اج یک ابزار قدرتمند به نام «رابط‌های برنامه‌نویسی کاربردی مدیریت» دارد که خدماتی مانند موارد زیر را ارائه می‌دهد:

  • استقرار یا عدم استقرار پروکسی‌های API
  • پیکربندی میزبان‌های مجازی، keystoreها و truststoreها و غیره
  • ایجاد، حذف و/یا به‌روزرسانی موجودیت‌هایی مانند KeyValueMaps، محصولات API، برنامه‌های توسعه‌دهندگان، توسعه‌دهندگان، کلیدهای مصرف‌کننده و غیره.
  • بازیابی اطلاعات در مورد این موجودیت‌ها

این سرویس‌ها از طریق مؤلفه‌ای به نام Management Server در پلتفرم Apigee Edge قابل دسترسی هستند. این سرویس‌ها را می‌توان به راحتی با کمک فراخوانی‌های ساده API مدیریت فراخوانی کرد.

گاهی اوقات ممکن است نیاز داشته باشیم که از یک یا چند سرویس از API Proxies در زمان اجرا استفاده کنیم. دلیل این امر این است که موجودیت‌هایی مانند KeyValueMaps، OAuth Access Tokens، API Products، Developer Apps، Developers، Consumer Keys و غیره حاوی اطلاعات مفیدی به شکل جفت‌های کلید-مقدار، ویژگی‌های سفارشی یا به عنوان بخشی از پروفایل خود هستند.

برای مثال، می‌توانید اطلاعات زیر را در KeyValueMap ذخیره کنید تا در زمان اجرا ایمن‌تر و قابل دسترس‌تر باشد:

  • URL های هدف بک اند
  • خواص محیطی
  • اعتبارنامه‌های امنیتی سیستم‌های پشتیبان یا شخص ثالث

به طور مشابه، ممکن است بخواهید لیست محصولات API یا آدرس ایمیل توسعه‌دهنده را در زمان اجرا دریافت کنید. این اطلاعات به عنوان بخشی از پروفایل برنامه‌های توسعه‌دهنده در دسترس خواهد بود.

تمام این اطلاعات می‌توانند به طور مؤثر در زمان اجرا برای فعال کردن رفتار پویا در سیاست‌ها یا کد سفارشی در Apigee Edge مورد استفاده قرار گیرند.

ضدالگو

APIهای مدیریتی برای وظایف مدیریتی ترجیح داده می‌شوند و مفید هستند و نباید برای انجام هرگونه منطق زمان اجرا در جریان API Proxies استفاده شوند. دلیل این امر این است که:

  • استفاده از APIهای مدیریتی برای دسترسی به اطلاعات مربوط به موجودیت‌هایی مانند KeyValueMaps، OAuth Access Tokens یا برای هر هدف دیگری از API Proxies منجر به وابستگی به سرورهای مدیریتی می‌شود.
  • سرورهای مدیریت بخشی از مؤلفه زمان اجرای Edge نیستند و بنابراین، ممکن است در دسترس بودن بالایی نداشته باشند.
  • سرورهای مدیریت همچنین ممکن است در همان شبکه یا مرکز داده تأمین نشوند و بنابراین ممکن است در زمان اجرا تأخیر شبکه ایجاد کنند.
  • ورودی‌های سرورهای مدیریت برای مدت زمان طولانی‌تری ذخیره می‌شوند، بنابراین اگر عملیات نوشتن و خواندن را در مدت زمان کوتاهی انجام دهیم، ممکن است نتوانیم آخرین داده‌ها را فوراً در API Proxies مشاهده کنیم.
  • جهش‌های شبکه را در زمان اجرا افزایش می‌دهد.

در نمونه کد زیر، فراخوانی API مدیریت از طریق کد جاوا اسکریپت سفارشی برای بازیابی اطلاعات از KeyValueMap انجام می‌شود:

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

اگر سرور مدیریت در دسترس نباشد، کد جاوا اسکریپتی که فراخوانی API مدیریت را فراخوانی می‌کند، با شکست مواجه می‌شود. این امر متعاقباً باعث می‌شود درخواست API با شکست مواجه شود.

تأثیر

  • وابستگی بیشتری به سرورهای مدیریت در زمان اجرا ایجاد می‌کند. هرگونه خرابی در سرورهای مدیریت بر فراخوانی‌های API تأثیر می‌گذارد.
  • اعتبارنامه‌های کاربر برای APIهای مدیریتی باید یا به صورت محلی یا در یک حافظه امن مانند KVM رمزگذاری شده ذخیره شوند.
  • پیامدهای عملکردی ناشی از فراخوانی سرویس مدیریت از طریق شبکه.
  • ممکن است به دلیل طولانی شدن انقضای حافظه پنهان در سرورهای مدیریت، مقادیر به‌روزرسانی‌شده را فوراً مشاهده نکنید.

بهترین شیوه

روش‌های مؤثرتری برای بازیابی اطلاعات از موجودیت‌هایی مانند KeyValueMaps، API Products، DeveloperApps، Developers، Consumer Keys و غیره در زمان اجرا وجود دارد. در اینجا چند مثال آورده شده است:

  • برای دسترسی به اطلاعات از KeyValueMaps از یک سیاست KeyValueMapOperations استفاده کنید. در اینجا نمونه کدی وجود دارد که نحوه بازیابی اطلاعات از 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>
  • برای دسترسی به اطلاعات مربوط به محصولات API، برنامه‌های توسعه‌دهندگان، توسعه‌دهندگان، کلیدهای مصرف‌کننده و غیره در پروکسی API، می‌توانید یکی از موارد زیر را انجام دهید:
    • اگر جریان پروکسی API شما دارای سیاست VerifyAPIKey باشد، می‌توانید با استفاده از متغیرهای جریان که به عنوان بخشی از این سیاست پر شده‌اند، به اطلاعات دسترسی پیدا کنید. در اینجا نمونه کدی وجود دارد که نحوه بازیابی اطلاعات name و created_by یک برنامه توسعه‌دهنده را با استفاده از جاوا اسکریپت نشان می‌دهد:
      <!-- /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 شما دارای خط‌مشی VerifyAPIKey نباشد، می‌توانید با استفاده از خط‌مشی‌های Access Entity و Extract Variables به پروفایل‌های محصولات API، برنامه‌های توسعه‌دهنده و غیره دسترسی پیدا کنید:
      1. نمایه DeveloperApp را با استفاده از سیاست 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. با استفاده از سیاست ExtractVariables، appId از DeveloperApp استخراج کنید:
        <!-- /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>

مطالعه بیشتر