Serversiz hesablama bulud hesablamasında ən görkəmli tendensiyalardan biridir. Əsas iş prinsipi odur ki, infrastruktur DevOps-un deyil, xidmət provayderinin qayğısıdır. Resurs miqyası avtomatik olaraq yüklənməyə uyğunlaşır və yüksək dəyişiklik sürətinə malikdir.
Digər ümumi xüsusiyyət kodun minimuma endirilməsi və fokuslanması tendensiyasıdır, buna görə də serversiz hesablama bəzən xidmət kimi funksiya (FaaS) adlanır.
Tarixən, AWS Lambda ilə FaaS təklif edən ilk bulud provayderi Amazon idi, buna görə də ad. Digər bulud xidməti təminatçıları da oxşar təkliflər təklif edirlər:
Google-dan Bulud Funksiyaları
Microsoft-dan Azure Funksiyaları
Bütün bu şirkətlər serversiz hesablamalar, avtomatik miqyaslama təmin edir və yalnız həqiqətən istifadə etdiyiniz şey üçün ödəyir, lakin müştəriləri öz məhsullarında kilidləyirlər. Bununla belə, serversiz hesablamalar üçün pulsuz və açıq mənbə alternativləri var. Qeyd etmək lazımdır:
Platforma Apache OpenWhiskIBM tərəfindən inkubatorda hazırlanmış,
Bahar bulud funksiyalarıAWS Lambda, Azure Functions və OpenWhisk üçün fasad kimi də istifadə edilə bilən kifayət qədər zəngin Spring Framework ekosisteminin bir hissəsi kimi,
Onların hamısı buludlardan tamamilə müstəqildir, yəni onlar istənilən buludda, o cümlədən öz, ictimai və ya özəl, və əlbəttə ki, Exoscale-də quraşdırıla bilər.
Fn layihəsi necə işləyir
Fn tamamilə Docker-ə əsaslanır, iki əsas komponentdən ibarətdir:
Fn infrastrukturunun bütün aspektlərini idarə etmək üçün nəzərdə tutulmuş CLI proqramı və Fn serveri ilə qarşılıqlı əlaqədə,
Fn serverinin özü Docker konteynerində qablaşdırılan adi proqramdır.
Fn-də yerləşdirilmiş funksiyalar da ayrıca konteynerlərdə yerinə yetirilir ki, bu da sizə bir çox proqramlaşdırma dillərini dəstəkləməyə imkan verir, məsələn... Clojure!
Funksiya arqumentləri standart girişə (STDIN) ötürülür, nəticələr standart çıxışa (STDOUT) yazılır. Arqumentlər və ya qaytarılan dəyərlər sadə dəyərlər deyilsə (məsələn, JSON obyekti), onlar Fn-nin özü tərəfindən Funksiya İnkişafı Dəsti (FDK) şəklində təqdim olunan abstraksiya qatından istifadə etməklə çevrilə bilər.
Rahatlıq üçün, müxtəlif dillərin və onların versiyalarının (Go, Java, Python-un müxtəlif versiyaları və s.) geniş siyahısında FaaS-in yerləşdirilməsini asanlaşdırmaq üçün daxili şablon dəstləri təklif olunur.
Bu diaqrama əməl etməklə FaaS yaratmaq asandır:
Fn CLI istifadə edərək funksiyanın yerləşdirilməsi: seçilmiş şablon əsasında Fn üçün proqram konfiqurasiya faylı yaradılır.
Yenidən CLI Fn istifadə edərək öz funksiyamızı yayırıq: konteyner şəkli müəyyən bir depoya yerləşdirilir, bundan sonra serverə bu təsvirin mövcudluğu və yerləşdirilməsi barədə məlumat verilir.
Funksiyaların Fn-ə çatdırılması prinsipi
Serversiz funksiyaların yerli quraşdırılması və sınaqdan keçirilməsi
Fn-i yerli maşında quraşdırmağa başlayaq. Birincisi, Fn tələb etdiyi kimi Docker quraşdırılır. Debian/Ubuntu-da olduğumuzu fərz etsək:
Və ya sisteminizə uyğun olaraq paket meneceri/Docker quruluşundan istifadə edin. Sonra birbaşa Fn CLI-nin quraşdırılmasına keçə bilərsiniz. Məsələn, curl istifadə edərək:
$ curl -LSs https://raw.githubusercontent.com/fnproject/cli/master/install | sh
Homebrew quraşdırılmış OSX-dəsinizsə, başqa yolla gedə bilərsiniz:
İndi CLI-dən istifadə edərək funksiyamızı ilkin olaraq yerləşdirməyə hazırıq. Sadəlik üçün Node kimi daxili işə salma mühitindən istifadə edəcəyik:
$ fn init --runtime node --trigger http hellonode
Creating function at: /hellonode
Function boilerplate generated.
func.yaml created.
Yeni kataloq yaradılacaq hellonode bəzi əsas konfiqurasiya faylları ilə Fn funksiyamızı daha da inkişaf etdirmək üçün. Yeni yaradılmış kataloq daxilində siz seçdiyiniz dil və ya iş vaxtının standartlarına uyğun olaraq tətbiqinizi yarada bilərsiniz:
# Каталог с node выглядит так:
hellonode
├── func.js
├── func.yaml
└── package.json
# Свежеустановленное окружение Java11 такое:
hellojava11
├── func.yaml
├── pom.xml
└── src
├── main
│ └── java
│ └── com
│ └── example
│ └── fn
│ └── HelloFunction.java
└── test
└── java
└── com
└── example
└── fn
└── HelloFunctionTest.java
Fn ilkin layihə strukturunu yaradır, fayl yaradır func.yaml, Fn üçün lazımi parametrləri ehtiva edir və seçdiyiniz dildə kod üçün şablon təyin edir.
Node iş vaxtı vəziyyətində bu o deməkdir:
$ cat hellonode/func.js
const fdk=require('@fnproject/fdk');
fdk.handle(function(input){
let name = 'World';
if (input.name) {
name = input.name;
}
return {'message': 'Hello ' + name}
})
İndi hər şeyin necə işlədiyini görmək üçün funksiyamızı tez bir zamanda yerli olaraq test edəcəyik.
Əvvəlcə Fn serverini işə salacağıq. Artıq qeyd edildiyi kimi, Fn serveri Docker konteyneridir, ona görə də işə salındıqdan sonra o gedib Docker reyestrindən şəkli götürəcək.
$ fn start -d # запускаем локальный сервер в фоне
Unable to find image 'fnproject/fnserver:latest' locally
latest: Pulling from fnproject/fnserver
ff3a5c916c92: Pull complete
1a649ea86bca: Pull complete
ce35f4d5f86a: Pull complete
...
Status: Downloaded newer image for fnproject/fnserver:latest
668ce9ac0ed8d7cd59da49228bda62464e01bff2c0c60079542d24ac6070f8e5
Funksiyamızı işə salmaq üçün o, “çıxarılmış” olmalıdır. Bu tələb edir имя приложения: Fn-də bütün proqramlar əlaqəli funksiyalar üçün ad boşluqları kimi göstərilməlidir.
Fn CLI faylı axtaracaq func.yaml funksiyanı konfiqurasiya etmək üçün istifadə olunacaq cari kataloqda. Beləliklə, əvvəlcə kataloqumuza getməlisiniz hellonode.
$ cd hellonode
$ fn deploy --app fnexo --local # выкатываем функцию локально, имя приложения - fnexo.
# параметр local не заливает образ в удаленный реестр,
# запуская его напрямую
Deploying hellonode to app: fnexo
Bumped to version 0.0.2
Building image nfrankel/hellonode:0.0.3 .
Updating function hellonode using image nfrankel/hellonode:0.0.3...
Successfully created app: fnexo
Successfully created function: hellonode with nfrankel/hellonode:0.0.3
Successfully created trigger: hellonode-trigger
Komanda çıxışından göründüyü kimi, funksiyamızı ehtiva edən yeni Docker konteyner şəkli yaradılır. Funksiya çağırılmağa hazırdır və bunu etmək üçün iki yolumuz var:
Fn əmrindən istifadə edərək invoke
vasitəsilə birbaşa zəng http
Çağırış invoke Fn vasitəsilə o, sadəcə tez sınaq üçün əlverişli olan testlər üçün HTTP vasitəsilə işi emulyasiya edir:
Fn serveri öz funksiyalarını 8080 portunda nümayiş etdirir və funksiyanın URL-i nümunəyə uyğun görünür t/app/function, lakin tamamilə deyil. HTTP vasitəsilə funksiya birbaşa deyil, adına uyğun olaraq funksiya çağırışına “başladan” sözdə tətik vasitəsilə çağırılır. Tətiklər müəyyən edilmişdir `func.yml layihə:
Hər şey işləyir! Tam miqyaslı təcrübələrə keçməyin və FaaS-imizi serverdə dərc etməyin vaxtıdır!
Öz infrastrukturunuzda serversiz funksiya xidmətlərinin quraşdırılması
Exoscale CLI-dən istifadə edərək virtual maşını tez quraşdıraq. Hələ quraşdırmamısınızsa, istifadə edə bilərsiniz sürətli başlanğıc bələdçimiz. Bu, məhsuldarlığınızı daha da artıracaq gözəl bir vasitədir. Unutmayın ki, Təhlükəsizlik Qrupunda 8080 portunu açmaq üçün bir qayda konfiqurasiya etməlisiniz! Aşağıdakı əmrlər funksiyalarımızı qəbul etməyə hazır olan təmiz virtual maşını işə salacaq:
Sonra virtual maşına ssh-ni daxil edə və uzaq Fn serverini quraşdıra bilərsiniz:
$ exo ssh fn-server
The authenticity of host '185.19.30.175 (185.19.30.175)' can't be established.
ECDSA key fingerprint is SHA256:uaCKRYeX4cvim+Gr8StdPvIQ7eQgPuOKdnj5WI3gI9Q.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '185.19.30.175' (ECDSA) to the list of known hosts.
Welcome to Ubuntu 18.04 LTS (GNU/Linux 4.15.0-20-generic x86_64)
Sonra Docker və Fn serverini yerli maşında olduğu kimi quraşdırın, serveri işə salın:
Fn funksiyaları qəbul etməyə hazırdır! Funksiyaların uzaq bir serverə məqsədyönlü ötürülməsi üçün əmrdən istifadə edəcəyik deploy bayrağı atmaqla yerli kompüterdən --local.
Bundan əlavə, Fn sizdən Fn serverinin və Docker reyestrinin yerini təyin etməyi tələb edir. Bu seçimlər mühit dəyişənləri vasitəsilə təyin edilə bilər FN_API_URL и FN_REGISTRY müvafiq olaraq, həm də yerləşdirmə üçün konfiqurasiyaların yaradılması və idarə edilməsini asanlıqla idarə etmək üçün daha rahat üsul təklif edir.
Fn baxımından, yerləşdirmə üçün konfiqurasiya deyilir context. Aşağıdakı əmr kontekst yaradacaq:
$ fn list contexts
CURRENT NAME PROVIDER API URL REGISTRY
default default http://localhost:8080/
exoscale default http://185.19.30.175:8080 nfrankel
Və bu kimi yaradılmış kontekstə keçin:
$ fn use context exoscale
Now using context: exoscale
Bundan sonra Fn funksiyasının çatdırılması seçilmiş DockerHub hesabından istifadə edərək Docker şəkillərini endirəcək (mənim vəziyyətimdə - nfrankel) və sonra uzaq serverə bildirin (bu nümunədə - http://185.19.30.175:8080) funksiyanızı ehtiva edən ən son şəklin yeri və versiyası haqqında.
$ fn deploy --app fnexo . # выполняется на локальной машине из каталога hellonode
Deploying function at: /.
Deploying hellonode to app: fnexo
Bumped to version 0.0.5
Building image nfrankel/hellonode:0.0.5 .
Fn əsaslı serversiz hesablamada funksiyanın həyat dövrü
Öz imkanlarınızla serversiz hesablamanın üstünlükləri
Serversiz hesablama daha mürəkkəb proqramlar və ya mikroservislərlə qarşılıqlı əlaqədə olan proqramın müstəqil hissələrini tez bir zamanda həyata keçirmək üçün əlverişli həll yoludur.
Bu, çox vaxt seçilmiş satıcıya bağlanmağın gizli xərcləri ilə bağlıdır ki, bu da konkret istifadə vəziyyətindən və həcmdən asılı olaraq gələcəkdə daha yüksək xərclərə və çevikliyin azalmasına səbəb ola bilər.
Çox buludlu və hibrid bulud arxitekturaları da bu vəziyyətdə əziyyət çəkir, çünki siz serversiz hesablamadan istifadə etmək istədiyiniz vəziyyətdə özünüzü asanlıqla tapa bilərsiniz, lakin korporativ siyasətlərə görə bu mümkün olmaya bilər.
Fn istifadə etmək olduqca asandır və az yüklə demək olar ki, eyni FaaS interfeysini təmin edə bilər. O, hər hansı satıcı kilidini aradan qaldırır və yerli olaraq və ya seçdiyiniz istənilən rahat bulud həlli provayderində quraşdırıla bilər. Proqramlaşdırma dilini seçməkdə də sərbəstlik var.
Bu məqalə yalnız Fn-in əsaslarını əhatə edir, lakin öz iş vaxtınızı yaratmaq olduqca sadədir və ümumi arxitektura Fn yük balanslaşdırıcısından istifadə etməklə və ya Fn-i qorunmaq üçün proksi arxasına yerləşdirməklə daha geniş şəkildə tətbiq oluna bilər.