12-Factor App: Deployment & Runtime (Part 2)
12-omilli ilova: joylashtirish va ishga tushirish (2-qism)
Konvert fabrikasini tasavvur qiling: xomashyo keladi (build), undan tayyor mahsulot tayyorlanadi va qadoqlanadi (release), so'ng u do'konlarga jo'natilib, ishlatiladi (run). Har bir bosqich alohida va aniq: siz hech qachon "ishlab turgan" konvertni qayta qadoqlamaysiz.
12-Factor'ning navbatdagi qoidalari xuddi shu farqlashni talab qiladi: Build, release, run — uchta bosqich qat'iy ajratiladi (kod kompilyatsiya qilinadi -> sozlama bilan birlashtirilib "relize" yaratiladi -> shu relize ishga tushiriladi, orqaga qaytib bo'lmaydi). Port binding — ilova o'zining portini o'zi "tinglaydi" (masalan Apache yoki Nginx kabi tashqi web-serverga muhtoj emas). Concurrency — ilova ko'proq yukni ko'proq jarayon (yoki goroutine) qo'shib ko'taradi, bitta katta jarayonni "semirtirib" emas.
package main
import (
"fmt"
"net/http"
"os"
)
// PORT BINDING: ilova o'zi tinglaydi, tashqi web-serverga muhtoj emas
func main() {
port := os.Getenv("PORT")
if port == "" {
port = "8080"
}
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "Salom!")
})
fmt.Println("Tinglanmoqda:", port)
// haqiqiy loyihada: http.ListenAndServe(":"+port, nil)
}Go bu qoidaga tabiiy ravishda mos keladi: net/http paketi bilan yozilgan Go serveri Apache yoki Nginx kabi alohida web-server dasturiga MUHTOJ EMAS — u o'zi to'g'ridan-to'g'ri portni tinglaydi ("HTTP Client Basics" va "Your First HTTP Server" darslarida ko'rgan http.ListenAndServe). Bu Go'ning cloud-native ("bulutga tabiiy mos") deb hisoblanishining asosiy sabablaridan biri.
"Concurrency" qoidasi esa Go'ning eng kuchli tomoni bilan mos keladi: bitta so'rovni ishlash uchun og'ir "thread" yaratish o'rniga, Go har bir so'rov uchun yengil goroutine ishlatadi ("Concurrency Fundamentals" kursida ko'rgan edingiz) — bu minglab bir vaqtdagi so'rovni bitta jarayon ichida, samarali boshqarish imkonini beradi.
>_ Exercise
PORT muhit o'zgaruvchisidan portni o'qiydigan funksiya yozing.
- •resolvePort() string yozing: PORT o'zgaruvchisini o'qing, bo'sh bo'lsa "8080" qaytaring
- •PORT="3000" bilan va PORT o'rnatilmagan holda sinab, ikkalasini ham chop eting
Stuck? Reveal a hint to help you.
Key Takeaway
Key Takeaway:
Build/release/run bosqichlari qat'iy ajratiladi, ilova o'z portini o'zi tinglaydi (tashqi web-server shart emas), va yuk ortishi bilan goroutine/jarayon sonini oshirib javob beriladi.
NEXT UP
12-Factor App: Operations (Part 3)
$ go run main.go
Kodingizni ishga tushiring