Ntlafatso ea seva ea webo ho Golang - ho tloha ho bonolo ho isa ho e rarahaneng

Ntlafatso ea seva ea webo ho Golang - ho tloha ho bonolo ho isa ho e rarahaneng

Lilemong tse hlano tse fetileng ke ile ka qala hlahisa Gophish, sena se ile sa fana ka monyetla oa ho ithuta Segolang. Ke ile ka hlokomela hore Go ke puo e matla, e tlatsitsoeng ke lilaebrari tse ngata. Go e na le maemo a mangata: haholo-holo, e ka sebelisoa ho nts'etsapele lits'ebetso tsa lehlakore la seva ntle le mathata.

Sengoliloeng sena se bua ka ho ngola seva ho Go. Ha re qale ka lintho tse bonolo joalo ka "Hello world!" 'me re qete ka ts'ebeliso e nang le bokhoni bo latelang:

- Sebelisa Let's Encrypt bakeng sa HTTPS.
- E sebetsa joalo ka router ea API.
- Ho sebetsa le li-middleware.
- Ts'ebetso ea lifaele tse tsitsitseng.
- Thibelo e nepahetseng.

Skillbox e khothaletsa: Tsela e sebetsang "Moetsi oa Python ho tloha qalong".

Re hopotsa: bakeng sa babali bohle ba "Habr" - theolelo ea li-ruble tse 10 ha u ngolisa thupelong efe kapa efe ea Skillbox u sebelisa khoutu ea papatso ea "Habr".

Lefatše Lumela!

U ka theha seva ea webo ho Go kapele haholo. Mohlala ke ona oa ho sebelisa sets'oants'o se khutlisetsang "Hello, world!" E tšepisitsoeng ka holimo.

package main
 
import (
"fmt"
"net/http"
)
 
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello World!")
})
http.ListenAndServe(":80", nil)
}

Ka mor'a sena, haeba u tsamaisa kopo ebe u bula leqephe Localhost, ebe hang-hang u tla bona mongolo o reng “Lumela, lefatše!” (haeba ntho e 'ngoe le e' ngoe e sebetsa hantle, ho hlakile).

Re tla sebelisa sebapi makhetlo a mangata hamorao, empa pele, a re utloisiseng hore na tsohle li sebetsa joang.

net/http

Mohlala o sebelisitse sephutheloana net/http, ke sesebelisoa sa mantlha ho Go bakeng sa ho nts'etsapele li-server le bareki ba HTTP. Ho utloisisa khoutu, a re utloisise se boleloang ke lintlha tse tharo tsa bohlokoa: http.Handler, http.ServeMux le http.Server.

Basebelisi ba HTTP

Ha re fumana kopo, mohlokomeli oa e hlahlobisisa ebe o hlahisa karabo. Handlers in Go e sebelisoa ka tsela e latelang:

type Handler interface {
        ServeHTTP(ResponseWriter, *Request)
}

Mohlala oa pele o sebelisa mosebetsi oa mothusi oa http.HandleFunc. E phuthela mosebetsi o mong, oo hape o nkang http.ResponseWriter le http.Request into ServeHTTP.

Ka mantsoe a mang, ba sebetsanang le Golang ba hlahisoa ka sebopeho se le seng, se fanang ka likhetho tse ngata ho moetsi oa lenaneo. Kahoo, mohlala, middleware e kenngoa ts'ebetsong ho sebelisoa mochine, moo ServeHTTP e qalang ho etsa ntho e itseng ebe e bitsa mokhoa oa ServeHTTP oa mohlokomeli e mong.

Joalokaha ho boletsoe ka holimo, batsamaisi ba mpa ba fana ka likarabo ho likopo. Empa ke sesebelisoa sefe se khethehileng se lokelang ho sebelisoa ka nako e itseng?

Kopa Routing

Ho etsa khetho e nepahetseng, sebelisa multiplexer ea HTTP. Lilaebraring tse 'maloa e bitsoa muxer kapa router, empa kaofela li tšoana. Mosebetsi oa multiplexer ke ho sekaseka tsela ea kopo le ho khetha mohlokomeli ea loketseng.

