Bir bağlana bilən Golang tətbiqi necə yaradılır və AWS Lambda Layers-dan faydalanır.

Golang - niyə diqqətinizə dəyər?

Golang, Google tərəfindən hazırlanmış və tətbiq olunan açıq mənbəli bir proqramlaşdırma dilidir. Müasir tətbiqetmələrdə, xüsusilə də buludda çox geniş istifadə olunur. Ən xarakterik xüsusiyyətlər bunlardır:

  • Golang statik olaraq yazılmışdır - daha az rahatlıq təklif edir, lakin sizi səhvlərdən qoruyur,
  • Obyekt yönümlü deyil. Bununla birlikdə, strukturlar və interfeyslər yarada bilərsiniz ki, bu da 4 OOP prinsipindən 3-nü verir: məlumatların abstraksiya, kapsülləmə və polimorfizm. Eksik olan yalnız mirasdır
  • Qoroutinlər! - İndiyə qədər istifadə etdiyim yüngül iplərin ən yaxşı tətbiqi. Go operatoru ilə asanlıqla yeni bir mövzu yarada və müxtəlif goutinlər arasındakı kanallar vasitəsilə əlaqə qura bilərsiniz.
  • Bütün asılılıqlarla vahid ikili fayla yığılır - daha çox paket ziddiyyəti yoxdur!

Şəxsən mən Golang dilini hər gün istifadə etdiyim ən böyük dil hesab edirəm. Bununla birlikdə, bu məqalə ilk funksiyanı yaratmaq və ya "Hello World" yazdırmaqla əlaqəli deyil. Biraz daha inkişaf etmiş məhsullar göstərəcəyəm. Bir başlanğıc edirsinizsə və Golang haqqında daha çox məlumat əldə etmək istəyirsinizsə, əsas səhifəni ziyarət edin.

AWS Lambda və Golang

AWS Lambda, Amazon Web Services tərəfindən 2014-cü ilin noyabrında çıxarılan ümumi buludda ən populyar serversiz hesablama xidmətlərindən biridir. Kodlarınızı serverləri qurmaq və ya idarə etmək məcburiyyətində qalmadan DynamoDB, SNS və ya HTTP tetikleyiciləri kimi hadisələrə cavab olaraq işləyə bilərsiniz! Həqiqətən nəyin möhtəşəm olduğunu bilirsinizmi? Golang müddətini 2018-ci ilin yanvarından bəri dəstəkləyir. AWS Lambda ilə işləmək həqiqətən asandır - sadəcə kodunuzla və bütün asılılıqlarınızla (Golang istifadə edirsinizsə tək ikili) sıxılmış bir paket yükləyin.

4 il sonra sürətlə irəliləyin, 2018 yenidən: AWS-i icad edin, müxtəlif funksiyalar üçün paylaşılan məlumatları bir və ya bir neçə AWS hesabında saxlamağa və idarə etməyə imkan verən Lambda Layers buraxır! Məsələn, Python istifadə edirsinizsə, bütün asılılıqları daha sonra digər lambdalar tərəfindən istifadə edilə bilən əlavə bir təbəqəyə qoya bilərsiniz. Artıq hər bir sıxılmış paketə fərqli asılılıqlar əlavə etməyə ehtiyac qalmır! Golang dünyasında vəziyyət fərqlidir, çünki AWS Lambda tərtib edilmiş ikili faylların yüklənməsini tələb edir. AWS Lambda Layers-dən necə faydalana bilərik? Cavab sadədir - Golang plaginləri ilə modul tətbiqetmə yaradın!

Golang plaginləri - modul tətbiqetmə yaratmağın bir yolu

