Yüksək performanslı Golang mikroservislərini necə yazmağınıza dair 7 göstəriş

Bu Go microservice dizaynına və inkişafına necə bir girişdir. Bu yazı sizi birbaşa Go dünyasının ən yaxşı təcrübələrinə yönəldəcək və əlinizdən əvvəl qazancları sizə göstərəcəkdir. Bütün mənbələri aşağıda qoyacağam.

  1. Gonun standart HTTP müştərisini istifadə etməyin
  2. Bu Çərçivə sənədlərini və Xarici Kitabxanaları nəzərdən keçirin (meyar nişanları)
  3. Makefiles-dən qorxma
  4. Ətraf mühitin qurulmasına vaxtınızı qənaət etmək üçün Go Modulları istifadə edin
  5. Düzgün daxil olun (Logrus)
  6. Vahid testlərini ağrısız yazın
  7. Sənəd tezdir (Süpürgəçi)

1. Gonun standart HTTP müştərisini istifadə etməyin

HTTP üzərindən xidmətlərlə danışan Go proqramlarını yazmaq asan və əyləncəlidir. Bununla birlikdə asanlıqla düşməyiniz və proqramınızı tez bir zamanda çökdürə biləcəyi bir tələ var: standart HTTP müştəri.

Go-nun http paketi, xidmətlərin goroutinesinizi qaçırmaq üçün icazə verməsi ilə, tələb vaxtlarını təyin etmir. Xarici xidmətlərə qoşulduqda həmişə xüsusi bir http.Client göstərin.

Http.Get (url) istifadə edərkən, bir müştəri üçün standart konfiqurasiyanı təyin edən bir paket dəyişən http.DefaultClient-dən istifadə edirsiniz. Bunun üçün bəyannamə:

var DefaultClient = & Müştəri {}

Digər şeylər arasında, http.Client qısa dövrələrin uzun müddət davam edən bağlantılar yaratma müddətini konfiqurasiya edir. Bu dəyər üçün standart 0-dur, bu da "fasiləsiz vaxt" kimi şərh olunur. Bu paket üçün həssas bir defolt ola bilər, amma bu, pis bir tələ və yuxarıdakı misalda tətbiqimizin aşmasına səbəb olur. Göründüyü kimi, Spacely Sprockets'in API kəsilməsi bağlantı cəhdlərinin asılmasına səbəb oldu (bu həmişə olmur, amma bu, bizim nümunəmizdə olur). Arızalı server gözləməyə qərar verdiyi müddətcə asmağa davam edəcəklər. İstifadəçi sorğularına xidmət etmək üçün API zəngləri edildiyi üçün istifadəçi sorğularına xidmət edən goroutines-in də asılmasına səbəb oldu. Kifayət qədər istifadəçi ləkələri səhifəsinə vurduqdan sonra, ehtimal ki, resurs məhdudiyyətlərinə çatdığına görə, proqram aşdı.

Həll

İstək ömrü boyu incə nəzarəti əldə etmək həmişə yaxşıdır, əlavə olaraq xüsusi bir net.Transport və net.Dialer təyin edə bilərsiniz. A Nəqliyyat əsas TCP bağlantısını idarə etmək üçün müştərilər tərəfindən istifadə edilən bir quruluşdur və Dialer əlaqənin qurulmasını idarə edən bir quruluşdur. Gonun xalis paketində standart Nəqliyyat və Dialer də var. Xüsusi olanlardan istifadə nümunəsi:

