ฉันกำลังสร้าง API สำหรับลูกค้าหลายคน จุดสิ้นสุดหลักเช่นเดียวกับ/users
ที่ใช้โดยลูกค้าทุกคน แต่จุดปลายบางอย่างขึ้นอยู่กับการปรับแต่งของแต่ละบุคคล ดังนั้นอาจเป็นไปได้ว่าผู้ใช้ Aต้องการจุดปลายพิเศษ/groups
และไม่มีลูกค้ารายอื่นที่จะมีคุณสมบัติดังกล่าว เช่นเดียวกับ sidenoteลูกค้าแต่ละรายจะใช้สคีมาฐานข้อมูลของเขาเองเนื่องจากคุณสมบัติพิเศษเหล่านั้น
ฉันใช้ NestJs (ด่วนภายใต้ประทุน) เป็นการส่วนตัว ดังนั้นapp.module
ปัจจุบันลงทะเบียนโมดูลหลักทั้งหมดของฉัน (พร้อมจุดสิ้นสุดของตนเองเป็นต้น)
import { Module } from '@nestjs/common';
import { UsersModule } from './users/users.module'; // core module
@Module({
imports: [UsersModule]
})
export class AppModule {}
ฉันคิดว่าปัญหานี้ไม่เกี่ยวข้องกับ NestJs ดังนั้นคุณจะจัดการกับเรื่องนี้อย่างไรในทางทฤษฎี?
โดยทั่วไปฉันต้องการโครงสร้างพื้นฐานที่สามารถให้ระบบพื้นฐานได้ ไม่มีจุดสิ้นสุดหลักอีกต่อไปเพราะส่วนขยายแต่ละรายการไม่ซ้ำกันและ/users
อาจมีการใช้งานหลายอย่าง เมื่อพัฒนาฟีเจอร์ใหม่แอปพลิเคชันหลักไม่ควรสัมผัส ส่วนขยายควรรวมตัวเองหรือควรรวมเข้าด้วยกันเมื่อเริ่มต้น ระบบหลักจัดส่งโดยไม่มีจุดสิ้นสุด แต่จะถูกขยายจากไฟล์ภายนอกเหล่านั้น
ความคิดบางอย่างมาถึงใจของฉัน
วิธีแรก:
แต่ละนามสกุลแสดงถึงที่เก็บใหม่ กำหนดพา ธ ไปยังโฟลเดอร์ภายนอกที่กำหนดเองซึ่งถือโครงการส่วนขยายทั้งหมดนั้น ไดเรกทอรีที่กำหนดเองนี้จะมีโฟลเดอร์ที่groups
มีgroups.module
import { Module } from '@nestjs/common';
import { GroupsController } from './groups.controller';
@Module({
controllers: [GroupsController],
})
export class GroupsModule {}
API ของฉันสามารถวนซ้ำผ่านไดเรกทอรีนั้นและพยายามนำเข้าแต่ละไฟล์โมดูล
ข้อดี:
- รหัสที่กำหนดเองจะถูกเก็บห่างจากพื้นที่เก็บข้อมูลหลัก
ข้อเสีย:
NestJs ใช้ typescript ดังนั้นฉันต้องรวบรวมรหัสก่อน ฉันจะจัดการการสร้าง API และการสร้างจากแอปที่กำหนดเองได้อย่างไร (ระบบปลั๊กแอนด์เพลย์)
ส่วนขยายที่กำหนดเองนั้นหลวมเพราะมีไฟล์ typescript บางตัวเท่านั้น เนื่องจากพวกเขาไม่สามารถเข้าถึงไดเร็กทอรี node_modules ของ API ตัวแก้ไขของฉันจะแสดงข้อผิดพลาดให้ฉันเพราะมันไม่สามารถแก้ไขการพึ่งพาแพ็คเกจภายนอกได้
ส่วนขยายบางอย่างอาจดึงข้อมูลจากส่วนขยายอื่น บางทีบริการกลุ่มจำเป็นต้องเข้าถึงบริการผู้ใช้ สิ่งต่าง ๆ อาจจะมีเล่ห์เหลี่ยมที่นี่
วิธีที่สอง: เก็บส่วนขยายแต่ละรายการไว้ในโฟลเดอร์ย่อยของโฟลเดอร์ src ของ API แต่เพิ่มโฟลเดอร์ย่อยนี้ไปยังไฟล์. gitignore ตอนนี้คุณสามารถเก็บส่วนขยายไว้ใน API
ข้อดี:
โปรแกรมแก้ไขของคุณสามารถแก้ไขการอ้างอิง
ก่อนที่จะปรับใช้รหัสของคุณคุณสามารถเรียกใช้คำสั่ง build และจะมีการกระจายเดียว
คุณสามารถเข้าถึงบริการอื่น ๆ ได้อย่างง่ายดาย (
/groups
ต้องการค้นหาผู้ใช้ด้วย ID)
ข้อเสีย:
- เมื่อพัฒนาคุณต้องคัดลอกไฟล์ที่เก็บข้อมูลของคุณภายในโฟลเดอร์ย่อยนั้น หลังจากเปลี่ยนแปลงบางสิ่งคุณต้องคัดลอกไฟล์เหล่านี้ไปมาและแทนที่ไฟล์เก็บข้อมูลของคุณด้วยไฟล์ที่อัปเดต
แนวทางที่สาม:
ภายในโฟลเดอร์ที่กำหนดเองภายนอกส่วนขยายทั้งหมดเป็น API แบบสแตนด์อโลนที่สมบูรณ์ API หลักของคุณจะให้ข้อมูลการตรวจสอบสิทธิ์และอาจทำหน้าที่เป็นพร็อกซีเพื่อเปลี่ยนเส้นทางคำขอขาเข้าไปยัง API เป้าหมาย
ข้อดี:
- ส่วนขยายใหม่สามารถพัฒนาและทดสอบได้อย่างง่ายดาย
ข้อเสีย:
การใช้งานจะยุ่งยาก คุณจะมี API หลักและ API ส่วนขยายnเริ่มกระบวนการของตนเองและรับฟังพอร์ต
ระบบพร็อกซีอาจยุ่งยาก หากไคลเอนต์ร้องขอ
/users
พร็อกซีจำเป็นต้องทราบว่าส่วนขยาย API ใดรับฟังจุดปลายทางนั้นให้เรียกใช้ API นั้นและส่งต่อการตอบกลับนั้นกลับไปยังไคลเอนต์เพื่อป้องกัน API ส่วนขยาย (การตรวจสอบความถูกต้องถูกจัดการโดย API หลัก) พร็อกซีต้องเปิดเผยข้อมูลลับกับ API เหล่านั้น ดังนั้นส่วนขยาย API จะส่งคำขอที่เข้ามาเฉพาะหากมีการให้ข้อมูลลับที่ตรงกันจากพรอกซี
วิธีที่สี่:
Microservices อาจช่วยได้ ฉันได้รับคำแนะนำจากที่นี่https://docs.nestjs.com/microservices/basics
ฉันสามารถมี microservice สำหรับการจัดการผู้ใช้การจัดการกลุ่มและอื่น ๆ และใช้บริการเหล่านั้นโดยสร้าง api / gateway / proxy ขนาดเล็กที่เรียก microservices เหล่านั้น
ข้อดี:
ส่วนขยายใหม่สามารถพัฒนาและทดสอบได้อย่างง่ายดาย
แยกความกังวล
ข้อเสีย:
การใช้งานจะยุ่งยาก คุณจะมี API หลักและn microservices เริ่มกระบวนการของตัวเองและฟังพอร์ต
ดูเหมือนว่าฉันจะต้องสร้างเกตเวย์ api ใหม่สำหรับลูกค้าแต่ละรายถ้าฉันต้องการที่จะได้รับการปรับแต่ง ดังนั้นแทนที่จะขยายแอปพลิเคชันฉันจะต้องสร้าง API comsuming ที่กำหนดเองในแต่ละครั้ง ที่จะไม่แก้ปัญหา
เพื่อป้องกัน API ส่วนขยาย (การตรวจสอบความถูกต้องถูกจัดการโดย API หลัก) พร็อกซีต้องเปิดเผยข้อมูลลับกับ API เหล่านั้น ดังนั้นส่วนขยาย API จะส่งคำขอที่เข้ามาเฉพาะหากมีการให้ข้อมูลลับที่ตรงกันจากพรอกซี