Golang Plugins, Go1.8-də yayımlanan, paylaşılan kitabxanaları (. Belə faylları) dinamik şəkildə yükləməyə imkan verən bir xüsusiyyətdir. Kodunuzun bir hissəsini ayrı kitabxanaya ixrac etmək və ya başqasının yaratdığı və tərtib etdiyi plagini istifadə etmək seçiminiz var. Bununla yanaşı, bəzi məhdudiyyətlərin olması ürəkaçandır:

  • Eklentiniz tək bir əsas modul olmalıdır,
  • Yalnız ELF işarələri kimi ixrac olunan funksiyaları və dəyişənləri yükləyə bilərsiniz.
  • Statik yazma səbəbindən hər yüklənmiş simvolu düzgün tipə çevirməlisiniz. Ən pis ssenaridə kodunuzda düzgün interfeysi təyin etməlisiniz,
  • Yalnız Linux və MacOS-da işləyir. Şəxsən mən bunu bir dezavantaj kimi görmürəm :)

İlk plagininizi yaradın və sınayın

İndi ilk plaginimizi yaradaq. Nümunə olaraq simli şifrələmə üçün sadə bir modul yaradacağıq. Əsaslara qayıdaq və iki sadə şifrələmə alqoritmini tətbiq edək - Ceasar və Verman.

  • Sezar şifrəsi, Julius Ceases tərəfindən ilk dəfə istifadə edilən alqoritmdir. Mətndəki hər bir hərfin göstərilən yer sayını dəyişdirir. Məsələn, qolang sözünü düymə 4 ilə şifrələmək istəyirsinizsə, ktpek alacaqsınız. Şifrənin açılması eyni şəkildə işləyir. Etməli olduğunuz hərfləri əks istiqamətdə aparmaqdır.
  • Verman şifrəsi, eyni dəyişkən fikrə əsaslanan Ceaser şifrəsinə bənzəyir. Fərq ondadır ki, hər hərfi fərqli mövqelərdə hərəkət etdirirsiniz. Mətnin şifrəsini açmaq üçün mətnin şifrələndiyi yerlərlə açara ehtiyacınız var. Məsələn, qolang sözünü [-1, 4, 7, 20, 4, -2] açarı ilə şifrələmək istəyirsinizsə, gələcək əldə edəcəksiniz.

Bu nümunənin tam tətbiqi ilə burada tanış ola bilərsiniz.

Plugin tətbiqi

Aşağıdakı hissə yuxarıda göstərilən iki alqoritmin tətbiqini ehtiva edir. Hər biri üçün mətnimizin şifrələnməsi və şifrəsinin açılması üçün iki üsul tətbiq edirik:

Gördüyünüz kimi, burada 3 fərqli simvol ixrac etdik (Golang yalnız yuxarıdakı hərflə başlayan bu identifikatorları ixrac edir):

  • EncryptCeasar - func (int, string) Ceasar alqoritmi ilə mətni şifrələyən sətir.
  • DecryptCeaser - Caeser alqoritmindən istifadə edərək mətnin kodunu açan func (int, string) simli,
  • VermanCipher - 2 metodu tətbiq edən vermanCipher tipli dəyişən: Şifrele: func (string) simli və Decrypt: func () (* simli, səhv)

Bu plagini tərtib etmək üçün aşağıdakı əmri işə salmalısınız:

go build -buildmode = plugin -o plugin / cipher.so plugin / cipher.go

Hal-hazırda xüsusi bir şey yoxdur - sadəcə bir neçə sadə funksiya yaradıldı və -buildmode = plugin arqumenti əlavə edilərək bir modul bir plagin olaraq tərtib edildi.

Plugini yükləyin və sınayın

Əyləncə tətbiqimizdə tərtib edilmiş plagini istifadə etmək istədikdə başlayır. Sadə bir nümunə yaradaq:

Əvvəlcə Golang plugin paketini idxal etməlisiniz. Yalnız iki funksiyanı ehtiva edir - birincisi paylaşılan kitabxananı yükləmək, digəri isə ixrac edilmiş bir simvolu tapmaqdır. Kitabxananızı yükləmək üçün paylaşılan eklentinizə gedən yolun və tip eklentinin qayıt dəyişəninin göstərilməli olduğu Açıq funksiyasından istifadə etməlisiniz. Kitabxana yüklənə bilmirsə (məsələn, səhv yol və ya zədələnmiş fayl), bu funksiya həll edilməsi lazım olan xətanı qaytarır.

