7 tipů, jak psát vysoce výkonné mikroservisy Golang

Toto je úvodní návod k návrhu a vývoji mikroservisů Go. Tento článek vás dovede přímo k osvědčeným postupům světa Go a ukáže vám gotchas před rukou. Všechny zdroje nechám dole.

  1. Nepoužívejte výchozího klienta HTTP Go
  2. Zvažte tyto rámce a externí knihovny (měřítka)
  3. Nebojte se Makefiles
  4. Pomocí modulů Go ušetříte čas při nastavování prostředí
  5. Přihlaste se správně (Logrus)
  6. Napište jednotkové testy bez bolesti
  7. Dokument rychle (Swagger)

1. Nepoužívejte výchozího klienta HTTP Go

Psaní programů Go, které hovoří se službami přes HTTP, je snadné a zábavné. Existuje však úskalí, do kterého lze snadno spadnout a může váš program velmi rychle havarovat: výchozí klient HTTP.

Goův balíček http ve výchozím nastavení nespecifikuje vypršení časového limitu požadavků, což umožňuje službám unesení vašich goroutin. Při připojování k externím službám vždy zadejte vlastní http.Client.

Při použití http.Get (url) používáte http.DefaultClient, proměnnou balíčku, která definuje výchozí konfiguraci pro klienta. Prohlášení je následující:

var DefaultClient = & Klient {}

Protokol http.Client mimo jiné konfiguruje časový limit, který zkratuje dlouhodobá spojení. Výchozí hodnota pro tuto hodnotu je 0, což se interpretuje jako „žádný časový limit“. Může to být rozumný výchozí balíček, ale je to nepříjemný úskalí a příčina toho, že naše aplikace klesla ve výše uvedeném příkladu. Jak se ukázalo, výpadek rozhraní Spacely Sprockets API způsobil pokus o připojení k zablokování (k tomu nedochází vždy, ale v našem příkladu to tak je). Budou nadále viset, dokud se nefunkční server rozhodne počkat. Vzhledem k tomu, že se prováděly volání API pro obsazení uživatelských požadavků, způsobilo to, že se zavěsily i goroutiny sloužící požadavkům uživatelů. Jakmile na stránku řetězových kol narazilo dost uživatelů, aplikace se propadla, pravděpodobně kvůli dosažení limitů zdrojů.

Řešení

Vždy je nejlepší mít jemnější kontrolu nad životním cyklem žádosti, můžete navíc specifikovat vlastní net.Transport a net.Dialer. Transport je struktura používaná klienty ke správě základního připojení TCP a Dialer je struktura, která řídí vytvoření připojení. Síťový balíček Go má také výchozí Transport a Dialer. Zde je příklad použití vlastních:

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 * time.Second,
        MaxIdleConns: n, MaxConnsPerHost: n,}
cli: = & http.Client {Transport: tr, Timeout: n * time.Second,}

2.Zvažte tyto rámce a externí knihovny

Pokud se zeptáte vývojáře Go na to, jaké webové rámce nebo knihovny byste mohli použít, typická odpověď je držet se standardních knihoven. Je ironií, že nejlepší výsledek vyhledávání Google pro „golang frameworks“ je o tom, proč byste je neměli používat.

Vytváření serverů HTTP je nejjednodušší pomocí rámce.

Našel jsem měřítka proti Gin, Echo, Beego, Gorilla Mux, Goji pro jeden pojmenovaný parametr a níže jsou výsledky. Gin má nejrychlejší směrovač, za ním následuje druhá sekunda Echo.

Serializace a deserializace JSON

Jakmile je požadavek na API zaslán přes router a předán do řadiče nebo obsluhy, dalším krokem je dekódování požadavku JSON nebo Encode při vrácení odpovědi.

Go má opravdu dobrý kódovací balíček, který podporuje více formátů, jako json, XML, csv, ale rychlý pohled na alternativy vám ukáže spoustu knihoven. Zde je srovnávací test Jsoniter, EasyJson proti standardnímu kódování / json balíčku a níže jsou výsledky.

Níže je výsledek pro dekódování JSON.

Nyní, pokud máte požadavek dekódovaný, dalším krokem by mohlo být použití vaší obchodní logiky a může to být několik operací s databází.

Zatímco sqlx snižuje typický počet řádků, které píšete, abyste vytvořili CRUD, stále ještě mnohokrát píšete opakující se kód. Použití ORM by mohlo pomoci snížit jej a zaměřit se na vaši obchodní logiku.

Zde je měřítko databáze, databáze + sqlx, gorm, go-pg pro dotazování a níže jsou výsledky. Překvapivě, go-pg, ORM fungoval rychleji než standardní balíček nebo dokonce sqlx. GORM je v ekosystému velmi slavný, ale relativně pomalý.

Dotaz na záznamy 200 kB z DB postgresu

Tato měřítka vám pomohou vybrat sadu rámců.

3. Nebojte se Makefiles

Během vývoje jsem byl zvyklý opakovaně provádět „go build“, „go test“ ručně. To byl špatný zvyk, na který rezignuji. Není to tak bolestivé, pokud používáte jednoduchý příkaz bez arg. Ale v případě složitějších úkolů to bude samozřejmě bolest. Existuje několik možností, které můžete považovat za východisko. Pro práci můžete použít bash skript. Nebo lépe, alespoň pro mě, můžete napsat Makefile. Z tohoto důvodu je k dispozici nástroj make a v Makefile můžete všechny své společné úkoly udržet pohromadě.

Můj Makefile obvykle vypadá takto:

build: ## build go build build -o bin / binary_name cmd / main.go
run: ## Spustí server bin / binary_name
help: @grep -E '^ [a-zA-Z _-] +:. *? ##. * $$' $ (MAKEFILE_LIST) | awk 'BEGIN {FS = ":. *? ##"}; {printf "\ 033 [36m% -30s \ 033 [0m% s \ n", $$ 1, $$ 2} '
.DEFAULT_GOAL: = help

Provedli byste to takto:

> běh
> vytvořit sestavení
> make // vypíše všechny příkazy s komentáři

Další informace o možnostech makefile: https://sohlich.github.io/post/go_makefile/

4. Použijte Go moduly

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

Nejlepší vysvětlení najdete v zdrojovém článku o modulech Go.

Pokud je to možné, měli byste svůj projekt importovat do jiných projektů jako modul.

To vám ušetří spoustu času a velmi rychle zjistíte, kde znovu použít svůj kód.

5. Přihlaste se správně

Doporučení je https://github.com/sirupsen/logrus. I když je to jeden z nejpopulárnějších, je také bohatý na funkce.

6. Napište jednotkové testy bez bolesti

Neměli byste pronásledovat toto 100% pokrytí kódu. Stačí pokrýt nejdůležitější části. Standardní testovací knihovna funguje dobře.

Chcete-li otestovat vaše obslužné programy http, podívejte se do knihovny „net / http / httptest“.

7. Zdokumentujte svou mikroservis

Pro dokumentaci je velmi užitečné použít Swagger.

https://github.com/swaggo/swag byl použit a je schopen poskytnout slušnou dokumentaci s příklady.

Doufám, že vám to pomůže! Oslovte, pokud něco potřebuje zlepšení, nebo si myslíte jinak. Děkuji za přečtení, dejte pozor!

Související články

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

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

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

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