Bu darsda nima bor
1–4-qismlar API Gateway’ni noldan quradi: nega kerak, yagona kirish nuqtasi, cross-cutting vazifalar va NestJS implementatsiya (auth, rate limit, aggregation). 5–6-qismlar — naqshlar (BFF) va tayyor yechimlar (Kong vs proxy vs mesh). 7-qism asosiy tuzoqlar (SPOF, biznes logika) va qoidalar.
Nega kerak — ko‘p xizmat, ko‘p mijoz
Oddiy o‘xshatish: katta binoning yagona qabulxonasi va qo‘riqchisi. Mehmon har bir xonani alohida izlamaydi — qabulxonaga keladi, hujjati tekshiriladi, kerakli bo‘limga yo‘naltiriladi.
Mikroservislaringiz bor (1-mavzu): Auth, Katalog, Buyurtma, To‘lov, Bildirishnoma. Mobil ilova va veb ular bilan bevosita gaplashadi.
1. Mijoz har bir xizmatning manzilini bilishi kerak (5 ta xizmat = 5 ta endpoint).
2. Har bir xizmat bilan alohida autentifikatsiya, SSL, rate limit bilan shug‘ullanadi.
3. Bitta ekran uchun mijoz 5 ta alohida so‘rov yuboradi (sekin, ayniqsa mobil tarmoqda).
4. Ichki tuzilma o‘zgarsa (xizmat ko‘chsa, bo‘linsa) — barcha mijozlarni yangilash kerak. Ichki arxitektura tashqariga "sizib chiqadi".
Barcha so‘rovlar uchun yagona kirish nuqtasi qo‘yish. Gateway so‘rovni to‘g‘ri xizmatga yo‘naltiradi (routing) va barcha umumiy vazifalarni markazlashtiradi: autentifikatsiya, rate limiting, SSL, logging, kesh, hatto bir nechta xizmatdan javobni yig‘ish.
Asosiy g‘oya — yagona kirish nuqtasi
Gateway — mijoz va mikroservislar o‘rtasidagi yagona oraliq qatlam. Tashqi dunyo faqat gateway bilan gaplashadi; ichki xizmatlar yashirin qoladi.
Natija: mijoz bitta manzilni biladi (api.sayt.uz), umumiy vazifalar bir joyda, ichki arxitektura erkin o‘zgaradi. Har bir xizmat esa faqat o‘z biznes logikasiga e’tibor qaratadi.
Gateway tashqi trafikni boshqaradi (mijoz ↔ tizim — "north-south"). Xizmatlararo ichki trafik (service ↔ service — "east-west") esa service mesh (5-mavzu) yoki to‘g‘ridan-to‘g‘ri aloqa bilan. Ikkalasi turli vazifa.
Gateway vazifalari (cross-cutting)
Gateway "cross-cutting" (har xizmatda takrorlanadigan) vazifalarni o‘ziga oladi. Asosiylari:
| Vazifa | Nima qiladi |
|---|---|
| Routing | So‘rovni to‘g‘ri xizmatga yo‘naltirish (URL/header bo‘yicha) |
| Auth (autentifikatsiya/avtorizatsiya) | Token tekshiruvi — bir marta, markazda |
| Rate limiting / throttling | So‘rov sonini cheklash (himoya, adolatli foydalanish) |
| SSL/TLS termination | HTTPS’ni gateway’da ochish (ichki xizmatlar oddiy HTTP) |
| Aggregation | Bir nechta xizmat javobini bitta javobga birlashtirish |
| Caching | Tez-tez so‘raladigan javoblarni keshlash (4-mavzu) |
| Transformation | So‘rov/javob formatini o‘zgartirish (protokol, versiya) |
| Logging / monitoring | Markazlashgan log, metrika, tracing (12-mavzu) |
Bu vazifalar har bir xizmatda takrorlansa — kod dublikati, nomuvofiqlik va xato manbai. Gateway’da bir marta yozilsa: token tekshiruvi faqat gateway’da bo‘ladi, ichki xizmatlar uni ishonchli deb qabul qiladi (zona ichidagi ishonch). Yangi siyosat (masalan, yangi rate limit) — bitta joyda o‘zgaradi.
NestJS implementatsiya
auth · throttler · aggregation1-mavzudagi gateway’ni kengaytiramiz: endi unga auth, rate limiting va aggregation qo‘shamiz.
1 · Auth — markazda bir marta
// AUTH gateway'da bir marta tekshiriladi -> ichki xizmatlar qayta tekshirmaydi
@Injectable()
export class JwtAuthGuard implements CanActivate {
constructor(private jwt: JwtService) {}
canActivate(ctx: ExecutionContext): boolean {
const req = ctx.switchToHttp().getRequest();
const token = req.headers.authorization?.split(' ')[1];
if (!token) throw new UnauthorizedException();
req.user = this.jwt.verify(token); // payload ichki xizmatlarga uzatiladi
return true;
}
}
2 · Rate limiting — markazlashgan himoya
// RATE LIMITING markazlashgan (@nestjs/throttler)
@Module({
imports: [
ThrottlerModule.forRoot([{ ttl: 60_000, limit: 100 }]), // 60s da 100 so'rov
],
providers: [{ provide: APP_GUARD, useClass: ThrottlerGuard }],
})
export class GatewayModule {}
3 · Routing va aggregation
// ROUTING + AGGREGATION — gateway controller
@Controller()
@UseGuards(JwtAuthGuard) // butun gateway auth ostida
export class GatewayController {
constructor(
@Inject('USERS') private users: ClientProxy,
@Inject('ORDERS') private orders: ClientProxy,
) {}
// ROUTING: shunchaki to'g'ri xizmatga uzatish
@Get('orders/:id')
getOrder(@Param('id') id: string) {
return this.orders.send({ cmd: 'get_order' }, id);
}
// AGGREGATION: bitta so'rov -> bir nechta xizmat -> BITTA birlashgan javob
@Get('dashboard')
async dashboard(@CurrentUser() userId: string) {
const [profile, orders] = await Promise.all([
firstValueFrom(this.users.send({ cmd: 'get_user' }, userId)),
firstValueFrom(this.orders.send({ cmd: 'get_user_orders' }, userId)),
]);
return { profile, orders }; // mijoz 1 ta so'rov yubordi, 1 ta javob oldi
}
}
"Dashboard" ekrani uchun mobil ilova bitta so‘rov yuboradi; gateway orqada 2-3 xizmatga parallel borib (Promise.all), javoblarni birlashtiradi. Mobil tarmoqda bu — 3 ta sekin so‘rov o‘rniga 1 ta tez so‘rov. Bu — keyingi bo‘limdagi BFF naqshining yuragi.
Naqshlar va BFF
BFF · aggregation · offloadingBitta gateway barcha mijozlarga xizmat qilsa, u "hammaga yoqishga urinib" shishib ketadi. Mobil va veb ehtiyojlari boshqacha — BFF aynan shuni hal qiladi.
Gateway naqshlari
- Gateway Routing — so‘rovlarni xizmatlarga yo‘naltirish (eng oddiy vazifa).
- Gateway Aggregation — bir nechta xizmat javobini birlashtirish (4-bo‘limdagidek).
- Gateway Offloading — umumiy vazifalarni (auth, SSL, log) xizmatlardan gateway’ga ko‘chirish.
BFF — Backend for Frontend
Bitta universal gateway o‘rniga — har mijoz turi uchun alohida gateway: Mobile BFF, Web BFF. Har biri o‘sha mijozning ehtiyojiga moslangan javob beradi (mobil — kichik, ixcham; veb — boy). Ortida esa bir xil mikroservislar.
Mijoz turlari ehtiyoji jiddiy farq qilganda (mobil cheklangan tarmoq/ekran, veb boy, 3-tomon API boshqacha). Aks holda bitta gateway yetadi — BFF ham qo‘shimcha kod va xizmatlar demak.
Tayyor yechimlar va taqqoslash
Kong · proxy vs meshGateway’ni noldan yozish shart emas — yetuk yechimlar bor. Va uni reverse proxy hamda service mesh’dan farqlash muhim.
Gateway vs Reverse Proxy vs Service Mesh
| Reverse Proxy (Nginx) | API Gateway | Service Mesh | |
|---|---|---|---|
| Daraja | L7, oddiy | L7, ilova-xabardor | Sidecar (ichki) |
| Trafik | North-south | North-south | East-west (ichki) |
| Asosiy | Yo‘naltirish, SSL | Auth, limit, aggregation, transform | mTLS, retry, kuzatuv |
| Misol | Nginx, HAProxy | Kong, AWS API GW, Apigee | Istio, Linkerd |
Kong (Nginx/Lua asosida, plugin’lar bilan), AWS API Gateway (boshqariladigan, serverless’ga mos), Apigee (korporativ), Tyk, Spring Cloud Gateway. Ular auth, rate limit, kesh, log’ni plugin/konfiguratsiya orqali beradi — kod yozmaysan.
Oddiy ehtiyoj (routing + auth + aggregation) va NestJS’da qulay bo‘lsa — kichik gateway’ni o‘zing yozishing mumkin (4-bo‘limdagidek). Murakkab siyosatlar, plugin’lar, korporativ talab bo‘lsa — tayyor gateway (Kong/cloud) tejaydi. Lekin har ikki holda ham — biznes logikasini gateway’ga solma (keyingi bo‘lim).
Tuzoqlar va amaliy qoidalar
Gateway kuchli, lekin ikki katta tuzog‘i bor — ularni bilmaslik tizimni yomonlashtiradi.
Butun trafik gateway’dan o‘tadi. U o‘lsa — hamma narsa to‘xtaydi; sekinlashsa — hamma sekinlashadi. Yechim: gateway’ni stateless qil va bir nechta nusxasini load balancer ostida ishlat (5-mavzu). Hech qachon bitta gateway nusxasiga tayanma.
Gateway’ga asta-sekin biznes qoidalari, ma’lumot transformatsiyasi, hatto DB so‘rovlari qo‘shila boshlaydi. Natijada gateway yashirin monolitga aylanadi — hamma xizmat unga bog‘lanadi, uni o‘zgartirish qo‘rqinchli bo‘ladi. Qoida: gateway faqat cross-cutting vazifalarni bajarsin (routing, auth, limit, aggregation). Biznes logika — xizmatlarda.
Kerak: bir nechta mikroservis + bir nechta mijoz turi bo‘lganda. Kerak emas: bitta monolit — oddiy reverse proxy (Nginx) yetadi, to‘liq gateway ortiqcha.
1. Gateway’ni stateless qil + LB ostiga (SPOF bo‘lmasin).
2. Faqat cross-cutting vazifa — biznes logika yo‘q.
3. Ichki xizmat chaqiruvlariga timeout + retry + circuit breaker (14-mavzu) — bitta sekin xizmat gateway’ni bloklamasin.
4. Qo‘shimcha "hop" kechikish qo‘shadi — aggregation va keshlash bilan buni qopla.
Eslab qolish kerak bo‘lgan 5 jumla
- API Gateway = barcha so‘rovlar uchun yagona aqlli kirish nuqtasi. U routing + cross-cutting vazifalarni (auth, rate limit, SSL, aggregation, log) markazlashtiradi.
- Foydasi: mijoz ichki tuzilmani bilmaydi, umumiy vazifa bir joyda, ichki arxitektura erkin o‘zgaradi. Gateway = north-south; mesh = east-west.
- Aggregation mobil uchun ayniqsa qimmatli (3 so‘rov → 1). BFF — har mijoz turiga moslangan gateway.
- Tayyor yechimlar: Kong, AWS API Gateway, Apigee. Oddiy holatda NestJS’da o‘zing yozasan. Reverse proxy va mesh’dan farqla.
- Ikki tuzoq: gateway SPOF (→ stateless + LB) va biznes logika gateway’da (→ faqat cross-cutting, logika xizmatlarda).
Bu mavzuning Deep/Senior qatlami (gateway HA va masshtab, auth chuqur — OAuth2/OIDC/mTLS, rate limit algoritmlari, plugin arxitektura, gRPC/WebSocket gateway, canary/versiyalash, Kong/Envoy gateway sozlash) kerak bo‘lsa — ayting.
Yoki keyingi mavzu: “9-mavzu: CQRS” — o‘qish va yozishni ajratish.