Növbəti addım, axtarış metodundan istifadə edərək hər ixrac edilmiş simvolu yükləməkdir. Kiçik bir dezavantaj, ixrac edilən hər bir funksiyanı ayrı-ayrılıqda yükləməyinizdir. Bununla birlikdə, birdən çox funksiyanı VermanCipher simvolu ilə eyni şəkildə birləşdirə bilərsiniz. İstifadə etmək istədiyiniz bütün simvolları yüklədikdən sonra onları düzgün növə çevirməlisiniz. Golang statik olaraq yazılmış bir dildir, buna görə bu simvolları döküm olmadan istifadə etməyin başqa yolu yoxdur. Unutmayın, bəzi metodları tətbiq edən bir dəyişəni ixrac edirsinizsə, onu düzgün interfeys növünə keçirtməyiniz lazımdır (bunun üçün encryptionEngine interfeysini təyin etməli idim). \ Yeni xətt \ yeni xətt

Proqramı tərtib etmək və işə salmaq üçün aşağıdakı əmrdən istifadə edin:

getmək app.go ./app qurun

Çıxışda, şifrəli və şifrələnmiş mətni alqoritmin düzgün işlədiyini sübut kimi görməlisiniz.

AWS Lambda-dakı plagindən istifadə edin

Eklentimizi AWS Lambda-da istifadə etmək üçün tətbiqimizdə bəzi dəyişikliklər etməliyik:

  • AWS Lambda, Lambda konteynerindəki / opt qovluğundakı təbəqələri quraşdırır, ona görə də bu qovluqdan plaginimizi yükləməliyik.
  • Test hadisəmizi işləmək üçün Lambda mühərriki tərəfindən istifadə ediləcək bir işləmə funksiyası yaratmalıyıq.

Aşağıdakı hissə, Lambda tərəfindən istifadə edilmək üçün uyğunlaşdırılmış tətbiqimizi ehtiva edir:

Gördüyünüz kimi, tətbiq əvvəlki ilə çox oxşardır. Pluginimizi yüklədiyimiz qovluğu dəyişdirdik və dəyərləri yazmaq əvəzinə funksiya cavabını əlavə etdik. Golangda lambdaların yazılması haqqında daha çox məlumat üçün AWS sənədlərinə baxın.

AWS Lambda yerləşdirilməsi

AWS Lambda funksiyaları və təbəqələrini yerləşdirməyin iki yolu var. Sıxılmış bir paketi əl ilə yarada və yükləyə və ya daha asan və daha sürətli edəcək inkişaf etmiş çərçivədən istifadə edə bilərsiniz. Layihələrimin əksəriyyəti üçün serversiz çərçivədən istifadə edirəm. Buna görə də bu vasitə ilə serverless.yml sadə konfiqurasiya sənədini hazırladım:

