7 съвета как да напишете високопроизводителни микросервизи Golang

Това е начина за въвеждане в проектирането и разработката на микросервизи Go. Тази статия ще ви насочи директно към най-добрите практики на света Go и ще ви покаже предимствата. Ще оставя всички източници долу долу.

  1. Не използвайте HTTP клиента по подразбиране на Go
  2. Помислете за тези рамки и външни библиотеки (показатели)
  3. Не се страхувайте от Makefiles
  4. Използвайте Go Modules, за да спестите времето си за настройка на околната среда
  5. Влезте правилно (Logrus)
  6. Пишете единични тестове без болка
  7. Документ бързо (Swagger)

1. Не използвайте HTTP клиента по подразбиране на Go

Писането на Go програми, които разговарят със услуги чрез HTTP, е лесно и забавно. Въпреки това има клопка, в която е лесно да изпаднете и може да срине програмата ви много бързо: HTTP клиента по подразбиране.

Http пакетът Go не определя по подразбиране изчакване на заявките, което позволява на услугите да отвлекат вашите goututines. Винаги посочвайте персонализиран http.Client, когато се свързвате с външни услуги.

Когато използвате http.Get (URL), използвате http.DefaultClient, променлива на пакета, която определя конфигурацията по подразбиране за клиент. Декларацията за това е:

var DefaultClient = & Клиент {}

Наред с други неща, http.Client конфигурира изчакване, което късо съединение на дългосрочни връзки. По подразбиране за тази стойност е 0, което се интерпретира като „няма изчакване“. Това може да се окаже разумно по подразбиране за пакета, но това е гадна клопка и причината за нашето приложение да попадне в горния пример. Както се оказва, прекъсването на API на Spacely Sprockets доведе до опити за свързване (това не винаги се случва, но това е в нашия пример). Те ще продължат да висят толкова дълго, колкото неизправният сървър реши да изчака. Тъй като API-обажданията се правеха за обслужване на потребителски заявки, това доведе и до блокиране на обслужващите потребителски заявки. След като достатъчно потребители попаднат на страницата със зъбни колела, приложението падна, най-вероятно поради ограничения ресурс.

Решението

Винаги е най-добре да имате по-фин контрол върху жизнения цикъл на заявката, можете допълнително да посочите персонализиран net.Transport и net.Dialer. Транспортът е структура, използвана от клиентите за управление на основата на TCP връзката и Dialer е структура, която управлява установяването на връзката. Нетният пакет на Go има също по подразбиране Транспорт и Набиране. Ето пример за използване на персонализирани такива:

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 {Транспорт: tr, Timeout: n * time.Second,}

2. Разгледайте тези рамки и външни библиотеки

Ако попитате програмист на Go за това какви уеб рамки или библиотеки бихте могли да използвате, типичният отговор се придържа към стандартните библиотеки. По ирония на съдбата най-добрият резултат от търсенето в google за „golang frameworks“ е свързан с това защо не трябва да ги използвате.

Изграждането на HTTP сървъри е най-лесно с рамка.

Намерих сравнителни показатели срещу Gin, Echo, Beego, Gorilla Mux, Goji за единичен именуван параметър и по-долу са резултатите. Джин има най-бързият рутер, последван от близко второ Echo.

JSON сериализация и десериализация

След като заявката за API бъде натисната през рутера и предадена на контролер или манипулатор, следващата стъпка е да декодирате заявката JSON или кодиране, докато връщате отговора.

Go има наистина добър пакет за кодиране, който поддържа множество формати като json, XML, csv, но бързият поглед върху алтернативите ви показва много библиотеки. Ето сравнителен показател за Jsoniter, EasyJson спрямо стандартния пакет за кодиране / json и по-долу са резултатите.

По-долу е резултатът за декодиране на JSON.

Сега, ако вашата заявка е декодирана, следващата стъпка може да бъде прилагането на вашата бизнес логика и може да се направят някои операции с база данни.

Докато sqlx намалява типичния брой редове, които пишете, за да изградите CRUD, все пак в крайна сметка пишете повтарящ се код. Използването на ORM може да ви помогне да го намалите и да се съсредоточите върху вашата бизнес логика.

Ето еталон за база данни, база данни + sqlx, gorm, go-pg за запитвания и по-долу са резултатите. Изненадващо, go-pg, ORM се изпълнява по-бързо от стандартния пакет или дори sqlx. GORM, докато е много известен в екосистемата, е сравнително бавен.

Заявка за 200K записи от DB postgres

Тези показатели ще ви помогнат да изберете своя набор от рамки.

3. Не се страхувайте от Makefiles

По време на разработката бях използван многократно ръчно да изпълнявам „go build“, „go test“. Това беше лош навик, по който подадох оставка. Не е толкова болезнено, ако използвате проста команда без никакви аргументи. Но в случай на по-сложни задачи, естествено, това ще бъде болка. Има няколко варианта, които можете да разгледате като изход. Можете да използвате скрипт за bash, за да свършите работата вместо вас. Или по-добре, поне за мен, можете да напишете Makefile. Инструментът за създаване е там поради тази причина и в Makefile можете да поддържате всички ваши общи задачи заедно.

Моят Makefile обикновено изглежда така:

build: ## Build go build -o bin / binary_name cmd / main.go
run: ## Пуснете сървъра bin / binary_name
помощ: @grep -E '^ [a-zA-Z _-] +:. *? ##. * $$' $ (MAKEFILE_LIST) | awk 'НАЧАЛИ {FS = ":. *? ##"}; {printf "\ 033 [36m% -30s \ 033 [0m% s \ n", $$ 1, $$ 2} '
.DEFAULT_GOAL: = помощ

Ще го изпълните така:

> направи пускане
> направи изграждане
> make // ще изброява всички команди с коментарите

Повече информация за възможностите на Makefile: https://sohlich.github.io/post/go_makefile/

4. Използвайте Go модули

Източник: https://blog.golang.org/using-go-modules

За най-добро обяснение вижте статията на източника за Go Modules.

Ако е възможно, трябва да направите проекта си приложим за други проекти като модул.

Това спестява много време и ще намерите къде да използвате повторно кода си много бързо.

5. Влезте правилно

Препоръката е https://github.com/sirupsen/logrus. Въпреки че е един от най-популярните, той също е богат на функции.

6. Пишете единични тестове без болка

Не трябва да преследвате това 100% покритие на кода. Просто покрийте най-критичните части. Стандартната библиотека за тестване работи отлично.

За тестване на вашите http обработчици можете да се обърнете към библиотеката "net / http / httptest".

7. Документирайте микрослужбата си

За документация е много удобно да използвате Swagger.

https://github.com/swaggo/swag е използван и може да предостави достойна документация с примери.

Надявам се, че това ви помага! Достигнете дали нещо се нуждае от подобрение или мислите по различен начин. Благодаря ви за четенето, внимавайте!

Свързани статии

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