Po ndërtojmë një serverless mbi bazën e Fn

Po ndërtojmë një serverless mbi bazën e Fn

Computimi pa serverĂ« — Ă«shtĂ« njĂ« nga tendencat mĂ« tĂ« dukshme nĂ« computingun cloud. Parimi kryesor i funksionimit Ă«shtĂ« se infrastruktura Ă«shtĂ« pĂ«rgjegjĂ«si e ofruesve tĂ« shĂ«rbimeve dhe jo e DevOps-Ă«ve. Zgjerimi i resurseve pĂ«rshtatet automatikisht me ngarkesĂ«n dhe ka njĂ« shpejtĂ«si tĂ« lartĂ« ndryshimi.

Një karakteristikë tjetër e zakonshme është tendenca për minimizimin dhe fokusimin e kodit, prandaj computingun pa serverë ndonjëherë e quajnë "funksion si shërbim" (FaaS).

Ofruesi i parë historik i shërbimeve cloud, që ofroi FaaS me AWS Lambda, ishte Amazon, nga ku erdhi ky emër. Ofrues të tjerë të shërbimeve cloud gjithashtu ofrojnë analoge:

  • Cloud Functions nga Google
  • Azure Functions nga Microsoft

Të gjithë këta ofrues japin computing pa serverë, zgjerim automatik dhe pagese vetëm për burimet e përdorura realisht, por ata lidhin klientët me produktin e tyre pronar. Megjithatë, ekzistojnë alternativa falas me kod të hapur për krijimin e computingut pa serverë. Duhet thënë:

  • Platforma Apache OpenWhisk, e zhvilluar nga inkubatori IBM,
  • Spring Cloud Functions, si pjesĂ« e njĂ« ekosisteme mjaft tĂ« pasur tĂ« Spring Framework, e cila gjithashtu mund tĂ« pĂ«rdoret si njĂ« fasadĂ« pĂ«r AWS Lambda, Azure Functions dhe OpenWhisk,
  • Projekti Fn, mbĂ«shtetur nga Oracle.

Të gjitha këto janë plotësisht të pavarura nga cloud, që do të thotë se instalohen në çdo cloud, duke përfshirë cloud-in tuaj personal, publik ose privat, dhe natyrisht në Exoscale.

Si është ndërtuar projekti Fn

Fn është plotësisht i bazuar në Docker, përbëhet nga dy komponentë kryesorë:

  • CLI e programit, e dizajnuar pĂ«r tĂ« menaxhuar tĂ« gjitha aspektet e infrastrukturĂ«s Fn dhe pĂ«r tu ndĂ«rvepruar me serverin Fn,
  • NĂ« vetĂ« serverin Fn, njĂ« aplikacion i zakonshĂ«m, i paketuar nĂ« njĂ« kontejner pĂ«r Docker.

Funksionet që zhvillohen në Fn gjithashtu ekzekutohen në kontejnerë të veçantë, duke lejuar mbështetje për shumë gjuhë programimi, për shembull... Clojure!

Argumentet e funksioneve dĂ«rgohen nĂ« hyrjen standarde (STDIN), rezultatet shkruhen nĂ« daljen standarde (STDOUT). NĂ«se argumentet ose vlerat e kthyer nuk janĂ« vlera tĂ« thjeshta (p.sh., objekt JSON) — ato mund tĂ« konvertohen pĂ«rmes njĂ« shtrese abstarximi qĂ« ofrohet nga vetĂ« Fn si njĂ« paketĂ« zhvillimi funksionesh (FDK).

Për lehtësi, ofrohen grupe të integruar modelesh që lehtësojnë zhvillimin e FaaS në një gamë të gjerë gjuhësh dhe versionesh të tyre (Go, versionet e ndryshme të Java, Python, etj.).

Krijimi i FaaS është i thjeshtë, duke ndjekur këtë skemë:

  • ZhvillojmĂ« funksionin me ndihmĂ«n e CLI Fn: krijohet njĂ« skedar konfigurimi aplikacioni pĂ«r Fn, i bazuar nĂ« modelin e zgjedhur.
  • Nisemi me funksionin tonĂ«, pĂ«rsĂ«ri me ndihmĂ«n e CLI Fn: imazhi i kontejnerit ruhen nĂ« njĂ« depo, pas sĂ« cilĂ«s serveri njoftohet pĂ«r ekzistencĂ«n dhe vendndodhjen e kĂ«tij imazhi.

