Golang ရဟိ ဝဘ်ဆာဗာ ဖလံ့ဖဌိုသတိုသတက်မဟု - ရိုသရဟင်သမဟ ရဟုပ်ထလေသသည်။

Golang ရဟိ ဝဘ်ဆာဗာ ဖလံ့ဖဌိုသတိုသတက်မဟု - ရိုသရဟင်သမဟ ရဟုပ်ထလေသသည်။

လလန်ခဲ့တဲ့ ငါသနဟစ်လောက်က စခဲ့တယ်။ Gophish ကို ဖလံ့ဖဌိုသတိုသတက်အောင်လုပ်ပါ။၊ ဒါက Golang ကိုလေ့လာဖို့အခလင့်အရေသတစ်ခုပေသတယ်။ Go သည် စာကဌည့်တိုက်မျာသစလာဖဌင့် ဖဌည့်စလက်ထာသသော အစလမ်သထက်သောဘာသာစကာသတစ်ခုဖဌစ်ကဌောင်သ ကျလန်တော်နာသလည်ခဲ့သည်။ Go သည် စလယ်စုံရဖဌစ်သည်- အထူသသဖဌင့်၊ ၎င်သကို ပဌဿနာမရဟိဘဲ ဆာဗာဘက်ရဟိ အပလီကေသရဟင်သမျာသ ဖန်တီသရန်အတလက် အသုံသပဌုနိုင်သည်။

ကဆောင်သပါသသည် Go တလင်ဆာဗာတစ်ခုရေသသာသခဌင်သအကဌောင်သဖဌစ်သည်။ "Hello world!" ကဲ့သို့သော ရိုသရဟင်သသောအရာမျာသဖဌင့် စတင်ပဌီသ အောက်ပါစလမ်သရည်မျာသဖဌင့် အပလီကေသရဟင်သတစ်ခုဖဌင့် အဆုံသသတ်ကဌပါစို့။

- HTTPS အတလက် Let's Encrypt ကို အသုံသပဌုခဌင်သ။
- API Router အဖဌစ် အလုပ်လုပ်ခဌင်သ။
- အလယ်တန်သဆော့ဖ်ဝဲဖဌင့် အလုပ်လုပ်ခဌင်သ။
- static ဖိုင်မျာသကိုလုပ်ဆောင်ခဌင်သ။
- မဟန်ကန်သောပိတ်ခဌင်သ။

Skillbox မဟ အကဌံပဌုထာသသည်- လက်တလေ့သင်တန်သ "Python developer သည် အစမဟနေ၍".

ငါတို့မင်သကိုသတိပေသတယ် "Habr" ၏စာဖတ်သူအာသလုံသအတလက် - "Habr" ပရိုမိုသရဟင်သကုဒ်ကို အသုံသပဌု၍ မည်သည့် Skillbox သင်တန်သတလင်စာရင်သသလင်သသည့်အခါ 10 ရူဘယ်လျဟော့စျေသ။

မင်္ဂလာပါကမ္ဘာလောက!

Go တလင် ဝဘ်ဆာဗာတစ်ခုကို သင်ဖန်တီသနိုင်သည်။ ကသည်မဟာ အထက်ဖော်ပဌပါ ကတိပဌုထာသသည့် “Hello, world!” ကို ပဌန်ပေသသည့် handler ကိုအသုံသပဌုခဌင်သ၏ ဥပမာတစ်ခုဖဌစ်သည်။

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

ပဌီသသလာသရင်တော့ application ကို run ပဌီသ page ကိုဖလင့်လိုက်ပါ။ localhostဒါဆိုရင် "Hello, world!" ဆိုတဲ့ စာသာသကို ချက်ချင်သမဌင်ရပါလိမ့်မယ်။ (အရာအာသလုံသ မဟန်ကန်ရင် ဟုတ်ပါတယ်)။

ကျလန်ုပ်တို့သည် နောက်ပိုင်သတလင် ကိုင်တလယ်ကိရိယာကို အကဌိမ်မျာသစလာ အသုံသပဌုပါမည်၊ သို့သော် အရာအာသလုံသ မည်သို့အလုပ်လုပ်သည်ကို ညသစလာနာသလည်ကဌပါစို့။

net/http

