7 tipp a nagy teljesítményű kick-ass Golang mikroszolgáltatások írásához

Ez egy útmutatás a Go mikroszolgáltatások tervezéséhez és fejlesztéséhez. Ez a cikk közvetlenül vezet a Go világ legjobb gyakorlatához, és megmutatja neked a kézbesítést. Az összes forrást alább hagyom.

  1. Ne használja a Go alapértelmezett HTTP-kliensét
  2. Vegye figyelembe ezeket a kereteket és a külső könyvtárakat (referenciaértékek)
  3. Ne félj a Makefiles-től
  4. Használja a Go modulokat a környezet beállításához szükséges időmegtakarításhoz
  5. Megfelelő naplózás (Logrus)
  6. Írja be az egységteszteket fájdalom nélkül
  7. Gyorsan dokumentál (Swagger)

1. Ne használja a Go alapértelmezett HTTP-kliensét

A Go-programok írása, amelyek HTTP-n keresztül beszélnek a szolgáltatásokkal, egyszerű és szórakoztató. Van azonban olyan bukás, amelybe könnyen bele lehet esni, és nagyon gyorsan összeomlik a programja: az alapértelmezett HTTP kliens.

A Go http-csomagja alapértelmezés szerint nem határozza meg a kérelem időtúllépését, lehetővé téve a szolgáltatások számára, hogy eltérítsék az általános rendszereidet. A külső szolgáltatásokhoz való csatlakozáskor mindig adjon meg egy egyéni http.Client-et.

A http.Get (url) használatakor a http.DefaultClient, egy csomagváltozó, amely meghatározza az ügyfél alapértelmezett konfigurációját. Ennek nyilatkozata:

var DefaultClient = & Client {}

Többek között a http.Client beállít egy olyan időtúllépést, amely rövidzárlatot okoz a hosszú távú kapcsolatok számára. Ennek az értéknek az alapértelmezett értéke 0, azaz „nincs időtúllépés”. Ez valószínűleg alapértelmezett alapértelmezés a csomag számára, ám ez egy csúnya bukás, és alkalmazásunk elmaradásának oka a fenti példában. Mint kiderült, az Spacely Sprockets API leállása okozta a csatlakozási kísérleteket (ez nem mindig történik meg, de a példánkban ez megtörténik). Addig lógnak, amíg a hibás szerver úgy dönt, hogy vár. Mivel az API-hívásokat felhasználói kérések kiszolgálására készítették, ez a felhasználói kéréseket kiszolgáló gorutinok szintén lefagytak. Miután elegendő felhasználó eltalálta a lánckerék oldalt, az alkalmazás felülbukott, valószínűleg az erőforrás-korlátok elérése miatt.

A megoldás

Mindig a legjobb, ha finomabb ellenőrzés alatt áll a kérés életciklusa, emellett meghatározhat egy egyedi net.Transport és net.Dialer fájlokat is. A Közlekedés olyan ügylet, amelyet az ügyfelek használnak az alapul szolgáló TCP kapcsolat kezelésére, és a Tárcsázó egy struktúra, amely kezeli a kapcsolat létrehozását. A Go nettó csomagjának alapértelmezett szállítási és tárcsázó szolgáltatása is van. Íme egy példa az egyéni alkalmazásokra:

tr: = & http.Transport {DialContext: (& net.Dialer {Időtúllépés: n * time.Second, KeepAlive: n * time.Second,}). DialContext, TLSHandshakeTimeout: n * time.Second, ExpectContinueTimeout: n * time.Second , ResponseHeaderTimeout: n * time.Second,
        MaxIdleConns: n, MaxConnsPerHost: n,}
cli: = & http.Client {Közlekedés: tr, Időtúllépés: n * time.Second,}

2.Fontolja meg ezeket a kereteket és a külső könyvtárakat

Ha egy Go fejlesztőtől kérdezi, hogy milyen webes keretrendszereket vagy könyvtárakat használhatna, akkor a tipikus válasz a szokásos könyvtárak. Ironikus módon, a „glang keretek” legfontosabb google keresési eredménye arról szól, hogy miért nem szabad ezeket használni.

A HTTP-kiszolgálók építése a kerettel a legegyszerűbb.

Találtam referenciaértékeket Gin, Echo, Beego, Gorilla Mux, Goji ellen egyetlen megnevezett paraméterhez, és az alábbiakban az eredmények találhatók. Ginnek van a leggyorsabb útválasztója, majd a második visszhang visszatér.

