Serveris — handlers, router, main
Dabar pats serveris — trys failai kaip skirtukai, priklausomybių tvarka: handlers.go → router.go → main.go (apdorotojas, tada maršrutizatorius, kuris jį prijungia, tada main, kuris paleidžia maršrutizatorių). Kurk iš viršaus į apačią; main nesikompiliuos, kol nėra apdorotojo ir maršrutizatoriaus.
1. internal/handlers/handlers.go — struktūra Handlers sujungia bendras priklausomybes (kol kas tik config + registratorių; duomenų bazės laukas prisideda 3 pamokoje). Home įrašo paprastą HTML eilutę — 2 pamoka pakeis ją Templ šablonu. Health atsako į /healthz reikšme "ok" — tašką, kurį Railway tikrins diegimo fazėje.
2. internal/handlers/router.go — Chi maršrutizatorius ir middleware rietuvė, nuo išoriausio:
r.Use(middleware.RequestID)
r.Use(middleware.RealIP)
r.Use(middleware.Logger) // po vieną log eilutę kiekvienai užklausai
r.Use(middleware.Recoverer) // panika tampa 500, ne kritimu
r.Get("/", h.Home)
r.Get("/healthz", h.Health)
Recoverer — tas, kuris išgelbsti 2 val. nakties: panika bet kuriame apdorotojoje tampa švariu 500, o ne nugriauna visą serverį.
3. cmd/signflow/main.go — įėjimo taškas. Įkelia config, sukonstruoja maršrutizatorių ir aptarnauja su grakščiu išjungimu: gavus Ctrl-C (SIGINT) ar SIGTERM, nustoja priiminėti naujas užklausas ir iki 15 sekundžių užbaigia vykdomas prieš išeidamas. (cmd/ laiko paleidžiamą įėjimo tašką; visa kita — biblioteka po internal/.)
Patikrink. Paleisk:
go run ./cmd/signflow
Turi matyti struktūrizuotus log'us:
level=INFO msg="starting signflow" env=dev port=8080 base_url=http://localhost:8080
level=INFO msg=listening addr=:8080
Kitame terminale:
$ curl -s localhost:8080/healthz
ok
$ curl -s localhost:8080/
<!doctype html>
<title>SignFlow</title>
<h1>✍️ SignFlow</h1>
<p>The skeleton is up and serving.</p>
Atsidaryk http://localhost:8080 naršyklėje — štai tavo (be stiliaus) SignFlow. Paspausk Ctrl-C ir stebėk, kaip užrašo shutting down ir švariai išeina, ne su klaidų pėdsaku.
Spąstai (portas užimtas). Paleisk du kartus — antras nulūžta su:
level=ERROR msg="server error" err="listen tcp :8080: bind: address already in use"Kažkas jau užėmė 8080 (dažnai pamirštas
go run). Sustabdyk kitą procesą arba paleisk kitu portu:PORT=8081 go run ./cmd/signflow— konfigūracijos numatytoji reikšmė, kurią ką tik parašei, tai padaro savaime.