Idagbasoke olupin wẹẹbu ni Golang - lati rọrun si eka

Idagbasoke olupin wẹẹbu ni Golang - lati rọrun si eka

Odun marun seyin ni mo ti bere se agbekale Gophish, Eyi pese aye lati kọ ẹkọ Golang. Mo mọ̀ pé Go jẹ́ èdè alágbára, tí ọ̀pọ̀lọpọ̀ ilé-ìkàwé ṣe. Lọ jẹ wapọ: ni pataki, o le ṣee lo lati ṣe agbekalẹ awọn ohun elo ẹgbẹ olupin laisi eyikeyi awọn iṣoro.

Nkan yii jẹ nipa kikọ olupin ni Go. Jẹ ki a bẹrẹ pẹlu awọn nkan ti o rọrun bii “Hello aye!” ati pari pẹlu ohun elo pẹlu awọn agbara wọnyi:

- Lilo Jẹ ki a Encrypt fun HTTPS.
- Ṣiṣẹ bi olulana API.
- Nṣiṣẹ pẹlu middleware.
- Ṣiṣe awọn faili aimi.
- Tiipa ti o tọ.

Skillbox ṣe iṣeduro: Ilana ti o wulo "Olùgbéejáde Python lati ibere".

A leti: fun gbogbo awọn oluka ti "Habr" - ẹdinwo ti 10 rubles nigbati o forukọsilẹ ni eyikeyi iṣẹ-ẹkọ Skillbox nipa lilo koodu ipolowo “Habr”.

Mo ki O Ile Aiye!

O le ṣẹda olupin wẹẹbu ni Go ni iyara pupọ. Eyi jẹ apẹẹrẹ ti lilo oluṣakoso kan ti o dapada “Hello, aye!” ti a ṣeleri loke.

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)
}

Lẹhin eyi, ti o ba ṣiṣẹ ohun elo ati ṣii oju-iwe naa localhost, lẹhinna o yoo wo ọrọ naa lẹsẹkẹsẹ "Hello, aye!" (ti ohun gbogbo ba ṣiṣẹ ni deede, dajudaju).

A yoo lo olutọju naa ni ọpọlọpọ igba nigbamii, ṣugbọn akọkọ jẹ ki a loye bi ohun gbogbo ṣe n ṣiṣẹ.

net/http

Apẹẹrẹ lo package net/http, o jẹ ọpa akọkọ ni Go fun idagbasoke awọn olupin mejeeji ati awọn onibara HTTP. Lati loye koodu naa, jẹ ki a loye itumọ awọn eroja pataki mẹta: http.Handler, http.ServeMux ati http.Server.

HTTP handlers

Nigba ti a ba gba ibeere kan, olutọju naa ṣe itupalẹ rẹ ati ṣe agbekalẹ esi kan. Awọn olutọju ni Go ti wa ni imuse bi atẹle:

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

Apẹẹrẹ akọkọ nlo iṣẹ oluranlọwọ http.HandleFunc. O murasilẹ miiran iṣẹ, eyi ti o ni Tan gba http.ResponseWriter ati http.Request sinu ServeHTTP.

Ni awọn ọrọ miiran, awọn olutọju ni Golang ni a gbekalẹ ni wiwo ẹyọkan, eyiti o fun ọpọlọpọ awọn aṣayan si olutọpa naa. Nitorina, fun apẹẹrẹ, middleware ti wa ni imuse nipa lilo olutọju kan, nibiti ServeHTTP akọkọ ṣe nkan kan ati lẹhinna pe ọna ServeHTTP ti olutọju miiran.

Gẹgẹbi a ti sọ loke, awọn olutọju n ṣe ipilẹṣẹ awọn idahun si awọn ibeere. Ṣugbọn oluṣakoso pato wo ni o yẹ ki o lo ni aaye kan pato ni akoko?

Beere afisona