JSON sorosítás és deserializálás

Miután egy API-kérelmet átjutott az útválasztón, és továbbította egy vezérlőhöz vagy kezelőhöz, a következő lépés a kérés JSON vagy Encode dekódolása a válasz visszaadásakor.

A Go egy igazán jó kódolócsomaggal rendelkezik, amely több formátumot támogat, mint például a json, XML, csv, de az alternatívák rövid áttekintése tonna könyvtárat jelenít meg. Itt található a Jsoniter, az EasyJson összehasonlító referenciamutatója a szokásos kódolás / json csomaggal szemben, az alábbiakban az eredmények találhatók.

Az alábbiakban látható a JSON dekódolása.

Most, ha a kérését dekódolja, a következő lépés lehet az üzleti logika alkalmazása, és elvégezhet bizonyos adatbázis-műveleteket.

Míg az sqlx csökkenti a CRUD elkészítéséhez írt tipikus sorok számát, sokszor ismétlődő kódot ír be. Az ORM használata csökkentheti azt, és az üzleti logikára összpontosíthat.

Itt van egy adatbázis referenciapontja, adatbázis + sqlx, gorm, go-pg a lekérdezéshez, az alábbiakban pedig az eredmények. Meglepő módon a go-pg, az ORM gyorsabban hajtódik végre, mint a szokásos csomag vagy akár az sqlx. A GORM, bár az ökoszisztéma rendkívül híres, viszonylag lassú.

200K rekord lekérdezése egy postgres DB-ből

Ezek a referenciaértékek segítik a keretrendszer kiválasztását.

3. Ne félj a Makefiles-től

A fejlesztés során a „go build”, „go test” manuális végrehajtására szoktam. Ez egy rossz szokás volt, amely miatt lemondtam. Ez nem annyira fájdalmas, ha egyszerű parancsot használ, bármiféle vita nélkül. De bonyolultabb feladatok esetén természetesen fájdalom lesz. Kevés lehetőség van, amelyeket kiutat lehet tekinteni. Használhat egy bash szkriptet a munka elvégzéséhez. Vagy még jobb, ha legalább nekem írhatsz egy Makefile-t. A make eszköz ezért van, ezért a Makefile-ben az összes közös feladatot együtt tarthatja.

A Makefile általában általában így néz ki:

build: ## build megy build -o bin / bináris_név cmd / main.go
futtatás: ## Futtassa a kiszolgáló bin / bináris_nevét
segítség: @grep -E '^ [a-zA-Z _-] +:. *? ##. * $$' $ (MAKEFILE_LIST) | awk 'BEGIN {FS = ":. *? ##"}; {printf "\ 033 [36m% -30s \ 033 [0m% s \ n", $$ 1, $$ 2} '
.DEFAULT_GOAL: = segítség

Ön ezt így hajthatja végre:

> indítsd el
> készítsen építést
> make // felsorolja az összes parancsot a megjegyzésekkel

További információ a Makefile lehetőségeiről: https://sohlich.github.io/post/go_makefile/

4. Használja a Go modulokat

Forrás: https://blog.golang.org/using-go-modules

A legjobb magyarázatért kérjük, olvassa el a Go modulokról szóló forrás cikket.

Ha lehetséges, a projektet modulként importálhatóvá kell tennie más projektekhez.

Ez sok időt takarít meg, és meg fogja találni, hogy hol használhatja újra a kódot.

5. Jelentkezzen be megfelelően

Az ajánlás https://github.com/sirupsen/logrus. Noha ez az egyik legnépszerűbb, de funkciókban is gazdag.

6. Írja be az egységteszteket fájdalom nélkül

Nem szabad üldöznie ezt a 100% -os kódlefedettséget. Csak fedje le a legkritikusabb részeket. A szokásos tesztkönyvtár nagyon jól működik.

A http-kezelők tesztelésére hivatkozhat a "net / http / httptest" könyvtárra.

7. Dokumentálja a mikroszolgáltatást

A dokumentációhoz nagyon praktikus a Swagger használata.

A https://github.com/swaggo/swag felhasználásra került, és képes példákkal megfelelő dokumentációt nyújtani.

Remélem, hogy ez segít neked! Nyissa meg, ha valamit javítani kell, vagy másként gondolkodik. Köszönöm az olvasást, vigyázz!

Kapcsolódó cikkek

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