Po ndërtojmë një serverless mbi bazën e Fn
Parimi i dorëzimit të funksioneve në Fn

Instalimi dhe testimi lokal i funksioneve pa server

Le të fillojmë instalimin e Fn në makinën lokale. Së pari, instalohet Docker, siç kërkohet nga Fn. Supozohet që jemi në Debian/Ubuntu:

$ sudo apt-get update
$ sudo apt-get install docker.io

Ose përdorni menaxherin e paketave/ndërtimin e Docker sipas sistemit tuaj. Pastaj mund të kaloni direkt në instalimin e Fn CLI. Për shembull, me ndihmën e curl:

$ curl -LSs https://raw.githubusercontent.com/fnproject/cli/master/install | sh

Nëse punoni në OSX me Homebrew të instaluar, mund të shkoni një rrugë tjetër:

$ brew install fn

==> Po shkarkon https://homebrew.bintray.com/bottles/fn-0.5.8.high_sierra.bottle.tar.gz
==> Po shkarkon nga https://akamai.bintray.com/b1/b1767fb00e2e69fd9da73427d0926b1d1d0003622f7ddc0dd3a899b2894781ff?__gda__=exp=1538038849~hmac=c702c9335e7785fcbacad1f29afa61244d02f2eebb
######################################################################## 100.0%
==> Po derdhëm fn-0.5.8.high_sierra.bottle.tar.gz
  /usr/local/Cellar/fn/0.5.8: 5 skedarë, 16.7MB

Tani gjithçka është gati për nisjen fillestare të funksionit tonë duke përdorur CLI. Për lehtësi, do të përdorim ambientin e integruar për ekzekutim, për shembull Node:

$ fn init --runtime node --trigger http hellonode

Krijimi i funksionit në: /hellonode
Boilerplate-i i funksionit është krijuar.
func.yaml është krijuar.

Do të krijohet një katalog i ri hellonode për zhvillimin e mëtejshëm të funksionit tonë Fn me disa skedarë konfigurimi thelbësorë. Brenda katalogut të sapokrijuar mund të krijoni aplikacionin tuaj, duke ndjekur standardet e gjuhës ose ambientit të ekzekutimit të zgjedhur nga ju:

# ĐšĐ°Ń‚Đ°Đ»ĐŸĐł с 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 krijon strukturën fillestare të projektit, krijon skedarin func.yaml, i cili përmban instalimet e nevojshme për Fn, dhe vendos modelin për kodin në gjuhën që keni zgjedhur.

Në rastin e ambientit të ekzekutimit Node, kjo do të thotë:

$ 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}
})

Tani do ta verifikojmë shpejt funksionin tonë në mënyrë lokale, për të parë si funksionon gjithçka.

Së pari ne do të nisnim serverin Fn. Siç u tha më parë, serveri Fn është një konteiner Docker, kështu që pas nisjes, ai do të shkojë dhe do të marrë imazhin nga regjistri Docker.

$ fn start -d                    # nisim serverin lokal në sfond

Nuk është gjetur imazhi 'fnproject/fnserver:latest' lokalmente
latest: Po tërheq nga fnproject/fnserver
ff3a5c916c92: Tërheqja përfundoi
1a649ea86bca: Tërheqja përfundoi
ce35f4d5f86a: Tërheqja përfundoi

...

Statusi: Imazhi më i ri u shkarkua për fnproject/fnserver:latest
668ce9ac0ed8d7cd59da49228bda62464e01bff2c0c60079542d24ac6070f8e5

Për të nisur funksionin tonë, ai duhet "të lëshohet". Për këtë kërkohet emri i aplikacionit: në Fn të gjitha aplikacionet duhet të specifikohen në formën e hapësirave të emrave për funksionet e lidhura.

Fn CLI do të kërkojë skedarin func.yaml në katalogun aktual, i cili do të përdoret për konfigurimin e funksionit. Pra, së pari duhet të kalojmë në katalogun tonë hellonode.

$ cd hellonode
$ fn deploy --app fnexo --local  # lëshojmë funksionin lokalisht, emri i aplikacionit - fnexo.
                                 # parametrat lokal nuk e ngarkon imazhin në regjistrin e distancuar,
                                 # duke e nisur atë direkt

Duke vendosur hellonode në aplikacionin: fnexo
Rritur në versionin 0.0.2
Duke ndërtuar imazhin nfrankel/hellonode:0.0.3 .
Duke përditësuar funksionin hellonode duke përdorur imazhin nfrankel/hellonode:0.0.3...
Suksesshëm u krijua aplikacioni: fnexo
Suksesshëm u krijua funksioni: hellonode me nfrankel/hellonode:0.0.3
Suksesshëm u krijua trigger: hellonode-trigger

