GoDasturchi
Service Discovery Patterns

Service Discovery Patterns

Servisni topish naqshlari

Yangi shaharga ko'chib kelganingizda, do'stingizning uy manzilini bilmasangiz, uni telefon kitobidan yoki tanishlar orqali so'raysiz. Service Discovery (servisni topish) — mikroservislar bir-birining "manzilini" (IP, port) qanday topishi degan muammoni hal qiladi, chunki bulut muhitida servislarning manzili tez-tez o'zgarib turadi (server qayta ishga tushganda, yangi nusxa qo'shilganda).

example.go
package main

import "fmt"

// Registry — "telefon kitobi": servis nomi -> uning joriy manzili
type Registry struct {
	services map[string]string
}

func NewRegistry() *Registry {
	return &Registry{services: make(map[string]string)}
}

func (r *Registry) Register(name, address string) {
	r.services[name] = address
}

func (r *Registry) Discover(name string) (string, bool) {
	addr, ok := r.services[name]
	return addr, ok
}

func main() {
	reg := NewRegistry()
	reg.Register("user-service", "10.0.0.5:8080")
	reg.Register("order-service", "10.0.0.7:8080")

	addr, ok := reg.Discover("user-service")
	fmt.Println(addr, ok)
}

Bu — "Docker Compose Service Discovery" darsida ko'rgan g'oyaning umumiyroq ko'rinishi: har bir servis ishga tushganda o'zini Register orqali "ro'yxatdan o'tkazadi" ("men — user-service, mening manzilim 10.0.0.5:8080"), va boshqa servislar unga murojaat qilishdan oldin Discover orqali joriy manzilni so'raydi. Bu — IP-manzilni kodga "qattiq yozib qo'yish" (hardcode) o'rniga, uni DINAMIK ravishda topishning asosiy g'oyasi.

Haqiqiy production tizimlarda bu "telefon kitobi" rolini maxsus vositalar (Consul, etcd) yoki Kubernetes'ning o'zi (DNS orqali, keyingi darsda ko'ramiz) o'ynaydi — ular servislar sog'lig'ini ham kuzatib boradi, "o'lik" (health check'dan o'tmagan) servislarni ro'yxatdan avtomatik olib tashlaydi.

>_ Exercise

Registry'ga servisni ro'yxatdan chiqarish (Deregister) imkonini qo'shing.

  • Deregister(name string) metodini yozing: xaritadan o'sha nomni olib tashlang (delete)
  • "cache-service"ni ro'yxatdan o'tkazing, so'ng Deregister qiling, keyin Discover qilib natijasini (bool) chop eting

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

Service Discovery — servislar nomi orqali ularning joriy manzilini topish mexanizmi; bu manzillarni qattiq yozib qo'yish o'rniga, dinamik va o'zgaruvchan muhitda ishlashni ta'minlaydi.

NEXT UP

Service Discovery Part 2: DNS and Kubernetes

OUTPUT

$ go run main.go
Kodingizni ishga tushiring

Service Discovery Patterns

Servisni topish naqshlari

Yangi shaharga ko'chib kelganingizda, do'stingizning uy manzilini bilmasangiz, uni telefon kitobidan yoki tanishlar orqali so'raysiz. Service Discovery (servisni topish) — mikroservislar bir-birining "manzilini" (IP, port) qanday topishi degan muammoni hal qiladi, chunki bulut muhitida servislarning manzili tez-tez o'zgarib turadi (server qayta ishga tushganda, yangi nusxa qo'shilganda).

example.go
package main

import "fmt"

// Registry — "telefon kitobi": servis nomi -> uning joriy manzili
type Registry struct {
	services map[string]string
}

func NewRegistry() *Registry {
	return &Registry{services: make(map[string]string)}
}

func (r *Registry) Register(name, address string) {
	r.services[name] = address
}

func (r *Registry) Discover(name string) (string, bool) {
	addr, ok := r.services[name]
	return addr, ok
}

func main() {
	reg := NewRegistry()
	reg.Register("user-service", "10.0.0.5:8080")
	reg.Register("order-service", "10.0.0.7:8080")

	addr, ok := reg.Discover("user-service")
	fmt.Println(addr, ok)
}

Bu — "Docker Compose Service Discovery" darsida ko'rgan g'oyaning umumiyroq ko'rinishi: har bir servis ishga tushganda o'zini Register orqali "ro'yxatdan o'tkazadi" ("men — user-service, mening manzilim 10.0.0.5:8080"), va boshqa servislar unga murojaat qilishdan oldin Discover orqali joriy manzilni so'raydi. Bu — IP-manzilni kodga "qattiq yozib qo'yish" (hardcode) o'rniga, uni DINAMIK ravishda topishning asosiy g'oyasi.

Haqiqiy production tizimlarda bu "telefon kitobi" rolini maxsus vositalar (Consul, etcd) yoki Kubernetes'ning o'zi (DNS orqali, keyingi darsda ko'ramiz) o'ynaydi — ular servislar sog'lig'ini ham kuzatib boradi, "o'lik" (health check'dan o'tmagan) servislarni ro'yxatdan avtomatik olib tashlaydi.

>_ Exercise

Registry'ga servisni ro'yxatdan chiqarish (Deregister) imkonini qo'shing.

  • Deregister(name string) metodini yozing: xaritadan o'sha nomni olib tashlang (delete)
  • "cache-service"ni ro'yxatdan o'tkazing, so'ng Deregister qiling, keyin Discover qilib natijasini (bool) chop eting

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

Service Discovery — servislar nomi orqali ularning joriy manzilini topish mexanizmi; bu manzillarni qattiq yozib qo'yish o'rniga, dinamik va o'zgaruvchan muhitda ishlashni ta'minlaydi.

NEXT UP

Service Discovery Part 2: DNS and Kubernetes