tr: = & http.Transport {DialContext: (& net.Dialer {Zamanlama: n * vaxt.Sekund, KeepAlive: n * vaxt , CavabHeaderTimeout: n * vaxt.Sekund,
        MaxIdleConns: n, MaxConnsPerHost: n,}
cl: = & http.Müştəri {Nəqliyyat: tr, Zamanlama: n * vaxt.Sekund,}

2. Bu Çərçivələr və Xarici Kitabxanalara nəzər salın

Bir Go geliştiricisindən hansı veb çərçivə və ya kitabxanadan istifadə edə biləcəyinizi soruşsanız, tipik cavab standart kitabxanalara uyğundur. Təəssüf ki, "golang çərçivəsində" üçün ən yaxşı google axtarış nəticəsi niyə onları istifadə etməməyinizlə bağlıdır.

HTTP serverlərini qurmaq bir çərçivə ilə asandır.

Gin, Echo, Beego, Gorilla Mux, Goji ilə müqayisədə vahid adlandırılmış bir parametr üçün aşağıda nəticələr tapdım. Cin ən sürətli yönləndiriciyə malikdir, ardınca yaxın ikinci Echo.

JSON Serializasiya və Deserializasiya

Bir API tələbi yönlendiricidən vurulduqdan və bir nəzarətçiyə və ya idarəediciyə ötürüldükdən sonra növbəti addım cavabı qaytararkən sorğunun JSON və ya Encode kodunu açmaqdır.

Go, həqiqətən, json, XML, csv kimi bir çox formatı dəstəkləyən yaxşı bir kodlaşdırma paketinə malikdir, lakin alternativlərə sürətli bir şəkildə baxmaq sizə kitabxanaları göstərir. Budur Jsoniter, EasyJsonun standart kodlama / json paketinə qarşı müqayisəsi və aşağıda göstərilən nəticələr.

Aşağıda JSON-un dekodlanması üçün nəticə verilmişdir.

İndi sorğunuzun şifrəsi varsa, növbəti addım iş məntiqinizi tətbiq edə bilər və bəzi verilənlər bazası əməliyyatları edə bilər.

Sqlx bir CRUD qurmaq üçün yazdığınız sətirlərin tipik sayını azaltsa da, yenə də təkrar kodunu bir çox dəfə yazmağa davam edirsiniz. Bir ORM istifadə onu azaltmağa və iş məntiqinizə yönəltməyə kömək edə bilər.

Burada verilənlər bazası, verilənlər bazası + sqlx, gorm, sorğu üçün go-pg və aşağıda göstərilən nəticələr var. Təəccüblüdür ki, go-pg, ORM standart paketdən və ya hətta sqlx-dan daha sürətli yerinə yetirildi. Ekosistemdə çox məşhur olsa da GORM nisbətən yavaşdır.

Bir postgres DB-dən 200K qeydlərini soruşmaq

Bu meyar nişanları, çərçivələrinizi seçməyə kömək edəcəkdir.

3. Makefiles-dən qorxma

İnkişaf əsnasında əllə "getmək", "getmək testi" ni dəfələrlə icra etməyə öyrəşmişdim. Bu istefa etdiyim pis bir vərdiş idi. Sadə bir əmr istifadə edərsənsə heç bir mübahisə etmədən bu qədər ağrılı deyil. Ancaq daha mürəkkəb vəzifələrin yerinə yetirilməsi halında, təbii ki, ağrı olacaq. Bir çıxış yolu kimi nəzərdən keçirəcəyiniz bir neçə variant var. İşinizi etmək üçün bir bash skriptindən istifadə edə bilərsiniz. Və ya daha yaxşı, heç olmasa mənim üçün bir Makefile yaza bilərsiniz. Makiyaj aləti bu səbəbdən var və Makefile-də bütün ümumi tapşırıqlarınızı birlikdə saxlaya bilərsiniz.

Mənim Makefile adətən bu kimi bir şeyə bənzəyir:

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

Bunu belə edərdin:

> qaçmaq
qurmaq
> make // bütün əmrləri şərhlərlə sadalayacaq

Makefile imkanları haqqında daha çox məlumat: https://sohlich.github.io/post/go_makefile/

4. Get Modullarından istifadə edin

Mənbə: https://blog.golang.org/using-go-modules

Ən yaxşı izahat üçün Go Modullar haqqında qaynaq məqaləsinə baxın.

Mümkünsə, layihənizi modul olaraq digər layihələrə idxal edə biləcəyinizi etməlisiniz.

Bu çox vaxta qənaət edir və kodunuzu çox tez harada istifadə edəcəyinizi tapa bilərsiniz.

5. Düzgün daxil olun

Tövsiyə https://github.com/sirupsen/logrus. Ən populyarlarından biri olsa da, zəngin xüsusiyyətlərə malikdir.

6. Vahid testlərini ağrısız yazın

Bu 100% kod əhatəsini təqib etməməlisiniz. Yalnız ən kritik hissələri əhatə edin. Standart test kitabxanası yaxşı işləyir.

Http işləyicilərinizi sınamaq üçün "net / http / wikiptest" kitabxanasına müraciət edə bilərsiniz.

7. Mikroservisinizi sənədləşdirin

Sənədlər üçün Swagger istifadə etmək çox rahatdır.

https://github.com/swaggo/swag istifadə edilmişdir və nümunələrlə layiqli sənədlər təqdim etməyə qadirdir.

Ümid edirəm ki, bu sizə kömək edir! Bir şeyin yaxşılaşmasına ehtiyacınız varsa ya da başqa cür düşünsəniz çatın. Oxuduğunuz üçün təşəkkür edirəm, diqqət edin!

Əlaqəli məqalələr

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

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

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

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