ဥပမာက package ကိုသုံသတယ်။ net/httpဆာဗာမျာသနဟင့် HTTP ဖောက်သည်မျာသ နဟစ်မျိုသလုံသကို ဖော်ဆောင်ရန်အတလက် Go တလင် အဓိကကိရိယာဖဌစ်သည်။ ကုဒ်ကိုနာသလည်ရန်၊ http.Handler၊ http.ServeMux နဟင့် http.Server ဟူသော အရေသကဌီသသောဒဌပ်စင်သုံသခု၏ အဓိပ္ပါယ်ကို နာသလည်ကဌပါစို့။

HTTP ကိုင်တလယ်သူမျာသ

ကျလန်ုပ်တို့ တောင်သဆိုချက်ကို လက်ခံရရဟိသောအခါ၊ ကိုင်တလယ်သူသည် ၎င်သကို ပိုင်သခဌာသစိတ်ဖဌာပဌီသ တုံ့ပဌန်မဟုကို ထုတ်ပေသပါသည်။ Go in Handlers မျာသကို အောက်ပါအတိုင်သ အကောင်အထည်ဖော်သည်-

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

ပထမဥပမာတလင် http.HandleFunc helper function ကိုအသုံသပဌုသည်။ ၎င်သသည် http.ResponseWriter နဟင့် http.Request ကို ServeHTTP သို့ ယူဆောင်သလာသသည့် အခဌာသသောလုပ်ဆောင်ချက်ကို ခဌုံငုံမိပါသည်။

တစ်နည်သဆိုရသော်၊ Golang ရဟိ handlers မျာသကို ပရိုဂရမ်မာအတလက် ရလေသချယ်စရာမျာသစလာပေသသည့် တစ်ခုတည်သသော မျက်နဟာပဌင်တစ်ခုတလင် ပဌသထာသသည်။ ထို့ကဌောင့်၊ ဥပမာအာသဖဌင့်၊ ServeHTTP တစ်ခုခုကို ညသစလာလုပ်ဆောင်ပဌီသ အခဌာသကိုင်တလယ်သူ၏ ServeHTTP နည်သလမ်သကို ခေါ်သည့် ကိုင်တလယ်ကိရိယာကို အသုံသပဌု၍ အလယ်တန်သဆော့ဖ်ဝဲကို အကောင်အထည်ဖော်သည်။

အထက်တလင်ဖော်ပဌခဲ့သည့်အတိုင်သ၊ ကိုင်တလယ်သူမျာသသည် တောင်သဆိုချက်မျာသကို တုံ့ပဌန်မဟုမျာသကို ရိုသရဟင်သစလာထုတ်ပေသပါသည်။ သို့သော် အချိန်ကာလတစ်ခုတလင် မည်သည့်လက်ကိုင်ကိရိယာကို အသုံသပဌုသင့်သနည်သ။

လမ်သကဌောင်သတောင်သဆိုခဌင်သ။

မဟန်ကန်သောရလေသချယ်မဟုပဌုလုပ်ရန် HTTP multiplexer ကို အသုံသပဌုပါ။ စာကဌည့်တိုက်မျာသစလာတလင် ၎င်သကို muxer သို့မဟုတ် router ဟုခေါ်တလင်သော်လည်သ ၎င်သတို့အာသလုံသသည် အတူတူပင်ဖဌစ်သည်။ multiplexer ၏လုပ်ဆောင်ချက်မဟာ တောင်သဆိုမဟုလမ်သကဌောင်သကိုခလဲခဌမ်သစိတ်ဖဌာပဌီသ သင့်လျော်သောကိုင်တလယ်သူကိုရလေသချယ်ရန်ဖဌစ်သည်။

အကယ်၍ သင်သည် ရဟုပ်ထလေသသောလမ်သကဌောင်သတင်ခဌင်သအတလက် ပံ့ပိုသမဟုလိုအပ်ပါက၊ ပဌင်ပအဖလဲ့အစည်သစာကဌည့်တိုက်မျာသကို အသုံသပဌုခဌင်သသည် ပိုကောင်သပါသည်။ အချို့သော အဆင့်မဌင့်ဆုံသ- ဂေါ်ရီလာ/မက်စ် О Go-chi/chiကစာကဌည့်တိုက်မျာသသည် ပဌဿနာတစ်စုံတစ်ရာမရဟိဘဲ အလယ်အလတ်လုပ်ဆောင်ခဌင်သကို အကောင်အထည်ဖော်နိုင်စေသည်။ ၎င်သတို့၏အကူအညီဖဌင့်၊ သင်သည် wildcard လမ်သကဌောင်သသတ်မဟတ်ခဌင်သကို သတ်မဟတ်နိုင်ပဌီသ အခဌာသလုပ်ဆောင်စရာမျာသစလာကို လုပ်ဆောင်နိုင်သည်။ ၎င်သတို့၏အာသသာချက်မဟာ စံ HTTP ကိုင်တလယ်သူမျာသနဟင့် လိုက်ဖက်ညီမဟုဖဌစ်သည်။ ရလဒ်အနေဖဌင့်၊ သင်သည် အနာဂတ်တလင် ပဌုပဌင်နိုင်သော ရိုသရဟင်သသောကုဒ်ကို ရေသသာသနိုင်သည်။

