7 näpunäidet suure jõudlusega Golangi mikroteenuste kirjutamiseks

See on juhendamine Go mikroteenuste kujundamisse ja arendamisse. See artikkel juhendab teid otse Go-maailma parimate tavade juurde ja näitab teile, millised hanked on enne kätte antud. Ma jätan kõik allikad allpool.

  1. Ärge kasutage Go vaike HTTP-klienti
  2. Vaatleme neid raamistikke ja väliseid raamatukogusid (etalonid)
  3. Ärge kartke Makefiles
  4. Keskkonna seadistamiseks kuluva aja säästmiseks kasutage Go Modules
  5. Logi korralikult (Logrus)
  6. Kirjutage ühikatestid ilma valu
  7. Dokumenteerige kiiresti (Swagger)

1. Ärge kasutage Go vaike HTTP-klienti

Go-programmide, mis räägivad teenustega läbi HTTP, kirjutamine on lihtne ja lõbus. Sellegipoolest on probleem, kuhu on lihtne sattuda ja mis võib teie programmi väga kiiresti krahhida: vaike HTTP klient.

Go'i pakett http ei täpsusta vaikimisi päringu aegumistähtaegu, mis võimaldab teenustel teie gorutiine kaaperdada. Väliste teenustega ühenduse loomisel määrake alati kohandatud http.klient.

Kui kasutate rakendust http.Get (url), kasutate pakettmuutujat http.DefaultClient, mis määratleb kliendi vaikekonfiguratsiooni. Selle deklaratsioon on:

var DefaultClient = & Klient {}

Muu hulgas konfigureerib http.Client ajalõpu, mis lühistab pikaajalised ühendused. Selle väärtuse vaikeseade on 0, mida tõlgendatakse kui “timeout”. See võib olla mõistlik vaikimisi pakett, kuid see on vastik probleem ja põhjus, miks meie rakendus ülaltoodud näites ümber kukub. Nagu selgub, põhjustas Spacely Sprocketsi API katkestuse ühenduse loomise katsed (seda ei juhtu alati, kuid meie näites). Need jätkavad riputamist nii kaua, kuni riketega server otsustab oodata. Kuna kasutaja taotluste teenindamiseks tehti API kõnesid, rippusid sellega ka kasutajate taotlusi teenindavad gorutiinid. Kui piisavalt kasutajaid ketirataste lehele jõudis, langes rakendus üle, tõenäoliselt ressursside piirangu saavutamise tõttu.

Lahendus

Alati on parem, kui päringu olelustsükli üle on peenemat kontrolli, lisaks saate määrata kohandatud net.Transport ja net.Dialer. Transport on konstruktsioon, mida kliendid kasutavad TCP-ühenduse haldamiseks, ja Dialer on ühenduse loomist haldav ehitis. Go netipakendil on ka vaikimisi transport ja helistaja. Siin on näide kohandatud rakenduste kasutamisest:

tr: = & http.Transport {DialContext: (& net.Dialer {Timeout: n * time.Second, KeepAlive: n * time.Second,}). DialContext, TLSHandshakeTimeout: n * time.Second, ExpectContinueTimeout: n * time.Second , ResponseHeaderTimeout: n * aeg.Teise,
        MaxIdleConns: n, MaxConnsPerHost: n,}
cli: = & http.Klient {Transport: tr, ajalõpp: n * aeg.Teise,}

2. Vaadake neid raamistikke ja väliseid raamatukogusid läbi

Kui küsite Go-arendajalt, milliseid veebiraamistikke või -raamatukogusid võiksite kasutada, on tüüpiline vastus tavaliste raamatukogude juurde jäämine. Irooniline on see, et populaarseimad google'i otsingutulemid „golangi raamistike” kohta räägivad sellest, miks te ei peaks neid kasutama.

HTTP-serverite loomine on raamistiku abil kõige lihtsam.

Leidsin ühe nimega parameetri jaoks võrdlusalused Gini, Echo, Beego, Gorilla Muxi ja Goji suhtes ning tulemused on allpool. Ginil on kiireim ruuter, millele järgneb teine ​​teine ​​kaja.

JSONi sarjastamine ja deserialiseerimine

Kui API päring on ruuteri kaudu läbi löödud ja edastatud kontrollerile või töötlejale, on järgmine samm vastuse tagastamisel dekodeerida päring JSON või Encode.

