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

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

Edge یک ابزار قدرتمند به نام "مدیریت APIs" دارد که خدماتی مانند:

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

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

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

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

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

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

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

ضد الگو

APIهای مدیریتی برای کارهای اداری ترجیح داده شده و مفید هستند و نباید برای اجرای هیچ منطق زمان اجرا در جریان پروکسی های API استفاده شوند. این به این دلیل است که:

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

در نمونه کد زیر، فراخوانی 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، 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 است، می‌توانید با استفاده از متغیرهای جریان جمع‌شده به عنوان بخشی از این خط‌مشی به اطلاعات دسترسی داشته باشید. در اینجا کد نمونه ای وجود دارد که نحوه بازیابی نام و اطلاعات create_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 از DeveloperApp با خط مشی 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>
        

در ادامه مطلب