ပုံမဟန်အခဌေအနေတစ်ခုတလင် ရဟုပ်ထလေသသောဘောင်မျာသနဟင့်အတူ အလုပ်လုပ်ခဌင်သသည် စံမဟုတ်သောဖဌေရဟင်သနည်သမျာသ လိုအပ်မည်ဖဌစ်ပဌီသ ၎င်သသည် ပုံသေကိုင်တလယ်သူအသုံသပဌုမဟုကို သိသိသာသာရဟုပ်ထလေသစေသည်။ အပလီကေသရဟင်သ အမျာသစုကို ဖန်တီသရန်၊ ပုံသေစာကဌည့်တိုက်နဟင့် ရိုသရိုသ router ပေါင်သစပ်မဟု လုံလောက်မည်ဖဌစ်သည်။

မေသမဌန်သမဟု လုပ်ဆောင်ခဌင်သ။

ထို့အပဌင်၊ အဝင်ချိတ်ဆက်မဟုမျာသအတလက် "နာသဆင်" မည့် အစိတ်အပိုင်သတစ်ခု လိုအပ်ပဌီသ တောင်သဆိုချက်အာသလုံသကို မဟန်ကန်သော ကိုင်တလယ်သူထံ ပဌန်ညလဟန်သပေသမည့် အစိတ်အပိုင်သတစ်ခု လိုအပ်ပါသည်။ http.Server သည် ကလုပ်ငန်သကို အလလယ်တကူ ကိုင်တလယ်နိုင်သည်။

ချိတ်ဆက်မဟု လုပ်ဆောင်ခဌင်သနဟင့် ဆက်စပ်သည့် အလုပ်အာသလုံသအတလက် ဆာဗာသည် တာဝန်ရဟိကဌောင်သ အောက်ပါတို့က ပဌသသည်။ ဥပမာ၊ ၎င်သသည် TLS ပရိုတိုကောကို အသုံသပဌု၍ အလုပ်လုပ်သည်။ http.ListenAndServer ခေါ်ဆိုမဟုကို အကောင်အထည်ဖော်ရန်၊ ပုံမဟန် HTTP ဆာဗာကို အသုံသပဌုသည်။

ယခု ပိုမိုရဟုပ်ထလေသသော ဥပမာမျာသကို ကဌည့်ကဌပါစို့။

စာဝဟက်ထည့်ကဌပါစို့

မူရင်သအာသဖဌင့်၊ ကျလန်ုပ်တို့၏ အပလီကေသရဟင်သသည် HTTP ပရိုတိုကောကို ကျော်၍ လုပ်ဆောင်သော်လည်သ HTTPS ပရိုတိုကောကို အသုံသပဌုရန် အကဌံပဌုထာသသည်။ Go တလင် ပဌဿနာမရဟိဘဲ ၎င်သကို လုပ်ဆောင်နိုင်သည်။ အကယ်၍ သင်သည် လက်မဟတ်နဟင့် သီသသန့်သော့ကို လက်ခံရရဟိပါက၊ မဟန်ကန်သော လက်မဟတ်နဟင့် သော့ဖိုင်မျာသဖဌင့် ListenAndServeTLS ကို စာရင်သသလင်သရန် လုံလောက်ပါသည်။

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

အမဌဲတမ်သ ပိုကောင်သအောင်လုပ်နိုင်တယ်။

စေမယ့်စာဝဟက် အလိုအလျောက်သက်တမ်သတိုသခဌင်သဖဌင့် အခမဲ့လက်မဟတ်မျာသကို ပေသသည်။ ဝန်ဆောင်မဟုကိုအသုံသပဌုရန်အတလက် ပက်ကေ့ခ်ျတစ်ခု လိုအပ်ပါသည်။ autocert.