Siç mund të shihni nga rezultati i komandës, krijohet një imazh i ri kontenieri për Docker, i cili përmban funksionin tonë. Funksioni është gati për t'u thirrur, dhe ne kemi dy mënyra për ta bërë këtë:

  • duke pĂ«rdorur komandĂ«n Fn invoke
  • duke e thirrur drejtpĂ«rdrejt pĂ«rmes http

Thirrja invoke nëpërmjet Fn thjesht imiton funksionimin përmes HTTP për teste, që është e përshtatshme për kontroll të shpejtë:

$ fn invoke fnexo hellonode      # thërrasim funksionin hellonode të aplikacionit fnexo

{"message":"Hello World"}

Për të thirrur funksionin drejtpërdrejt, duhet të njohësh URL-në e plotë:

$ curl http://localhost:8080/t/fnexo/hellonode-trigger

{"message":"Hello World"}

Serveri Fn ofron funksionet e tij përmes portit 8080, dhe, siç duket, URL-ja e funksionit përputhet me skemën t/app/function, por jo plotësisht. Përmes HTTP, funksioni nuk thirret drejtpërdrejt, por përmes asaj që quhet trigger, i cili sipas emrit të tij "niçkë" thirrjen e funksionit. Triggers përcaktohen në `func.yml projekti:

schema_version: 20180708
name: hellonode
version: 0.0.3
runtime: node
entrypoint: node func.js
format: json
triggers:
- name: hellonode-trigger
  type: http
  source: /hellonode-trigger    # URL e trigger-it

Mund të ndryshojmë emrin e trigger-it për ta përshtatur me emrin e funksionit, kjo do ta thjeshtojë gjithçka:

triggers:
- name: hellonode-trigger
  type: http
  source: /hellonode    # përputhet me emrin e funksionit

Pastaj e nisim përsëri shpërndarjen e funksionit dhe e thërrasim atë nga trigger-i i ri:

$ fn deploy --app fnexo hellonode --local
$ curl http://localhost:8080/t/fnexo/hellonode

{"message":"Hello World"}

Gjithçka funksionon! ËshtĂ« koha tĂ« kalojmĂ« nĂ« eksperimente tĂ« natyrshme dhe tĂ« publikojmĂ« FaaS-in tonĂ« nĂ« server!

Instalimi i shërbimeve të funksioneve pa server në infrastrukturën tuaj.

Le tĂ« instalojmĂ« shpejt njĂ« makinĂ« virtuale duke pĂ«rdorur CLI Exoscale. NĂ«se nuk e keni konfiguruar akoma — mund tĂ« pĂ«rdorni udhĂ«zimin tonĂ« pĂ«r fillimin e shpejtĂ«.. Ky Ă«shtĂ« njĂ« mjet i shkĂ«lqyer qĂ« do tĂ« rrisĂ« edhe mĂ« shumĂ« produktivitetin tuaj. Mos harroni tĂ« konfiguroni njĂ« rregull pĂ«r hapjen e portit 8080 nĂ« Grupi i SigurisĂ«! Komandat nĂ« vijim do tĂ« nisin njĂ« makinĂ« virtuale tĂ« pastĂ«r, tĂ« gatshme pĂ«r tĂ« pranuar funksionet tona:

$ exo firewall create fn-securitygroup
$ exo firewall add fn-securitygroup ssh --my-ip
$ exo firewall add fn-securitygroup -p tcp -P 8080-8080 -c 0.0.0.0/0
$ exo vm create fn-server -s fn-securitygroup

Pastaj mund të conectoheni përmes ssh në makinën virtuale dhe të instaloni serverin e largët Fn:

$ exo ssh fn-server

Autenticiteti i hostit '185.19.30.175 (185.19.30.175)' nuk mund të krijohet.
Fingerprint-i i çelësit ECDSA është SHA256:uaCKRYeX4cvim+Gr8StdPvIQ7eQgPuOKdnj5WI3gI9Q.
Jeni të sigurt që dëshironi të vazhdoni me konektimin (po/jo)? po
Kujdes: Shtuar përherë '185.19.30.175' (ECDSA) në listën e hosteve të njohur.
Mirë se vini në Ubuntu 18.04 LTS (GNU/Linux 4.15.0-20-generic x86_64)

Pastaj instaloni Docker dhe serverin Fn po ashtu siç është bërë në makinën lokale, filloni serverin:

$ sudo apt-get update
$ sudo apt-get install docker.io
$ sudo systemctl start docker
$ curl -LSs https://raw.githubusercontent.com/fnproject/cli/master/install | sh
$ sudo fn start

...

    ______
   / ____/___
  / /_  / __ 
 / __/ / / / / 
/_/   /_/ /_/
    v0.3.643

Fn është gati për të pranuar funksione! Për transmetimin e funksioneve në serverin e largët do të përdorim komandën deploy nga kompjuteri lokal, duke e anashkaluar flagun --local.

Përveç kësaj, Fn kërkon specifikimin e vendndodhjes së serverit Fn dhe regjistrit të Docker. Këto parametra mund të vendosen përmes variablave të mjedisit FN_API_URL dhe FN_REGISTRY përkatësisht, por ofrohet një mënyrë më të lehtë për menaxhimin e krijimit dhe administratës së konfigurimeve për vendosjen.

Në terminologjinë e Fn, konfigurimi për vendosjen quhet context. Komanda në vazhdim do të krijojë kontekstin:

$ fn create context exoscale --provider default --api-url http://185.19.30.175:8080 --registry nfrankel

Mund ta shihni kontekstin e disponueshëm ashtu:

$ fn list contexts

CURRENT NAME      PROVIDER      API URL                      REGISTRY
    default       default       http://localhost:8080/
    exoscale      default       http://185.19.30.175:8080    nfrankel

Dhe të kaloni në kontekstin që sapo u krijua ashtu:

 $ fn use context exoscale

Tani po përdoret konteksti: exoscale

Duke kĂ«tij vendi, funksioni Fn do tĂ« ngarkojĂ« imazhet Docker duke pĂ«rdorur llogarinĂ« e zgjedhur nĂ« DockerHub (nĂ« rastin tim — nfrankel), pas tĂ« cilĂ«s do tĂ« njoftojĂ« serverin e largĂ«t (nĂ« kĂ«tĂ« shembull — http://185.19.30.175:8080) pĂ«r vendndodhjen dhe versionin e imazhit mĂ« tĂ« fundit qĂ« pĂ«rmban funksionin tuaj.

$ fn deploy --app fnexo .   # ekzekutohet në makinën lokale nga katalogu hellonode

Duke vendosur funksionin në: /.
Duke vendosur hellonode në aplikacionin: fnexo
Rritur në versionin 0.0.5
Duke ndërtuar imazhin nfrankel/hellonode:0.0.5 .

Finalmente:

$ curl http://185.19.30.175:8080/t/fnexo/hellonode

{"message":"Përshëndetje Botë"}

Po ndërtojmë një serverless mbi bazën e Fn
Cikli i jetës së funksionit në llogaritjet pa serverë me bazë Fn

Avantazhet e llogaritjeve pa serverë në infrastrukturat tuaja

Llogaritjet pa serverë janë një zgjidhje e përshtatshme për implementimin e shpejtë të pjesëve të pavarura të aplikacionit që bashkëveprojnë me aplikacione më të ndërlikuara ose mikroshërbime.

Shpesh, kjo lidhet me kostot e fshehura të bllokimit me ofruesin e zgjedhur, që, në varësi të rastit të përdorimit dhe shkallës, mund të çojë në kosto më të larta dhe në një reduktim të fleksibilitetit në të ardhmen.

Arkitekturat shumë-shërbim dhe hibrid gjithashtu vuajnë në këtë rast, pasi mund të ndodhë që dëshira për të përdorur llogaritjet pa serverë, por për shkak të politikës së kompanisë, kjo mund të jetë e pamundur.

Fn është mjaft e thjeshtë në përdorim, mund të ofrojë një ndërfaqe të ngjashme me FaaS, me pak të meta. Ajo eliminon çdo bllokim të ofruesit, mund ta instaloni lokalmente ose në çdo ofrues të zgjidhjeve të cloud që preferoni. Gjithashtu, ka liri në zgjedhjen e gjuhës së programimit.

Në këtë artikull paraqiten vetëm themeli i Fn, por krijimi i një ambienti ekzekutues të veçantë është mjaft i thjeshtë, dhe struktura e përgjithshme mund të shtrihet më gjerë duke përdorur balancuesin e ngarkesës Fn, ose duke vendosur Fn pas një proxy për mbrojtje.

Burimi: habr.com

Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster