ปัจจุบัน ในโลกของนักพัฒนายุคใหม่ของเรา เป็นไปไม่ได้เลยที่จะจินตนาการถึงชีวิตที่ปราศจากเทคโนโลยี เช่น React, Node JS, GraphQL และอื่นๆ พวกเขามีอันดับที่มั่นคงและเป็นผู้นำในการส่งข้อมูล 70% ของกรณีที่ฉันเจอคือโปรเจ็กต์ที่ผสานรวมกับ GraphQL หรือกำลังจะย้ายไปยังโปรเจ็กต์นั้น บริษัทต่างๆ จำนวนมากขึ้นเรื่อยๆ ต้องการใช้ไวยากรณ์การสืบค้นข้อมูล Graphql และปัจจุบันนี้ได้กลายเป็นความรู้ที่ต้องมี

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

Apollo Server มอบเครื่องมือสำหรับส่งการตอบกลับคำขอของลูกค้า Apollo Client ให้ความสามารถในการใช้ Graphql API รวมถึงแคชและการลิงก์

มันเกี่ยวกับอะไร?

เราจะสร้างเซิร์ฟเวอร์ Apollo สองตัวซึ่งจะจัดการการรวมสคีมา Graphql เป็นสถานการณ์ที่เซิร์ฟเวอร์ภายนอกบางตัวตอบสนองด้วย Graphql API และบริการอื่นๆ บางอย่างใช้สคีมา GraphQL ของตัวเองรวมถึงสคีมาภายนอกด้วย บนเลเยอร์ Node เราจะรวมผลลัพธ์จากเซิร์ฟเวอร์ภายนอกไว้ในสคีมาเดียวและส่งไปยังไคลเอนต์ แท้จริงแล้ว เราจะรวมสองสคีมาเป็นหนึ่งเดียวและส่งไปยังไคลเอนต์

มาดำดิ่งลงไปในโค้ดกัน

สำหรับการนำไปใช้งาน เราจะใช้สภาพแวดล้อม Node JS, มิดเดิลแวร์ Koa และเซิร์ฟเวอร์ Apollo พร้อมเครื่องมือ GraphQL

เราต้องใช้เซิร์ฟเวอร์สองเครื่อง ทั้งสองต้องมีเซิร์ฟเวอร์ GraphQL Apollo นี่คือแผนภาพ

ถึงเวลาสร้างต้นแบบและดำเนินการทั้งสองอย่างแล้ว เพื่อที่เราจะต้องสร้างสองโฟลเดอร์และตั้งชื่อโฟลเดอร์หนึ่งดังนี้: boilerplate-raphql-koa-server-external และโฟลเดอร์ที่สองดังนี้: boilerplate-graphql-koa-server

ก่อนที่จะเริ่ม โปรดดูโครงสร้างโฟลเดอร์ในทั้งสองโครงการ ค่อนข้างตรงไปตรงมา ความแตกต่างระหว่าง repos ทั้งสองนั้นจะอยู่ในโค้ด

├── package.json
└── src
    ├── index.js
    ├── resolvers.js
    └── schema.js

เซิร์ฟเวอร์ GraphQL ภายนอก

ตอนนี้ มาตั้งค่า boilerplate-graphql-koa-server-external กัน

จากนั้นมาสร้างเซิร์ฟเวอร์กันดีกว่า ในโฟลเดอร์ src ในindex.js เพิ่มการตั้งค่าเซิร์ฟเวอร์:

ฟังก์ชัน async serverจะดูแลแอป koa เอง และเรากำลังจะสร้างเซิร์ฟเวอร์ Apollo ที่มีสคีมาปฏิบัติการ ซึ่งเราต้องจัดเตรียมประเภทจากสคีมาและรีโซลเวอร์ จาก เอกสารอย่างเป็นทางการ เราต้องโทร apopServer.start() ล่วงหน้าก่อน apolloServer.applyMiddleware ช่วยให้ระบุปัญหาที่อาจเกิดขึ้นและดำเนินการในกรณีที่บดขยี้กระบวนการในการเริ่มต้น Apollo Server แทนเพื่อเริ่มให้บริการคำขอ

ส่วนที่สองคือการตั้งค่าสคีมาและตัวแก้ไขของ boilerplate-graphql-koa-server-externallet

ตัวแก้ไขสำหรับสคีมา

ถึงเวลาตรวจสอบการตอบสนองของเซิร์ฟเวอร์แล้ว ก่อนหน้านั้นอย่าลืมติดตั้งแพ็คเกจ: npm i จากนั้นรันคำสั่ง npm run start และใส่ URL ของเบราว์เซอร์ Chrome: http://localhost:4000/api/v1/graphql คลิกที่ปุ่ม “ค้นหาเซิร์ฟเวอร์ของคุณ” และคุณจะได้รับอินเทอร์เฟซของ apollographql ช่วยให้คุณเห็นสคีมาที่ร้องขอจากเซิร์ฟเวอร์ เปิดหน้า "Introspection Schema" คุณจะเห็นสคีมาของเราที่นั่น:

หากคุณสามารถทบทวนสคีมาได้ นั่นหมายความว่าเราดำเนินการกับ boilerplate-graphql-koa-server-external ของเราเสร็จแล้ว

เซิร์ฟเวอร์ GraphQL สำหรับการรวม Schemas

ย้ายไปที่การตั้งค่า boilerplate-graphql-koa-server กัน มีเกือบทุกอย่างเหมือนกันใน package.json จาก external แต่มีแพ็คเกจเพิ่มเติมและ PORT ชื่อและคำอธิบายที่แตกต่างกัน

มาตั้งค่าสคีมาใหม่ทันที มีข้อมูลค่อนข้างเหมือนกันแต่แตกต่างกันเล็กน้อยในสคีมา

และตัวแก้ไข:

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

สิ่งสำคัญที่สุดที่เราต้องแน่ใจว่ามีการโหลดสคีมาของเราแล้วและเซิร์ฟเวอร์ภายนอกไม่มีข้อผิดพลาดใดๆ เราต้องจับสถานการณ์นั้นให้ได้ ดังที่คุณเห็นในโค้ด เรามีเพียงอาร์เรย์ของสคีมา ตามค่าเริ่มต้น เรามี internalSchema ของเราเองเท่านั้น จากนั้นหากมีเซิร์ฟเวอร์ภายนอกพร้อมใช้งาน เรากำลังพุชไปที่อาร์เรย์ externalSchema จากนั้นใช้เครื่องมือ mergeSchemas ซึ่งช่วยในการจัดเตรียมสคีมาแบบผสานให้กับ ApolloServer

ติดตั้งแพ็คเกจทั้งหมดและรันเซิร์ฟเวอร์ซึ่งจะพร้อมใช้งานบน PORT=3000 ไปที่อินเทอร์เฟซเดียวกันของ apollographql แต่ URL จะต้องอยู่ใน PORT ที่เหมาะสม: http://localhost:3000/api/v1/graphql ตอนนี้ถ้าเราเปิดหน้า "Introspection Schema" เราจะสามารถดูสคีมาที่รวมเข้าด้วยกันได้ หนึ่งรายการจากภายนอกและอีกรายการหนึ่งจากเซิร์ฟเวอร์ที่สร้างขึ้นครั้งล่าสุด

โปรดทราบว่าหากเซิร์ฟเวอร์บางตัวของคุณได้รับฟิลด์เดียวกัน เซิร์ฟเวอร์ GraphQL จะทำให้เกิดข้อผิดพลาดขึ้น ในลักษณะนี้:

Error: Unable to merge GraphQL type “Query”: Field “getFakeDataExample” already defined with a different type. Declared as “DataExample”, but you tried to override with “DataExternalExample”

หมายความว่าเราต้องระมัดระวังอย่างมากในสคีมา GraphQL ด้วยคำจำกัดความของฟิลด์และประเภทของเรา เพื่อไม่ให้เกิดสถานการณ์ที่น่าอึดอัดใจเมื่อมีประเภทหรือฟิลด์นั้นมีอยู่แล้ว

GitHub Repos
https://github.com/antonkalik/boilerplate-graphql-koa-server
https://github.com/antonkalik/boilerplate-graphql -koa-เซิร์ฟเวอร์ภายนอก

เอกสารการโหลดสคีมา
https://www.graphql-tools.com/docs/schema-loading

บทสรุป

บริษัทหลายแห่งกำลังเปลี่ยนไปใช้สถาปัตยกรรมไมโครเซอร์วิส และพยายามแยกตรรกะของกระแสข้อมูล วิธีการที่ฉันอธิบายไว้ข้างต้นนี้เหมาะสำหรับกรณีการสื่อสารระหว่างไมโครเซอร์วิสในบริษัทต่างๆ เมื่อมีบริการระดับโลกบางประเภทที่มีสคีมาเริ่มต้นและไมโครเซอร์วิสขนาดเล็กที่มีฟิลด์เพิ่มเติมที่ลูกค้าจะใช้ในอนาคต

ขอขอบคุณสำหรับความสนใจของคุณ.