Antipattern: เรียกใช้การเรียก API การจัดการจากพร็อกซี API

คุณกําลังดูเอกสารประกอบของ Apigee Edge
ไปที่ เอกสารประกอบเกี่ยวกับ Apigee X.
ข้อมูล

Edge มียูทิลิตีประสิทธิภาพสูงที่เรียกว่า "API การจัดการ" ซึ่งให้บริการต่างๆ เช่น

  • การทำให้ใช้งานได้หรือยกเลิกการทำให้พร็อกซี API ใช้งานได้
  • การกำหนดค่าโฮสต์เสมือน คีย์สโตร์ และ Truststores ฯลฯ
  • การสร้าง การลบ และ/หรืออัปเดตเอนทิตี เช่น KeyValueMaps, ผลิตภัณฑ์ API, นักพัฒนาซอฟต์แวร์ แอป นักพัฒนาซอฟต์แวร์ คีย์ผู้บริโภค ฯลฯ
  • การดึงข้อมูลเกี่ยวกับเอนทิตีเหล่านี้

บริการเหล่านี้เข้าถึงได้ผ่านคอมโพเนนต์ที่เรียกว่า Management Server ในแพลตฟอร์ม Apigee Edge คุณสามารถเรียกใช้บริการเหล่านี้ได้ง่ายๆ ด้วยความช่วยเหลือของ API การจัดการอย่างง่าย

บางครั้งเราอาจต้องใช้บริการเหล่านี้อย่างน้อย 1 รายการจากพร็อกซี API ระหว่างรันไทม์ นี่คือ เพราะเอนทิตีต่างๆ เช่น KeyValueMaps, โทเค็นการเข้าถึง OAuth, ผลิตภัณฑ์ API, แอปของนักพัฒนาซอฟต์แวร์ นักพัฒนาซอฟต์แวร์ คีย์ผู้บริโภค ฯลฯ มีข้อมูลที่เป็นประโยชน์ในรูปแบบคู่คีย์-ค่า หรือเป็นส่วนหนึ่งของโปรไฟล์

ตัวอย่างเช่น คุณสามารถจัดเก็บข้อมูลต่อไปนี้ใน KeyValueMap เพื่อทำให้มีความปลอดภัยมากขึ้น เข้าถึงได้ขณะรันไทม์:

  • URL เป้าหมายของแบ็กเอนด์
  • พร็อพเพอร์ตี้ของสภาพแวดล้อม
  • ข้อมูลเข้าสู่ระบบด้านความปลอดภัยของระบบแบ็กเอนด์หรือระบบของบุคคลที่สาม

ในทำนองเดียวกัน คุณอาจต้องการรายการผลิตภัณฑ์ API หรืออีเมลของนักพัฒนาแอปในระหว่างรันไทม์ ข้อมูลนี้จะมีให้ใช้งานโดยเป็นส่วนหนึ่งของโปรไฟล์แอปนักพัฒนาแอป

ระบบสามารถใช้ข้อมูลทั้งหมดนี้ได้อย่างมีประสิทธิภาพขณะรันไทม์เพื่อเปิดใช้ลักษณะการทำงานแบบไดนามิกในนโยบาย หรือโค้ดที่กำหนดเองภายใน Apigee Edge

ลาย Antipattern

แนะนำให้ใช้ API การจัดการและมีประโยชน์สำหรับงานธุรการ และไม่ควรใช้สำหรับ ดำเนินการตรรกะรันไทม์ในขั้นตอนพร็อกซี API เพราะสาเหตุต่อไปนี้

  • การใช้ API การจัดการเพื่อเข้าถึงข้อมูลเกี่ยวกับเอนทิตี เช่น KeyValueMaps, OAuth โทเค็นการเข้าถึงหรือเพื่อวัตถุประสงค์อื่นจากพร็อกซี API จะนำไปสู่ทรัพยากร Dependency ที่เกี่ยวกับการจัดการ เซิร์ฟเวอร์
  • เซิร์ฟเวอร์การจัดการไม่ได้เป็นส่วนหนึ่งของคอมโพเนนต์รันไทม์ Edge ดังนั้นจึงอาจไม่ใช่ ความพร้อมใช้งานสูง
  • นอกจากนี้ เซิร์ฟเวอร์การจัดการอาจไม่ได้รับการจัดสรรภายในเครือข่ายหรือศูนย์ข้อมูลเดียวกัน และอาจทำให้เกิดเวลาในการตอบสนองของเครือข่ายเมื่อรันไทม์
  • รายการในเซิร์ฟเวอร์การจัดการจะถูกแคชไว้เป็นเวลานาน ดังนั้นเราอาจไม่ สามารถดูข้อมูลล่าสุดได้ทันทีในพร็อกซี API หากเราเขียนและอ่านใน ระยะเวลาสั้นๆ
  • เพิ่มจำนวนการรับส่งเครือข่ายขณะรันไทม์

ในตัวอย่างโค้ดด้านล่าง การเรียก API การจัดการจะดำเนินการผ่านโค้ด JavaScript ที่กำหนดเองเพื่อ ดึงข้อมูลจาก KeyValueMap:

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

หากเซิร์ฟเวอร์การจัดการไม่พร้อมทำงาน โค้ด JavaScript จะเรียกใช้ API การจัดการ การโทรไม่สำเร็จ ซึ่งจะทำให้คำขอ API ล้มเหลวในภายหลัง

ผลกระทบ

  • เพิ่มทรัพยากร Dependency เพิ่มเติมในเซิร์ฟเวอร์การจัดการระหว่างรันไทม์ ปัญหาใดๆ ในเซิร์ฟเวอร์การจัดการจะส่งผลต่อการเรียก API
  • ต้องจัดเก็บข้อมูลเข้าสู่ระบบของผู้ใช้สำหรับ API การจัดการไว้ในเครื่องหรือใน Store ที่ปลอดภัยบางแห่ง เช่น KVM ที่เข้ารหัส
  • ผลกระทบด้านประสิทธิภาพที่เกิดจากการเรียกใช้บริการการจัดการผ่านเครือข่าย
  • อาจไม่เห็นค่าที่อัปเดตทันทีเนื่องจากแคชหมดอายุในการจัดการนานขึ้น เซิร์ฟเวอร์

แนวทางปฏิบัติแนะนำ

มีวิธีดึงข้อมูลจากเอนทิตีต่างๆ เช่น KeyValueMaps, API, ผลิตภัณฑ์, DeveloperApps, นักพัฒนาแอป, คีย์ผู้บริโภค ฯลฯ ที่มีประสิทธิภาพมากขึ้นเมื่อรันไทม์ ลองดูตัวอย่างต่อไปนี้

  • ใช้นโยบาย 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 policy คุณก็จะเข้าถึงข้อมูลนั้นได้ โดยใช้ตัวแปรโฟลว์ที่ป้อนข้อมูลเป็นส่วนหนึ่งของนโยบายนี้ นี่คือโค้ดตัวอย่างที่แสดง วิธีดึงข้อมูลชื่อและข้อมูล create_by ของแอปนักพัฒนาซอฟต์แวร์โดยใช้ JavaScript:
      <!-- /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 คุณจะเข้าถึง โปรไฟล์ของผลิตภัณฑ์ 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 โดยใช้นโยบาย ExtractVariable ดังนี้
        <!-- /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>
        

อ่านเพิ่มเติม