GoDasturchi
Monolith vs Microservices

Monolith vs Microservices

Monolit va mikroservislar

Bitta katta universal do'konni tasavvur qiling: oziq-ovqat, kiyim, elektronika — hammasi bitta binoda. Endi buning o'rniga, har biri o'z sohasiga ixtisoslashgan kichik do'konlar tarmog'ini tasavvur qiling: alohida oziq-ovqat do'koni, alohida kiyim do'koni. Ikkalasining ham afzalligi bor: universal do'konda hamma narsa bir joyda, boshqarish oson; kichik do'konlarda esa har biri o'z ishiga chuqur ixtisoslashgan, va bittasi yopilsa boshqalari ishlashda davom etadi.

Monolit (monolith) — butun ilova BITTA dastur, bitta kod bazasi, bitta joylashtirish birligi sifatida yoziladi ("Go Basics" kursidan boshlab shu paytgacha yozgan barcha loyihalaringiz — monolit edi). Mikroservis (microservice) arxitekturasida esa ilova bir nechta KICHIK, mustaqil xizmatlarga bo'linadi, har biri o'z vazifasiga ega va boshqalardan mustaqil joylashtiriladi.

example.go
package main

import "fmt"

// Monolit: bitta dastur ichida hamma funksiya birga
type MonolithApp struct{}

func (m *MonolithApp) HandleOrder() string   { return "buyurtma qabul qilindi (monolit ichida)" }
func (m *MonolithApp) HandlePayment() string { return "to'lov amalga oshirildi (monolit ichida)" }

// Mikroservis: har bir vazifa ALOHIDA, mustaqil xizmat
type OrderService struct{}

func (s *OrderService) Handle() string { return "buyurtma qabul qilindi (alohida servis)" }

type PaymentService struct{}

func (s *PaymentService) Handle() string { return "to'lov amalga oshirildi (alohida servis)" }

func main() {
	m := &MonolithApp{}
	fmt.Println(m.HandleOrder())

	order := &OrderService{}
	payment := &PaymentService{}
	fmt.Println(order.Handle())
	fmt.Println(payment.Handle())
}

Monolitning afzalligi: yozish va sinash SODDA (bitta dastur, bitta go run), funksiyalar orasida chaqiruv oddiy funksiya chaqiruvi (tez, ishonchli). Kamchiligi: dastur kattalashgani sari, uni tushunish va o'zgartirish qiyinlashadi, va kichik o'zgarish uchun ham BUTUN dasturni qayta joylashtirish kerak bo'ladi.

Mikroservisning afzalligi: har bir xizmat mustaqil rivojlantiriladi va joylashtiriladi (masalan OrderServiceni yangilash uchun PaymentServicega tegish shart emas), va har bir xizmat o'ziga kerakli miqdorda resurs (server) bilan mustaqil kengaytiriladi. Kamchiligi: xizmatlar orasidagi aloqa endi oddiy funksiya chaqiruvi emas, balki tarmoq orqali (HTTP, keyingi darslarda ko'ramiz) — bu sekinroq va ishonchsizroq (tarmoq uzilishi mumkin).

>_ Exercise

InventoryService (ombor xizmati)ni qo'shing.

  • InventoryService struct'ini yozing, Handle() metodi "ombor tekshirildi (alohida servis)" qaytarsin
  • OrderService, PaymentService va InventoryService'ni chaqirib, har birining natijasini chop eting

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

Monolit — bitta dastur, sodda, lekin kattalashganda boshqarish qiyinlashadi; mikroservislar — mustaqil kichik xizmatlar, moslashuvchan, lekin tarmoq orqali aloqa murakkabligini qo'shadi.

NEXT UP

Service Boundaries

OUTPUT

$ go run main.go
Kodingizni ishga tushiring

Monolith vs Microservices

Monolit va mikroservislar

Bitta katta universal do'konni tasavvur qiling: oziq-ovqat, kiyim, elektronika — hammasi bitta binoda. Endi buning o'rniga, har biri o'z sohasiga ixtisoslashgan kichik do'konlar tarmog'ini tasavvur qiling: alohida oziq-ovqat do'koni, alohida kiyim do'koni. Ikkalasining ham afzalligi bor: universal do'konda hamma narsa bir joyda, boshqarish oson; kichik do'konlarda esa har biri o'z ishiga chuqur ixtisoslashgan, va bittasi yopilsa boshqalari ishlashda davom etadi.

Monolit (monolith) — butun ilova BITTA dastur, bitta kod bazasi, bitta joylashtirish birligi sifatida yoziladi ("Go Basics" kursidan boshlab shu paytgacha yozgan barcha loyihalaringiz — monolit edi). Mikroservis (microservice) arxitekturasida esa ilova bir nechta KICHIK, mustaqil xizmatlarga bo'linadi, har biri o'z vazifasiga ega va boshqalardan mustaqil joylashtiriladi.

example.go
package main

import "fmt"

// Monolit: bitta dastur ichida hamma funksiya birga
type MonolithApp struct{}

func (m *MonolithApp) HandleOrder() string   { return "buyurtma qabul qilindi (monolit ichida)" }
func (m *MonolithApp) HandlePayment() string { return "to'lov amalga oshirildi (monolit ichida)" }

// Mikroservis: har bir vazifa ALOHIDA, mustaqil xizmat
type OrderService struct{}

func (s *OrderService) Handle() string { return "buyurtma qabul qilindi (alohida servis)" }

type PaymentService struct{}

func (s *PaymentService) Handle() string { return "to'lov amalga oshirildi (alohida servis)" }

func main() {
	m := &MonolithApp{}
	fmt.Println(m.HandleOrder())

	order := &OrderService{}
	payment := &PaymentService{}
	fmt.Println(order.Handle())
	fmt.Println(payment.Handle())
}

Monolitning afzalligi: yozish va sinash SODDA (bitta dastur, bitta go run), funksiyalar orasida chaqiruv oddiy funksiya chaqiruvi (tez, ishonchli). Kamchiligi: dastur kattalashgani sari, uni tushunish va o'zgartirish qiyinlashadi, va kichik o'zgarish uchun ham BUTUN dasturni qayta joylashtirish kerak bo'ladi.

Mikroservisning afzalligi: har bir xizmat mustaqil rivojlantiriladi va joylashtiriladi (masalan OrderServiceni yangilash uchun PaymentServicega tegish shart emas), va har bir xizmat o'ziga kerakli miqdorda resurs (server) bilan mustaqil kengaytiriladi. Kamchiligi: xizmatlar orasidagi aloqa endi oddiy funksiya chaqiruvi emas, balki tarmoq orqali (HTTP, keyingi darslarda ko'ramiz) — bu sekinroq va ishonchsizroq (tarmoq uzilishi mumkin).

>_ Exercise

InventoryService (ombor xizmati)ni qo'shing.

  • InventoryService struct'ini yozing, Handle() metodi "ombor tekshirildi (alohida servis)" qaytarsin
  • OrderService, PaymentService va InventoryService'ni chaqirib, har birining natijasini chop eting

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

Monolit — bitta dastur, sodda, lekin kattalashganda boshqarish qiyinlashadi; mikroservislar — mustaqil kichik xizmatlar, moslashuvchan, lekin tarmoq orqali aloqa murakkabligini qo'shadi.

NEXT UP

Service Boundaries