Haeba o hloka ts'ehetso bakeng sa litsela tse rarahaneng, joale ho molemo ho sebelisa lilaebrari tsa mekhatlo ea boraro. Tse ling tsa tse tsoetseng pele ka ho fetisisa - korila/mux и go-chi/chi, lilaebrari tsena li etsa hore ho khonehe ho kenya ts'ebetso ea lipakeng ntle le mathata. Ka thuso ea bona, o ka hlophisa li-wildcard routing le ho etsa mesebetsi e meng e mengata. Monyetla oa bona ke ho lumellana le batho ba tloaelehileng ba sebetsang HTTP. Ka lebaka leo, o ka ngola khoutu e bonolo e ka fetoloang nakong e tlang.

Ho sebetsa ka mekhoa e rarahaneng maemong a tloaelehileng ho tla hloka litharollo tse sa tloaelehang, 'me sena se thatafatsa ts'ebeliso ea bahlokomeli ba kamehla. Ho theha boholo ba lits'ebetso, motsoako oa laeborari ea kamehla le router e bonolo e tla lekana.

Potso Processing

Ho feta moo, re hloka karolo e tla "mamela" bakeng sa likhokahano tse kenang le ho fetisetsa likopo tsohle ho motho ea nepahetseng. http.Seva e ka sebetsana le mosebetsi ona habonolo.

Se latelang se bontša hore seva se ikarabella bakeng sa mesebetsi eohle e amanang le ts'ebetso ea khokahanyo. Sena, mohlala, se sebetsa ho sebelisa protocol ea TLS. Ho kenya ts'ebetsong mohala oa http.ListenAndServer, ho sebelisoa seva e tloaelehileng ea HTTP.

Joale a re shebeng mehlala e rarahaneng haholoanyane.

Ho eketsa Lets Encrypt

Ka ho sa feleng, ts'ebeliso ea rona e tsamaisana le protocol ea HTTP, empa ho khothaletsoa ho sebelisa protocol ea HTTPS. Sena se ka etsoa ntle le mathata ho Go. Haeba u fumane setifikeiti le senotlolo sa poraefete, joale ho lekane ho ngolisa ListenAndServeTLS ka setifikeiti se nepahetseng le lifaele tsa bohlokoa.

http.ListenAndServeTLS(":443", "cert.pem", "key.pem", nil)

Ka linako tsohle u ka etsa betere.

A re ke re kenye e fana ka setifikeiti sa mahala ka nchafatso ea othomathiki. E le hore u sebelise tšebeletso, u hloka sephutheloana autocert.

Mokhoa o bonolo oa ho e lokisa ke ho sebelisa mokhoa oa autocert.NewListener hammoho le http.Serve. Mokhoa ona o u lumella ho fumana le ho ntlafatsa litifikeiti tsa TLS ha seva sa HTTP se ntse se etsa kopo:

http.Serve(autocert.NewListener("example.com"), nil)

Haeba re bula ho sebatli mohlala.com, re tla fumana karabo ea HTTPS "Lumela, lefatše!"

Haeba o hloka tlhophiso e felletseng, o lokela ho sebelisa molaoli oa autocert.Manager. Ebe re iketsetsa mohlala oa rona oa http.Server (ho fihlela joale re e sebelisitse ka ho sa feleng) ebe re eketsa mookameli ho seva sa TLSConfig:

m := &autocert.Manager{
Cache:      autocert.DirCache("golang-autocert"),
Prompt:     autocert.AcceptTOS,
HostPolicy: autocert.HostWhitelist("example.org", "www.example.org"),
}
server := &http.Server{
    Addr:      ":443",
    TLSConfig: m.TLSConfig(),
}
server.ListenAndServeTLS("", "")

Ona ke mokhoa o bonolo oa ho kenya ts'ehetso e felletseng ea HTTPS ka ho nchafatsa setifikeiti sa othomathike.

Ho eketsa litsela tse ikhethileng

Router ea kamehla e kenyellelitsoeng laebraring e tloaelehileng e ntle, empa e bohlokoa haholo. Lisebelisoa tse ngata li hloka litsela tse rarahaneng, ho kenyelletsa le litsela tsa lihlaha le tse hlaha, kapa mokhoa oa ho beha mekhoa ea litsela le liparamente.

Tabeng ena, ho molemo ho sebelisa liphutheloana korila/mux и go-chi/chi. Re tla ithuta ho sebetsa le ba ho qetela - mohlala o bontšitsoe ka tlase.

Ho fanoe ka faele ea api/v1/api.go e nang le litsela tsa API ea rona:

/ HelloResponse is the JSON representation for a customized message
type HelloResponse struct {
Message string `json:"message"`
}
 