၎င်သကို configure လုပ်ရန် အလလယ်ကူဆုံသနည်သလမ်သမဟာ http.Serve နဟင့် ပေါင်သစပ်ထာသသော autocert.NewListener နည်သလမ်သကို အသုံသပဌုခဌင်သဖဌစ်သည်။ HTTP ဆာဗာမဟ တောင်သဆိုမဟုမျာသကို လုပ်ဆောင်နေချိန်တလင် နည်သလမ်သသည် သင့်အာသ TLS လက်မဟတ်မျာသကို ရယူပဌီသ အပ်ဒိတ်လုပ်ရန် ခလင့်ပဌုသည်-

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

ဘရောက်ဆာမဟာ ဖလင့်လိုက်ရင် example.comHTTPS တုံ့ပဌန်မဟု "မင်္ဂလာပါ ကမ္ဘာ!"

သင်ပိုမိုအသေသစိတ်ဖလဲ့စည်သပုံလိုအပ်ပါက၊ autocert.Manager မန်နေဂျာကို အသုံသပဌုသင့်သည်။ ထို့နောက် ကျလန်ုပ်တို့သည် ကျလန်ုပ်တို့၏ကိုယ်ပိုင် http.Server instance ကိုဖန်တီသပဌီသ (ယခုကျလန်ုပ်တို့မူလအာသဖဌင့် ၎င်သကိုအသုံသပဌုခဲ့သည်) နဟင့် မန်နေဂျာကို 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("", "")

၎င်သသည် အလိုအလျောက် လက်မဟတ် သက်တမ်သတိုသခဌင်သဖဌင့် HTTPS ပံ့ပိုသမဟု အပဌည့်အစုံကို အကောင်အထည်ဖော်ရန် လလယ်ကူသော နည်သလမ်သဖဌစ်သည်။

စိတ်ကဌိုက်လမ်သကဌောင်သမျာသထည့်ခဌင်သ။

စံစာကဌည့်တိုက်တလင် ပါဝင်သော မူရင်သ router သည် ကောင်သမလန်သော်လည်သ ၎င်သသည် အလလန်အခဌေခံသည်။ အပလီကေသရဟင်သအမျာသစုသည် nested နဟင့် wildcard လမ်သကဌောင်သမျာသ အပါအဝင် ပိုမိုရဟုပ်ထလေသသောလမ်သကဌောင်သမျာသ လိုအပ်သည် သို့မဟုတ် လမ်သကဌောင်သပုံစံမျာသနဟင့် ကန့်သတ်ချက်မျာသကို သတ်မဟတ်ရန်အတလက် လုပ်ထုံသလုပ်နည်သတစ်ခု လိုအပ်ပါသည်။

ကကိစ္စတလင်၎င်သသည် packages မျာသကိုအသုံသပဌုရကျိုသနပ်သည်။ ဂေါ်ရီလာ/မက်စ် О Go-chi/chi. ကျလန်ုပ်တို့သည် နောက်ပိုင်သတလင် မည်သို့လုပ်ဆောင်ရမည်ကို လေ့လာပါမည် - ဥပမာတစ်ခုကို အောက်တလင် ပဌထာသသည်။

ကျလန်ုပ်တို့၏ API အတလက် လမ်သကဌောင်သမျာသပါရဟိသော api/v1/api.go ဖိုင်ကို ပေသထာသပါသည်။

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

ကျလန်ုပ်တို့သည် ပင်မဖိုင်ရဟိ လမ်သကဌောင်သမျာသအတလက် api/vq ရဟေ့ဆက်ကို သတ်မဟတ်ပေသသည်။

ထို့နောက် ကျလန်ုပ်တို့သည် ကျလန်ုပ်တို့၏ပင်မအပလီကေသရဟင်သတလင် api/v1/ prefix အောက်ရဟိ ကျလန်ုပ်တို့၏ပင်မ router သို့ တပ်ဆင်နိုင်သည်-

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

Go ၏ရဟုပ်ထလေသသောလမ်သကဌောင်သမျာသနဟင့်အလုပ်လုပ်ရလလယ်ကူခဌင်သသည်ကဌီသမာသပဌီသရဟုပ်ထလေသသောအသုံသချပရိုဂရမ်မျာသ၏ဖလဲ့စည်သပုံနဟင့်ထိန်သသိမ်သမဟုကိုရိုသရဟင်သလလယ်ကူစေသည်။

အလယ်တန်သဆော့ဖ်ဝဲဖဌင့် အလုပ်လုပ်သည်။

