ปัจจุบัน ในโลกของนักพัฒนายุคใหม่ของเรา เป็นไปไม่ได้เลยที่จะจินตนาการถึงชีวิตที่ปราศจากเทคโนโลยี เช่น 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-external
let
ตัวแก้ไขสำหรับสคีมา
ถึงเวลาตรวจสอบการตอบสนองของเซิร์ฟเวอร์แล้ว ก่อนหน้านั้นอย่าลืมติดตั้งแพ็คเกจ: 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
บทสรุป
บริษัทหลายแห่งกำลังเปลี่ยนไปใช้สถาปัตยกรรมไมโครเซอร์วิส และพยายามแยกตรรกะของกระแสข้อมูล วิธีการที่ฉันอธิบายไว้ข้างต้นนี้เหมาะสำหรับกรณีการสื่อสารระหว่างไมโครเซอร์วิสในบริษัทต่างๆ เมื่อมีบริการระดับโลกบางประเภทที่มีสคีมาเริ่มต้นและไมโครเซอร์วิสขนาดเล็กที่มีฟิลด์เพิ่มเติมที่ลูกค้าจะใช้ในอนาคต
ขอขอบคุณสำหรับความสนใจของคุณ.