// HelloName returns a personalized JSON message
func HelloName(w http.ResponseWriter, r *http.Request) {
name := chi.URLParam(r, "name")
response := HelloResponse{
Message: fmt.Sprintf("Hello %s!", name),
}
jsonResponse(w, response, http.StatusOK)
}
 
// NewRouter returns an HTTP handler that implements the routes for the API
func NewRouter() http.Handler {
r := chi.NewRouter()
r.Get("/{name}", HelloName)
return r
}

Re beha sehlomathiso sa api/vq bakeng sa litsela faeleng e kholo.

Ebe re ka beha sena ho router ea rona ea mantlha tlasa "api/v1/ prefix" ts'ebelisong ea rona ea mantlha:

// NewRouter returns a new HTTP handler that implements the main server routes
func NewRouter() http.Handler {
router := chi.NewRouter()
    router.Mount("/api/v1/", v1.NewRouter())
    return router
}
http.Serve(autocert.NewListener("example.com"), NewRouter())

Boiketlo ba Go ea ho sebetsa ka litsela tse rarahaneng bo etsa hore ho khonehe ho nolofatsa tlhophiso le tlhokomelo ea lits'ebetso tse kholo, tse rarahaneng.

Ho sebetsa le middleware

Staging e kenyelletsa ho phuthela sebatli se le seng sa HTTP le se seng, ho etsa hore ho khonehe ho etsa netefatso, khatello, ho rema lifate le mesebetsi e meng e mengata kapele.

E le mohlala, ha re shebeng sebopeho sa http.Handler; re tla se sebelisa ho ngola mochine o tiisang basebelisi ba litšebeletso.

func RequireAuthentication(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        if !isAuthenticated(r) {
            http.Redirect(w, r, "/login", http.StatusTemporaryRedirect)
            return
        }
        // Assuming authentication passed, run the original handler
        next.ServeHTTP(w, r)
    })
}

Ho na le li-routers tsa mokha oa boraro, joalo ka chi, tse u lumellang ho holisa ts'ebetso ea middleware.

Ho sebetsa le lifaele tsa static

Laeborari e tloaelehileng ea Go e kenyelletsa bokhoni ba ho sebetsa ka litaba tse sa fetoheng, ho kenyeletsoa litšoantšo, lifaele tsa JavaScript le CSS. Li ka fumanoa ka mosebetsi oa http.FileServer. E khutlisa sesebelisoa se sebeletsang lifaele ho tsoa bukeng e itseng.

func NewRouter() http.Handler {
    router := chi.NewRouter()
    r.Get("/{name}", HelloName)
 
// Настройка раздачи статических файлов
staticPath, _ := filepath.Abs("../../static/")
fs := http.FileServer(http.Dir(staticPath))
    router.Handle("/*", fs)
    
    return r

Ka sebele ho bohlokoa ho hopola hore http.Dir e bonts'a litaba tsa bukana haeba e se na faele e kholo ea index.html. Tabeng ena, ho thibela directory hore e se ke ea senyeha, o lokela ho sebelisa sephutheloana unindexed.

Ho koala hantle

Go e boetse e na le tšobotsi e bitsoang " graceful shutdown" ea seva sa HTTP. Sena se ka etsoa ho sebelisa mokhoa oa Shutdown(). Seva e qalisoa ka mokhoa oa goroutine, ebe mocha o mameloa ho amohela lets'oao la tšitiso. Hang ha letšoao le amoheloa, seva sea tima, empa eseng hang-hang, empa ka mor'a metsotsoana e seng mekae.

handler := server.NewRouter()
srv := &http.Server{
    Handler: handler,
}
 
go func() {
srv.Serve(autocert.NewListener(domains...))
}()
 
// Wait for an interrupt
c := make(chan os.Signal, 1)
signal.Notify(c, os.Interrupt)
<-c
 
// Attempt a graceful shutdown
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
srv.Shutdown(ctx)

E le sephetho

Go ke puo e matla e nang le laeborari e batlang e fumaneha hohle. Bokhoni ba eona ba kamehla bo pharaletse haholo, 'me bo ka ntlafatsoa ho sebelisoa li-interfaces - sena se u lumella ho hlahisa li-server tsa HTTP tse tšepahalang.

Skillbox e khothaletsa:

Source: www.habr.com

Eketsa ka tlhaloso