Birden fazla müşteri için bir API oluşturuyorum. Gibi temel uç noktalar /users
her müşteri tarafından kullanılır, ancak bazı uç noktalar bireysel özelleştirmeye dayanır. Bu nedenle, A Kullanıcısı özel bir uç nokta istiyor olabilir /groups
ve başka hiçbir müşterinin bu özelliği olmayacaktır. Tıpkı bir sidenote gibi , her müşteri bu ekstra özellikler nedeniyle kendi veritabanı şemasını da kullanacaktı.
Şahsen NestJs'i kullanıyorum (kaputun altında Express). Yani app.module
şu anda (vb kendi uç noktaları ile) tüm çekirdek modüllerini kaydeder
import { Module } from '@nestjs/common';
import { UsersModule } from './users/users.module'; // core module
@Module({
imports: [UsersModule]
})
export class AppModule {}
Bu sorunun NestJs ile ilgili olmadığını düşünüyorum, bu yüzden teoride bunu nasıl ele alırsınız?
Temel olarak temel bir sistem sağlayabilecek bir altyapıya ihtiyacım var. Artık hiçbir çekirdek uç nokta yok çünkü her uzantı benzersizdir ve birden fazla /users
uygulama mümkün olabilir. Yeni bir özellik geliştirirken çekirdek uygulamaya dokunulmamalıdır. Uzantılar kendilerini entegre etmeli veya başlangıçta entegre olmalıdır. Çekirdek sistem uç nokta olmadan gönderilir ancak bu harici dosyalardan genişletilir.
Bazı fikirler aklıma geliyor
İlk yaklaşım:
Her uzantı yeni bir havuzu temsil eder. Tüm bu uzantı projelerini tutan özel bir harici klasörün yolunu tanımlayın. Bu özel dizin bir klasör içerecektir groups
a ilegroups.module
import { Module } from '@nestjs/common';
import { GroupsController } from './groups.controller';
@Module({
controllers: [GroupsController],
})
export class GroupsModule {}
API'm bu dizine göz atabilir ve her modül dosyasını içe aktarmayı deneyebilir.
Artıları:
- Özel kod, çekirdek depodan uzak tutulur
Eksileri:
Önce kodu derlemek zorunda NestJs Typescript kullanır. API uygulamalarını ve yapılarını özel uygulamalardan nasıl yönetirim? (Tak ve çalıştır sistemi)
Özel uzantılar çok gevşek çünkü sadece bazı daktilo dosyaları içeriyorlar. API'nın node_modules dizinine erişemedikleri için, editörüm dış paket bağımlılıklarını çözemediği için bana hatalar gösterecek.
Bazı uzantılar başka bir uzantıdan veri alabilir. Belki grup hizmetinin kullanıcı hizmetine erişmesi gerekir. Burada işler zorlaşabilir.
İkinci yaklaşım: Her uzantıyı API'nın src klasörünün bir alt klasöründe tutun. Ancak bu alt klasörü .gitignore dosyasına ekleyin. Artık uzantılarınızı API içinde tutabilirsiniz.
Artıları:
Editörünüz bağımlılıkları çözebilir
Kodunuzu dağıtmadan önce build komutunu çalıştırabilirsiniz ve tek bir dağıtımınız olur
Diğer hizmetlere kolayca erişebilirsiniz (
/groups
bir kullanıcıyı kimliğe göre bulmanız gerekir)
Eksileri:
- Geliştirirken, depo dosyalarınızı bu alt klasörün içine kopyalamanız gerekir. Bir şeyi değiştirdikten sonra bu dosyaları geri kopyalamanız ve depo dosyalarınızı güncellenmiş olanlarla geçersiz kılmanız gerekir.
Üçüncü yaklaşım:
Harici bir özel klasörün içinde, tüm uzantılar tam teşekküllü bağımsız API'lardır. Ana API'niz yalnızca kimlik doğrulama öğelerini sağlar ve gelen istekleri hedef API'ye yönlendirmek için bir proxy görevi görebilir.
Artıları:
- Yeni uzantılar kolayca geliştirilip test edilebilir
Eksileri:
Dağıtım zor olacak. Kendi işlemlerini başlatan ve bir bağlantı noktasını dinleyen bir ana API ve n uzantı API'sına sahip olacaksınız .
Proxy sistemi zor olabilir. İstemci
/users
, proxy'nin bu uç nokta için hangi uzantı API'sını dinlediğini bilmesini isterse , bu API'yı çağırır ve bu yanıtı istemciye iletir.Uzantı API'larını korumak için (kimlik doğrulama ana API tarafından gerçekleştirilir) proxy'nin bu API'larla bir sır paylaşması gerekir. Dolayısıyla, uzantı API'si yalnızca gelen istekleri proxy'den sağladığında gelen istekleri iletir.
Dördüncü yaklaşım:
Mikro hizmetler yardımcı olabilir. Buradan bir rehber aldım https://docs.nestjs.com/microservices/basics
Kullanıcı yönetimi, grup yönetimi vb. İçin bir mikro hizmet alabilir ve bu mikro hizmetleri çağıran küçük bir api / ağ geçidi / proxy oluşturarak bu hizmetleri tüketebilirim.
Artıları:
Yeni uzantılar kolayca geliştirilip test edilebilir
Ayrılmış endişeler
Eksileri:
Dağıtım zor olacak. Kendi işlemlerini başlatan ve bir bağlantı noktasını dinleyen bir ana API ve n mikro hizmetiniz olacaktır .
Özelleştirilebilir olmasını istiyorsanız, her müşteri için yeni bir ağ geçidi API'si oluşturmam gerektiği anlaşılıyor. Bu nedenle, bir uygulamayı genişletmek yerine, her seferinde özelleştirilmiş bir ortak API oluşturmam gerekiyordu. Bu sorunu çözmezdi.
Uzantı API'larını korumak için (kimlik doğrulama ana API tarafından gerçekleştirilir) proxy'nin bu API'larla bir sır paylaşması gerekir. Dolayısıyla, uzantı API'si yalnızca gelen istekleri proxy'den sağladığında gelen istekleri iletir.