الگوی بد: فراخوانی کردن تماس‌های «میانای برنامه‌سازی کاربردی مدیریت» از «پراکسی میانای برنامه‌سازی کاربردی»

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

‫Edge ابزار قدرتمندی به‌نام «میاناهای برنامه‌سازی کاربردی مدیریت» دارد که سرویس‌هایی مثل موارد زیر را ارائه می‌دهد:

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

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

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

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

  • نشانی‌های وب هدف زیرینه
  • دارایی‌های محیط
  • اعتبارنامه‌های امنیتی سیستم‌های طرف سوم یا زیرینه

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

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

الگوی بد

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

  • استفاده از «میاناهای برنامه‌سازی کاربردی مدیریت» برای دسترسی به اطلاعات مربوط به نهادهایی مثل KeyValueMaps،‏ OAuth Access Tokens، یا برای هر هدف دیگری از «پراکسی‌های میانای برنامه‌سازی کاربردی» منجر به وابستگی به «سرورهای مدیریت» می‌شود.
  • «سرورهای مدیریت» بخشی از مؤلفه زمان اجرای Edge نیستند و بنابراین ممکن است بسیار دردسترس نباشند.
  • «سرورهای مدیریت» همچنین ممکن است در همان شبکه یا مرکز داده آماده‌سازی نشده باشند و بنابراین ممکن است در زمان اجرا تأخیرهای شبکه ایجاد کنند.
  • ورودی‌های سرورهای مدیریت برای مدت طولانی‌تری در حافظه نهان ذخیره می‌شوند، بنابراین اگر در یک دوره زمانی کوتاه عملیات نوشتن و خواندن انجام دهیم، ممکن است نتوانیم بلافاصله جدیدترین داده‌ها را در «پراکسی‌های API» ببینیم.
  • تعداد پرش‌های شبکه را در زمان اجرا افزایش می‌دهد.

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

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

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

تأثیر

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

روال مطلوب

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

  • از خط‌مشی KeyValueMapOperations برای دسترسی به اطلاعات KeyValueMaps استفاده کنید. در اینجا نمونه کدی نشان داده شده است که چگونه اطلاعات را از 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 داشته باشد، می‌توانید بااستفاده از متغیرهای جریانی که به‌عنوان بخشی از این خط‌مشی تکمیل شده‌اند به اطلاعات دسترسی پیدا کنید. در اینجا کد نمونه‌ای نشان داده شده است که نحوه بازیابی نام و اطلاعات 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. appId را با خط‌مشی ExtractVariables از 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>

مطالعه بیشتر