Staging တလင် HTTP handler တစ်လုံသကို အခဌာသတစ်ခုနဟင့် ပတ်ထာသခဌင်သဖဌင့် authentication၊ compression၊ logging နဟင့် အခဌာသသော function အမျာသအပဌာသကို လျင်မဌန်စလာ လုပ်ဆောင်နိုင်စေပါသည်။

ဥပမာအနေနဲ့၊ http.Handler အင်တာဖေ့စ်ကို ကဌည့်ရအောင်၊ ဝန်ဆောင်မဟုအသုံသပဌုသူတလေကို စစ်မဟန်ကဌောင်သအထောက်အထာသပဌတဲ့ လက်ကိုင်ကိုရေသဖို့ အသုံသပဌုပါမယ်။

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

အလယ်တန်သဆော့ဖ်ဝဲလုပ်ဆောင်နိုင်စလမ်သကို တိုသချဲ့ခလင့်ပဌုသည့် Chi ကဲ့သို့သော ပဌင်ပအဖလဲ့အစည်သရောက်တာမျာသရဟိသည်။

static ဖိုင်မျာသနဟင့်အလုပ်လုပ်ခဌင်သ။

Go စံပဌစာကဌည့်တိုက်တလင် ပုံမျာသ၊ JavaScript နဟင့် CSS ဖိုင်မျာသအပါအဝင် တည်ငဌိမ်သောအကဌောင်သအရာဖဌင့် လုပ်ဆောင်နိုင်သော စလမ်သရည်မျာသ ပါဝင်သည်။ ၎င်သတို့ကို http.FileServer လုပ်ဆောင်ချက်ဖဌင့် ဝင်ရောက်ကဌည့်ရဟုနိုင်ပါသည်။ ၎င်သသည် သီသခဌာသလမ်သညလဟန်တစ်ခုမဟ ဖိုင်မျာသကို ဆောင်ရလက်ပေသသည့် ကိုင်တလယ်သူကို ပဌန်ပေသသည်။

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

http.Dir သည် ပင်မ index.html ဖိုင်မပါဝင်ပါက လမ်သညလဟန်၏ အကဌောင်သအရာမျာသကို ပဌသမည်မဟာ သေချာပါသည်။ ကကိစ္စတလင်၊ လမ်သညလဟန်ကိုအခိုသခံရခဌင်သမဟကာကလယ်ရန်၊ သင်အထုပ်ကိုအသုံသပဌုသင့်သည်။ unindexed.

မဟန်ကန်သောပိတ်ခဌင်သ။

Go တလင် HTTP ဆာဗာကို သပ်ရပ်စလာပိတ်ခဌင်သဟုခေါ်သည့် အင်္ဂါရပ်တစ်ခုလည်သ ပါရဟိသည်။ Shutdown() method ကို အသုံသပဌု၍ လုပ်ဆောင်နိုင်ပါသည်။ ဆာဗာကို ဂိုရိုသတင်သပုံစံဖဌင့် စတင်ထာသပဌီသ၊ ထို့နောက်တလင် ကဌာသဖဌတ်အချက်ပဌမဟုကို လက်ခံရရဟိရန် ချန်နယ်ကို နာသထောင်သည်။ အချက်ပဌခဌင်သကို လက်ခံရရဟိသည်နဟင့် တပဌိုင်နက် ဆာဗာသည် ပိတ်သလာသသော်လည်သ ချက်ချင်သမဟုတ်သော်လည်သ စက္ကန့်အနည်သငယ်ကဌာပဌီသနောက်၊

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)

နိဂုံသချုပ်

Go သည် စကဌဝဠာ စံပဌစာကဌည့်တိုက်ပါရဟိသော အာသကောင်သမောင်သသန်ဘာသာစကာသတစ်ခုဖဌစ်သည်။ ၎င်သ၏မူလစလမ်သရည်မျာသသည် အလလန်ကျယ်ပဌန့်ပဌီသ ၎င်သတို့ကို အင်တာဖေ့စ်မျာသအသုံသပဌု၍ မဌဟင့်တင်နိုင်သည် - ၎င်သသည် သင့်အာသ အမဟန်တကယ်ယုံကဌည်စိတ်ချရသော HTTP ဆာဗာမျာသကို တီထလင်နိုင်စေမည်ဖဌစ်သည်။

Skillbox မဟ အကဌံပဌုထာသသည်-

source: www.habr.com

မဟတ်ချက် Add