Go-l on tõesti hea kodeerimispakett, mis toetab mitut vormingut, näiteks json, XML, csv, kuid alternatiivide kiire pilk näitab teile palju raamatukogusid. Siin on Jsoniteri, EasyJsoni võrdlusalus standardse kodeeringu / jsoni paketiga ja tulemused on allpool.

Allpool on JSONi dekodeerimise tulemus.

Kui teie taotlus on dekodeeritud, võiks järgmine samm olla äriloogika rakendamine ja teha mõned andmebaasi toimingud.

Kuigi sqlx vähendab CRUDi loomiseks kirjutatavate ridade arvu, kirjutate siiski korduvalt korduvat koodi. ORM-i kasutamine võib aidata seda vähendada ja keskenduda teie ettevõtte loogikale.

Siin on andmebaasi etalon, andmebaas + sqlx, gorm, päringutele minek go-pg ja tulemused on allpool. Üllatav on see, et go-pg, ORM toimib kiiremini kui tavaline pakett või isegi sqlx. GORM, kuigi ökosüsteemis väga kuulus, on suhteliselt aeglane.

200K kirjete päring postgres-DB-st

Need võrdlusalused aitavad teil valida oma raamistiku.

3. Ära karda Makefiles'i

Arenduse ajal olin harjunud käima korduvalt käskudes „ehita ehitamine“, „mine test“. See oli halb harjumus, mille peale ma loobun. See pole nii valus, kui kasutate lihtsat käsku ilma igasuguste argideta. Kuid keerukamate ülesannete korral on see loomulikult valus. Väljapääsuks võib pidada vähe võimalusi. Võite enda jaoks töö tegemiseks kasutada bash-skripti. Või veel parem, vähemalt minu jaoks võite kirjutada Makefile. Make-tool on sellel põhjusel olemas ja Makefile-is saate hoida kõik oma tavalised toimingud koos.

Minu Makefile näeb tavaliselt välja umbes selline:

ehitama: ## Ehitamine minema ehitama -o bin / binaarne_nimi cmd / main.go
käivita: ## Käivita serveri bin / binaarne_nimi
abi: @grep -E '^ [a-zA-Z _-] +:. *? ##. * $$' $ (MAKEFILE_LIST) | awk 'BEGIN {FS = ":. *? ##"}; {printf "\ 033 [36m% -30s \ 033 [0m% s \ n", $$ 1, $$ 2} '
.DEFAULT_GOAL: = abi

Sa täidaksid seda nii:

> pane jooksma
> pane ehitama
> make // loetleb kõik käsud koos kommentaaridega

Rohkem infot Makefile'i võimaluste kohta: https://sohlich.github.io/post/go_makefile/

4. Kasutage Go Mooduleid

Allikas: https://blog.golang.org/using-go-modules

Parima selgituse saamiseks lugege Go Mooduleid käsitlevat lähteartiklit.

Võimaluse korral peaksite oma projekti moodulina muudesse projektidesse imporditavaks tegema.

See säästab palju aega ja leiate, kus oma koodi väga kiiresti uuesti kasutada.

5. Logi korralikult sisse

Soovitus on https://github.com/sirupsen/logrus. Kuigi see on üks populaarsemaid, on see ka funktsioonirikas.

6. Kirjutage ühikutestid ilma valudeta

Te ei tohiks jälitada seda 100% -list leviala. Katke lihtsalt kõige kriitilisemad osad. Standardne testimiskogu töötab suurepäraselt.

Http-käitlejate testimiseks võite vaadata "net / http / httptest" teeki.

7. Dokumenteerige oma mikroteenus

Dokumenteerimiseks on Swaggeri kasutamine väga mugav.

https://github.com/swaggo/swag on kasutatud ja suudab pakkuda näidetega korralikku dokumentatsiooni.

Loodan, et see aitab teid välja! Uurige välja, kui midagi vajab parandamist või arvate teisiti. Täname, et lugesite, hoolitsege!

Seotud artiklid

https://medium.com/@nate510/don-t-use-go-s-default-http-client-4804cb19f779

https://hackernoon.com/the-myth-about-golang-frameworks-and-external-libraries-93cb4b7da50f

https://sohlich.github.io/post/go_makefile/

https://blog.golang.org/using-go-modules