Lati ṣe yiyan ti o tọ, lo HTTP multiplexer. Ni nọmba awọn ile-ikawe o pe ni muxer tabi olulana, ṣugbọn gbogbo wọn jẹ ohun kanna. Išẹ ti multiplexer ni lati ṣe itupalẹ ọna ibeere ati yan olutọju ti o yẹ.

Ti o ba nilo atilẹyin fun ipa-ọna eka, lẹhinna o dara lati lo awọn ile-ikawe ẹnikẹta. Diẹ ninu awọn ilọsiwaju julọ - gorilla / mux и lọ-chi/chi, awọn ile-ikawe wọnyi jẹ ki o ṣee ṣe lati ṣe iṣelọpọ agbedemeji laisi awọn iṣoro eyikeyi. Pẹlu iranlọwọ wọn, o le tunto awọn afisona wildcard ati ṣe nọmba awọn iṣẹ-ṣiṣe miiran. Anfani wọn jẹ ibamu pẹlu awọn olutọju HTTP boṣewa. Bi abajade, o le kọ koodu ti o rọrun ti o le ṣe atunṣe ni ọjọ iwaju.

Ṣiṣẹ pẹlu awọn ilana eka ni ipo deede yoo nilo awọn solusan ti kii ṣe boṣewa, ati pe eyi ṣe pataki ni lilo awọn imudani aiyipada. Lati ṣẹda awọn tiwa ni opolopo ninu awọn ohun elo, a apapo ti awọn aiyipada ìkàwé ati ki o kan awọn olulana yoo jẹ to.

Ṣiṣe ibeere ibeere

Ni afikun, a nilo paati kan ti yoo “tẹtisi” fun awọn asopọ ti nwọle ki o tun darí gbogbo awọn ibeere si olutọju to tọ. http.Server le awọn iṣọrọ mu yi iṣẹ-ṣiṣe.

Atẹle yii fihan pe olupin jẹ iduro fun gbogbo awọn iṣẹ ṣiṣe ti o ni ibatan si sisẹ asopọ. Eyi, fun apẹẹrẹ, ṣiṣẹ nipa lilo ilana TLS. Lati ṣe imuse ipe http.ListenAndServer, olupin HTTP boṣewa ti lo.

Bayi jẹ ki ká wo ni eka sii apẹẹrẹ.

Fifi Jẹ ki ká encrypt

Nipa aiyipada, ohun elo wa nṣiṣẹ lori ilana HTTP, ṣugbọn o gba ọ niyanju lati lo ilana HTTPS. Eyi le ṣee ṣe laisi awọn iṣoro ni Go. Ti o ba ti gba ijẹrisi ati bọtini ikọkọ, lẹhinna o to lati forukọsilẹ ListenAndServeTLS pẹlu ijẹrisi to pe ati awọn faili bọtini.

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

O le nigbagbogbo ṣe dara julọ.

Jẹ ki Encrypt pese awọn iwe-ẹri ọfẹ pẹlu isọdọtun aifọwọyi. Lati le lo iṣẹ naa, o nilo package kan autocert.

Ọna to rọọrun lati tunto rẹ ni lati lo ọna autocert.NewListener ni apapo pẹlu http.Serve. Ọna naa gba ọ laaye lati gba ati imudojuiwọn awọn iwe-ẹri TLS lakoko ti awọn ilana olupin HTTP n beere:

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

Ti a ba ṣii ni ẹrọ aṣawakiri example.com, a yoo gba esi HTTPS kan "Hello, aye!"

Ti o ba nilo iṣeto ni alaye diẹ sii, lẹhinna o yẹ ki o lo oluṣakoso autocert.Manager. Lẹhinna a ṣẹda apẹẹrẹ http.Server tiwa (titi di bayi a lo nipasẹ aiyipada) ati ṣafikun oluṣakoso si olupin 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("", "")

Eyi jẹ ọna ti o rọrun lati ṣe atilẹyin HTTPS ni kikun pẹlu isọdọtun ijẹrisi laifọwọyi.