Xidmət: cipherService frameworkVersion: "> = 1.28.0 <2.0.0" Təchizatçı: Ad: aws Runtime: go1.x
Layers: cipherLayer: Path: bin / plugin uyğun işləmə vaxtı: - go1.x
Funksiyalar: Mühərrik: İşləyici: bin / cipherEngine Paketi: İstisna et: - ./** Daxil edin: - ./bin/cipherEngine Layers: - {İstinad: CipherLayerLambdaLayer}

Lay qatında, artıq yaradılmış plug-in yolu ilə tək bir qat təyin etdik - bu Lambda funksiyası ilə birlikdə təmin edilir. Sırası həqiqətən vacib olan 5-ə qədər səviyyəni təyin edə bilərsiniz. Eyni / opt qovluğuna yerləşdirilirlər, buna görə daha çox sayda olan qat əvvəllər quraşdırılmış təbəqələrdən faylların üzərinə yaza bilər. Hər bir səviyyə üçün ən azı 2 parametr göstərməlisiniz: səviyyə mənbəyi olan qovluğa gedən yol (vəziyyətinizdə qoşma ikili faylına gedən yol) və uyğun iş vaxtlarının siyahısı.

Növbəti funksiya bölməsi həyata keçiriləcək funksiyaların siyahısını təyin etdiyiniz yerdir. Hər bir funksiya üçün ən azından tərtib olunmuş tətbiqetmənin yolunu təyin etməlisiniz. Əlavə olaraq, yuxarıda göstərilən təbəqəyə istinad edərək təbəqə parametrini təyin etməliyik. Bu, yerləşdirmə zamanı qatı avtomatik olaraq Lambda funksiyamıza əlavə edəcəkdir. Ən gülməli tərəfi budur ki, bu mənbəyə istinad etmək istəyirsinizsə, Lambda qat adınızı TitleCased-ə çevirib LambdaLayer şəkilçisi əlavə etməlisiniz. Görünən odur ki, serversiz komanda müxtəlif növ mənbələrlə bağlı münaqişəni həll etmək üçün bu şəkildə tətbiq etdi.

Serverless.yml konfiqurasiya sənədimiz hazır olan kimi ən son tətbiqimizi yığmaq, qoşmaq və yerləşdirməkdir. Bunun üçün sadə Makefile istifadə edə bilərik:

.PHONY: BuildPlugin-i təmiz bir şəkildə yerləşdirin
build: dep safe -v env GOOS = Linux go build -ldflags = "-s -w" -o bin / cipherEngine cipherEngine / main.go
buildPlugin: env GOOS = Linux go build -ldflags = "- s -w" -buildmode = Plugin -o bin / plugin / cipher.so ../plugin/cipher.go
təmiz: rm -rf ./bin ./vendor Gopkg.lock
yerləşdirmək: təmiz qurmaqPlugin qurmaq sls yerləşdirmək --verbose

Aşağıdakı əmri işə salmaqla öz funksiyanızı qurub yerləşdirə bilərsiniz:

təmin etmək

AWS Lambda cəhd edin

Daha əvvəl də qeyd edildiyi kimi, hadisəyə cavab olaraq AWS Lambda Kodu işləyir. Bununla birlikdə, heç bir hadisə tetikleyicisini konfiqurasiya etməmişik, buna görə də bizim köməyimiz olmadan çağırıla bilməzlər. Bunu Serverless Framework və ya awscli alətindən istifadə edərək əl ilə etməliyik:

sls -f funksiya adı aws lambda çağırır - funksiya adı funksiya adı çıxış faylı

Cavabda lambda funksiyamızın düzgün işlədiyini və eklentinin əlavə qatdan yükləndiyini sübut edən əvvəlki kimi eyni çıxışı görməlisiniz. İndi eyni qatı istifadə edən və ya hətta digər AWS hesabları ilə paylaşan digər funksiyalar yarada bilərsiniz.

Xülasə

Golang modullarını istifadə edərək yeni çıxarılan AWS Lambda Layers ilə necə birləşdirilə biləcəyini yoxlamaq çox əyləncəli oldu. Plagin kitabxanası həqiqətən möhtəşəmdir, ancaq məhdudiyyətləri və Golang spesifikasiyası səbəbindən yalnız müəyyən ssenarilərdə istifadə edilə bilər. Standart layihələr üzərində işləyən inkişaf etdiricilərin əksəriyyəti üçün plaginlərin tələb olunmadığını və hətta mümkün olmadığını düşünürəm. Yalnız iki səbəbi düşünə bilərəm:

  • Digər tətbiqetmələr tərəfindən istifadə edilə bilən mürəkkəb alqoritmlərin tətbiqi, məs. Video kodlaşdırma və ya şifrələmə alqoritmləri.
  • Kodu yayımlamadan alqoritminizi başqaları ilə paylaşın.