Tema
/
Interneto svetainių serverio dalies kūrimas GO

Serveris — handlers, router, main

Dabar pats serveris — trys failai kaip skirtukai, priklausomybių tvarka: handlers.gorouter.gomain.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.