Fifi aṣa awọn ipa ọna

Olutọpa aiyipada ti o wa ninu ile-ikawe boṣewa dara, ṣugbọn o jẹ ipilẹ pupọ. Pupọ awọn ohun elo nilo ipa-ọna idiju diẹ sii, pẹlu itẹ-ẹiyẹ ati awọn ipa ọna kaadi, tabi ilana kan fun tito awọn ilana ọna ati awọn paramita.

Ni idi eyi o tọ lati lo awọn idii gorilla / mux и lọ-chi/chi. A yoo kọ bi a ṣe le ṣiṣẹ pẹlu igbehin - apẹẹrẹ ti han ni isalẹ.

Fifun ni faili api/v1/api.go ti o ni awọn ipa-ọna fun API wa:

/ 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
}

A ṣeto ìpele api/vq fun awọn ipa-ọna ninu faili akọkọ.

A le lẹhinna gbe eyi si olulana akọkọ wa labẹ api/v1/ ìpele pada ninu ohun elo akọkọ wa:

// 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())

Irọrun Lọ ti ṣiṣẹ pẹlu awọn ipa ọna eka jẹ ki o ṣee ṣe lati ṣe irọrun iṣeto ati itọju awọn ohun elo nla, eka.

Nṣiṣẹ pẹlu middleware

Iṣeto ni pẹlu fifipamọ oluṣakoso HTTP kan pẹlu omiiran, ṣiṣe ki o ṣee ṣe lati yara ṣe ijẹrisi, funmorawon, gedu, ati ọpọlọpọ awọn iṣẹ miiran.

Gẹgẹbi apẹẹrẹ, jẹ ki a wo wiwo http.Handler; a yoo lo lati kọ olutọju kan ti o jẹri awọn olumulo iṣẹ.

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)
    })
}

Awọn onimọ ipa-ọna ẹnikẹta wa, gẹgẹbi chi, ti o gba ọ laaye lati faagun iṣẹ ṣiṣe agbedemeji.

Nṣiṣẹ pẹlu awọn faili aimi

Ile-ikawe boṣewa Go pẹlu awọn agbara fun ṣiṣẹ pẹlu akoonu aimi, pẹlu awọn aworan, JavaScript ati awọn faili CSS. Wọn le wọle nipasẹ iṣẹ http.FileServer. O da olutọju kan pada ti o nṣe iranṣẹ awọn faili lati inu ilana kan pato.

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

O ti wa ni pato tọ ìrántí pe http.Dir han awọn awọn akoonu ti awọn liana ti o ba ti o ko ni ni akọkọ index.html faili. Ni idi eyi, lati ṣe idiwọ liana lati gbogun, o yẹ ki o lo package naa unindexed.

Tiipa ti o tọ

Lọ tun ni ẹya kan ti a pe ni pipade oore-ọfẹ ti olupin HTTP. Eyi le ṣee ṣe nipa lilo ọna Tiipa (). Awọn olupin ti wa ni bere ni a gorutine, ati ki o si awọn ikanni ti wa ni tẹtisi lati gba ohun idalọwọduro ifihan agbara. Ni kete ti ifihan ti gba, olupin naa wa ni pipa, ṣugbọn kii ṣe lẹsẹkẹsẹ, ṣugbọn lẹhin iṣẹju diẹ.

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)

Bi ipari

Go jẹ ede ti o lagbara pẹlu ile-ikawe boṣewa gbogbo agbaye ti o fẹrẹẹ. Awọn agbara aiyipada rẹ gbooro pupọ, ati pe wọn le ni ilọsiwaju nipa lilo awọn atọkun - eyi n gba ọ laaye lati ṣe agbekalẹ awọn olupin HTTP ti o gbẹkẹle nitootọ.

Skillbox ṣe iṣeduro:

orisun: www.habr.com

Fi ọrọìwòye kun