Saya membuat API untuk banyak pelanggan. Titik akhir inti seperti /users
digunakan oleh setiap pelanggan tetapi beberapa titik akhir bergantung pada kustomisasi individu. Jadi mungkin Pengguna A menginginkan titik akhir khusus /groups
dan tidak ada pelanggan lain yang memiliki fitur itu. Sama seperti sidenote , setiap pelanggan juga akan menggunakan skema basis datanya sendiri karena fitur-fitur tambahan tersebut.
Saya pribadi menggunakan NestJs (Ekspres di bawah tenda). Jadi app.module
saat ini mendaftar semua modul inti saya (dengan titik akhir mereka sendiri dll.)
import { Module } from '@nestjs/common';
import { UsersModule } from './users/users.module'; // core module
@Module({
imports: [UsersModule]
})
export class AppModule {}
Saya pikir masalah ini tidak terkait dengan NestJs jadi bagaimana Anda akan mengatasinya secara teori?
Saya pada dasarnya membutuhkan infrastruktur yang mampu menyediakan sistem dasar. Tidak ada titik akhir inti lagi karena setiap ekstensi unik dan beberapa /users
implementasi dapat dimungkinkan. Ketika mengembangkan fitur baru, aplikasi inti tidak boleh disentuh. Ekstensi harus mengintegrasikan diri mereka sendiri atau harus terintegrasi pada saat startup. Sistem inti dikirimkan tanpa titik akhir tetapi akan diperluas dari file eksternal tersebut.
Beberapa ide muncul di benak saya
Pendekatan pertama:
Setiap ekstensi mewakili repositori baru. Tetapkan jalur ke folder eksternal khusus yang menampung semua proyek ekstensi itu. Direktori khusus ini akan berisi folder groups
dengangroups.module
import { Module } from '@nestjs/common';
import { GroupsController } from './groups.controller';
@Module({
controllers: [GroupsController],
})
export class GroupsModule {}
API saya dapat mengulang melalui direktori itu dan mencoba mengimpor setiap file modul.
pro:
- Kode khusus disimpan jauh dari repositori inti
kontra:
NestJs menggunakan Typescript jadi saya harus mengkompilasi kode terlebih dahulu. Bagaimana saya mengelola build API dan build dari aplikasi khusus? (Sistem plug and play)
Ekstensi khusus sangat longgar karena hanya berisi beberapa file naskah. Karena kenyataannya mereka tidak memiliki akses ke direktori node_modules dari API, editor saya akan menunjukkan kepada saya kesalahan karena tidak dapat menyelesaikan dependensi paket eksternal.
Beberapa ekstensi mungkin mengambil data dari ekstensi lain. Mungkin layanan grup perlu mengakses layanan pengguna. Segalanya mungkin menjadi rumit di sini.
Pendekatan kedua: Simpan setiap ekstensi di dalam subfolder dari folder src API. Tetapi tambahkan subfolder ini ke file .gitignore. Sekarang Anda dapat menyimpan ekstensi di dalam API.
pro:
Editor Anda dapat menyelesaikan dependensi
Sebelum menggunakan kode Anda, Anda dapat menjalankan perintah build dan akan memiliki satu distribusi
Anda dapat mengakses layanan lain dengan mudah (
/groups
perlu mencari pengguna dengan id)
kontra:
- Ketika mengembangkan Anda harus menyalin file repositori Anda di dalam subfolder itu. Setelah mengubah sesuatu, Anda harus menyalin file-file ini kembali dan menimpa file repositori Anda dengan yang diperbarui.
Pendekatan ketiga:
Di dalam folder khusus eksternal, semua ekstensi sepenuhnya merupakan API mandiri. API utama Anda hanya akan menyediakan hal-hal otentikasi dan dapat bertindak sebagai proxy untuk mengarahkan permintaan yang masuk ke API target.
pro:
- Ekstensi baru dapat dikembangkan dan diuji dengan mudah
kontra:
Penempatan akan sulit. Anda akan memiliki API utama dan n ekstensi API yang memulai proses mereka sendiri dan mendengarkan port.
Sistem proxy bisa rumit. Jika klien meminta
/users
proxy perlu tahu ekstensi API mana yang mendengarkan titik akhir itu, panggil API itu dan meneruskan respons itu kembali ke klien.Untuk melindungi API ekstensi (otentikasi ditangani oleh API utama), proxy harus berbagi rahasia dengan API tersebut. Jadi API ekstensi hanya akan mengirimkan permintaan yang masuk jika rahasia yang cocok itu disediakan dari proxy.
Pendekatan keempat:
Layanan Microsoft mungkin membantu. Saya mengambil panduan dari sini https://docs.nestjs.com/microservices/basics
Saya dapat memiliki layanan microser untuk manajemen pengguna, manajemen grup dll dan mengkonsumsi layanan tersebut dengan membuat api / gateway / proxy kecil yang memanggil layanan microser tersebut.
pro:
Ekstensi baru dapat dikembangkan dan diuji dengan mudah
Kekhawatiran terpisah
kontra:
Penempatan akan sulit. Anda akan memiliki API utama dan n microservices memulai proses mereka sendiri dan mendengarkan port.
Tampaknya saya harus membuat api gateway baru untuk setiap pelanggan jika saya ingin membuatnya disesuaikan. Jadi, alih-alih memperluas aplikasi, saya harus membuat API comsuming khusus setiap kali. Itu tidak akan menyelesaikan masalah.
Untuk melindungi API ekstensi (otentikasi ditangani oleh API utama), proxy harus berbagi rahasia dengan API tersebut. Jadi API ekstensi hanya akan mengirimkan permintaan yang masuk jika rahasia yang cocok itu disediakan dari proxy.