{"id":52562,"date":"2019-11-11T00:00:00","date_gmt":"2019-11-10T21:00:00","guid":{"rendered":"https:\/\/prohoster.info\/blog\/blog_prohoster\/stroim-sobstvennyj-serverless-na-osnove-fn"},"modified":"2020-02-18T14:00:19","modified_gmt":"2020-02-18T11:00:19","slug":"stroim-sobstvennyj-serverless-na-osnove-fn","status":"publish","type":"post","link":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/stroim-sobstvennyj-serverless-na-osnove-fn","title":{"rendered":"Construim propriul serverless pe baza Fn","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Construim propriul serverless pe baza Fn\" src=\"\/wp-content\/uploads\/2019\/11\/e24cdf9b43a3323d617f33b2c1b44e51.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%91%D0%B5%D1%81%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%BD%D1%8B%D0%B5_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F\">Calculatoare f\u0103r\u0103 server<\/a><\/noindex> \u2014 una dintre cele mai vizibile tendin\u021be \u00een calculul cloud. Principiul de baz\u0103 este c\u0103 infrastructura nu reprezint\u0103 o preocupare pentru DevOps, ci pentru furnizorul de servicii. Scalarea resurselor se ajusteaz\u0103 automat \u00een func\u021bie de sarcin\u0103 \u0219i are o vitez\u0103 mare de schimbare.<\/p>\n<p><\/p>\n<p>O alt\u0103 caracteristic\u0103 comun\u0103 este tendin\u021ba de a minimiza \u0219i de a se concentra pe cod, astfel c\u0103 computa\u021bia f\u0103r\u0103 server este uneori denumit\u0103 \u201efunc\u021bie ca serviciu\u201d (FaaS).<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Furnizorul de servicii cloud care a oferit pentru prima dat\u0103 FaaS cu AWS Lambda a fost Amazon, de unde provine \u0219i acest nume. Alte furnizori de servicii cloud ofer\u0103, de asemenea, echivalente:<\/p>\n<p><\/p>\n<ul>\n<li>Cloud Functions de la Google<\/li>\n<li>Azure Functions de la Microsoft<\/li>\n<\/ul>\n<p><\/p>\n<p>Toate aceste companii ofer\u0103 calculatoare f\u0103r\u0103 server, scalare automat\u0103 \u0219i plat\u0103 doar pentru resursele efectiv utilizate, \u00eens\u0103 acestea leag\u0103 clien\u021bii de produsul lor proprietar. Cu toate acestea, exist\u0103 alternative gratuite \u0219i open-source pentru organizarea calculului f\u0103r\u0103 server. Este important de men\u021bionat:<\/p>\n<p><\/p>\n<ul>\n<li>Platforma <noindex><a rel=\"nofollow\" href=\"https:\/\/openwhisk.apache.org\/\">Apache OpenWhisk<\/a><\/noindex>, dezvoltat\u0103 \u00een incubator de IBM,<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.spring.io\/spring-cloud-function\/\">Spring Cloud Functions<\/a><\/noindex>, ca parte a unei ecosisteme destul de bogate a Spring Framework, care poate fi folosit\u0103 \u0219i ca un fa\u021bad\u0103 pentru AWS Lambda, Azure Functions \u0219i OpenWhisk,<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/fnproject\">Proiectul Fn<\/a><\/noindex>, sus\u021binut de Oracle.<\/li>\n<\/ul>\n<p><\/p>\n<p>Toate acestea sunt complet independente de cloud, adic\u0103 se instaleaz\u0103 \u00een orice cloud, inclusiv cel propriu, public sau privat, \u0219i bine\u00een\u021beles \u00een Exoscale.<\/p>\n<p><\/p>\n<h2 id=\"kak-proekt-fn-ustroen\">Cum este structurat proiectul Fn<\/h2>\n<p><\/p>\n<p>Fn se bazeaz\u0103 pe Docker, const\u00e2nd din dou\u0103 componente principale:<\/p>\n<p><\/p>\n<ul>\n<li>CLI-ul programului, destinat gestion\u0103rii tuturor aspectelor infrastructurii Fn \u0219i interac\u021bion\u0103rii cu serverul Fn,<\/li>\n<li>Serverul Fn propriu-zis, o aplica\u021bie obi\u0219nuit\u0103, ambalat\u0103 \u00eentr-un container Docker.<\/li>\n<\/ul>\n<p><\/p>\n<p>Func\u021biile desf\u0103\u0219urate \u00een Fn sunt, de asemenea, executate \u00een containere separate, ceea ce permite suportul pentru o varietate mare de limbaje de programare, cum ar fi\u2026 Clojure!<\/p>\n<p><\/p>\n<p>Argumentele func\u021biilor sunt transmise la standard input (STDIN), iar rezultatele sunt scrise la standard output (STDOUT). Dac\u0103 argumentele sau valorile returnate nu sunt valori simple (de exemplu, un obiect JSON) \u2014 acestea pot fi transformate folosind un strat de abstractizare furnizat de Fn sub forma unui kit de dezvoltare a func\u021biilor (FDK).<\/p>\n<p><\/p>\n<p>Pentru comoditate, sunt disponibile seturi de \u0219abloane integrate care faciliteaz\u0103 desf\u0103\u0219urarea FaaS \u00eentr-o list\u0103 extins\u0103 de diferite limbaje \u0219i versiunile acestora (Go, diverse versiuni Java, Python etc.).<\/p>\n<p><\/p>\n<p>Crearea FaaS este simpl\u0103, urm\u00e2nd acest plan:<\/p>\n<p><\/p>\n<ul>\n<li>Desf\u0103\u0219ur\u0103m func\u021bia cu ajutorul CLI Fn: se creeaz\u0103 un fi\u0219ier de configurare a aplica\u021biei pentru Fn, bazat pe \u0219ablonul ales.<\/li>\n<li>Desf\u0103\u0219ur\u0103m func\u021bia proprie, de asemenea cu ajutorul CLI Fn: imaginea containerului este plasat\u0103 \u00eentr-un anumit depozit, dup\u0103 care serverul este notificat despre existen\u021ba \u0219i amplasarea acestei imagini.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Construim propriul serverless pe baza Fn\" src=\"\/wp-content\/uploads\/2019\/11\/5add8b58c80e976cd61a156fdd0fba11.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>Principiul livr\u0103rii func\u021biilor \u00een Fn<\/em><\/p>\n<p><\/p>\n<h2 id=\"lokalnaya-ustanovka-i-testirovanie-besservernyh-funkciy\">Instalare \u0219i testare local\u0103 a func\u021biilor f\u0103r\u0103 server<\/h2>\n<p><\/p>\n<p>S\u0103 \u00eencepem instalarea Fn pe ma\u0219ina local\u0103. Mai \u00eent\u00e2i se instaleaz\u0103 Docker, a\u0219a cum cere Fn. Se presupune c\u0103 suntem pe Debian\/Ubuntu:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ sudo apt-get update\n$ sudo apt-get install docker.io<\/code><\/pre>\n<p><\/p>\n<p>Sau folosi\u021bi managerul de pachete\/compilarea Docker conform sistemului dumneavoastr\u0103. Apoi, putem trece direct la instalarea Fn CLI. De exemplu, cu ajutorul curl:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ curl -LSs https:\/\/raw.githubusercontent.com\/fnproject\/cli\/master\/install | sh<\/code><\/pre>\n<p><\/p>\n<p>Dac\u0103 lucra\u021bi pe OSX cu Homebrew instalat, pute\u021bi merge pe o alt\u0103 cale:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ brew install fn\n\n==&gt; Desc\u0103rcare https:\/\/homebrew.bintray.com\/bottles\/fn-0.5.8.high_sierra.bottle.tar.gz\n==&gt; Desc\u0103rcare de la https:\/\/akamai.bintray.com\/b1\/b1767fb00e2e69fd9da73427d0926b1d1d0003622f7ddc0dd3a899b2894781ff?__gda__=exp=1538038849~hmac=c702c9335e7785fcbacad1f29afa61244d02f2eebb\n######################################################################## 100.0%\n==&gt; Turnare fn-0.5.8.high_sierra.bottle.tar.gz\n  \/usr\/local\/Cellar\/fn\/0.5.8: 5 fi\u0219iere, 16.7MB<\/code><\/pre>\n<p><\/p>\n<p>Acum totul este gata pentru desf\u0103\u0219urarea ini\u021bial\u0103 a func\u021biei noastre folosind CLI. Pentru simplitate, vom folosi mediu integrat de rulare, de exemplu Node:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ fn init --runtime node --trigger http hellonode\n\nCrearea func\u021biei la: \/hellonode\nStructura de baz\u0103 a func\u021biei generat\u0103.\nfunc.yaml creat.<\/code><\/pre>\n<p><\/p>\n<p>Va fi creat un nou director <code>hellonode<\/code> pentru dezvoltarea ulterioar\u0103 a func\u021biei noastre Fn cu unele fi\u0219iere de configurare esen\u021biale. \u00cen interiorul directorului nou creat, pute\u021bi crea aplica\u021bia dumneavoastr\u0103, conform standardelor limbajului sau mediului de execu\u021bie ales:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\"># \u041a\u0430\u0442\u0430\u043b\u043e\u0433 \u0441 node \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:\n\n   hellonode\n   \u251c\u2500\u2500 func.js\n   \u251c\u2500\u2500 func.yaml\n   \u2514\u2500\u2500 package.json\n\n# \u0421\u0432\u0435\u0436\u0435\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 Java11 \u0442\u0430\u043a\u043e\u0435:\n\n   hellojava11\n   \u251c\u2500\u2500 func.yaml\n   \u251c\u2500\u2500 pom.xml\n   \u2514\u2500\u2500 src\n       \u251c\u2500\u2500 main\n       \u2502   \u2514\u2500\u2500 java\n       \u2502       \u2514\u2500\u2500 com\n       \u2502           \u2514\u2500\u2500 example\n       \u2502               \u2514\u2500\u2500 fn\n       \u2502                   \u2514\u2500\u2500 HelloFunction.java\n       \u2514\u2500\u2500 test\n           \u2514\u2500\u2500 java\n               \u2514\u2500\u2500 com\n                   \u2514\u2500\u2500 example\n                       \u2514\u2500\u2500 fn\n                           \u2514\u2500\u2500 HelloFunctionTest.java<\/code><\/pre>\n<p><\/p>\n<p>Fn creeaz\u0103 structura ini\u021bial\u0103 a proiectului, creeaz\u0103 fi\u0219ierul <code>func.yaml<\/code>, con\u021bin\u00e2nd set\u0103rile necesare pentru Fn, \u0219i stabile\u0219te \u0219ablonul pentru cod \u00een limbajul ales.<\/p>\n<p><\/p>\n<p>\u00cen cazul mediului de execu\u021bie Node, aceasta \u00eenseamn\u0103:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ cat hellonode\/func.js\n\nconst fdk=require('@fnproject\/fdk');\n\nfdk.handle(function(input){\n  let name = 'World';\n  if (input.name) {\n    name = input.name;\n  }\n  return {'message': 'Hello ' + name}\n})<\/code><\/pre>\n<p><\/p>\n<p>Acum vom verifica rapid func\u021bia noastr\u0103 local, pentru a vedea cum func\u021bioneaz\u0103 totul.<\/p>\n<p><\/p>\n<p>Pentru \u00eenceput, vom porni serverul Fn. A\u0219a cum a fost men\u021bionat, serverul Fn este un container Docker, prin urmare, dup\u0103 lansare, acesta va merge \u0219i va prelua imaginea din registrul Docker.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ fn start -d                    # pornim serverul local \u00een fundal\n\nUnable to find image 'fnproject\/fnserver:latest' locally\nlatest: Pulling from fnproject\/fnserver\nff3a5c916c92: Pull complete\n1a649ea86bca: Pull complete\nce35f4d5f86a: Pull complete\n\n...\n\nStatus: Downloaded newer image for fnproject\/fnserver:latest\n668ce9ac0ed8d7cd59da49228bda62464e01bff2c0c60079542d24ac6070f8e5<\/code><\/pre>\n<p><\/p>\n<p>Pentru a lansa func\u021bia noastr\u0103, trebuie s\u0103 o \u201epublic\u0103m\u201d. Pentru aceasta, este necesar <code>numele aplica\u021biei<\/code>: \u00een Fn, toate aplica\u021biile trebuie s\u0103 fie definite sub form\u0103 de spa\u021bii de nume pentru func\u021biile asociate.<\/p>\n<p><\/p>\n<p>Fn CLI va c\u0103uta un fi\u0219ier <code>func.yaml<\/code> \u00een directorul curent, care va fi utilizat pentru configurarea func\u021biei. A\u0219adar, mai \u00eent\u00e2i trebuie s\u0103 ne mut\u0103m \u00een directorul nostru <code>hellonode<\/code>.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ cd hellonode\n$ fn deploy --app fnexo --local  # public\u0103m func\u021bia local, numele aplica\u021biei - fnexo.\n                                 # parametrul local nu \u00eencarc\u0103 imaginea \u00een registrul remote,\n                                 # o ruleaz\u0103 direct\n\nDeploying hellonode to app: fnexo\nBumped to version 0.0.2\nBuilding image nfrankel\/hellonode:0.0.3 .\nUpdating function hellonode using image nfrankel\/hellonode:0.0.3...\nSuccessfully created app:  fnexo\nSuccessfully created function: hellonode with nfrankel\/hellonode:0.0.3\nSuccessfully created trigger: hellonode-trigger<\/code><\/pre>\n<p><\/p>\n<p>Dup\u0103 cum se poate observa din ie\u0219irea comenzii, se creeaz\u0103 o nou\u0103 imagine a containerului Docker care con\u021bine func\u021bia noastr\u0103. Func\u021bia este preg\u0103tit\u0103 pentru apel, iar noi avem dou\u0103 modalit\u0103\u021bi de a face acest lucru:<\/p>\n<p><\/p>\n<ul>\n<li>folosind comanda Fn <code>invoke<\/code><\/li>\n<li>apel\u00e2nd direct prin <code>http<\/code><\/li>\n<\/ul>\n<p><\/p>\n<p>Apel <code>invoke<\/code> prin Fn emuleaz\u0103 pur \u0219i simplu func\u021bia HTTP pentru teste, ceea ce este util pentru verific\u0103ri rapide:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ fn invoke fnexo hellonode      # apel\u0103m func\u021bia hellonode a aplica\u021biei fnexo\n\n{\"message\":\"Hello World\"}<\/code><\/pre>\n<p><\/p>\n<p>Pentru a apela func\u021bia direct, trebuie s\u0103 cunoa\u0219tem URL-ul complet:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ curl http:\/\/localhost:8080\/t\/fnexo\/hellonode-trigger\n\n{\"message\":\"Hello World\"}<\/code><\/pre>\n<p><\/p>\n<p>Serverul Fn ofer\u0103 func\u021biile sale prin intermediul portului 8080, iar, dup\u0103 cum se pare, URL-ul func\u021biei corespunde schemei <code>t\/app\/function<\/code>, dar nu complet. Prin HTTP, func\u021bia nu este apelat\u0103 direct, ci prin a\u0219a-numitul trigger, care, conform numelui s\u0103u, \u201elanseaz\u0103\u201d apelul func\u021biei. Triggerele sunt definite \u00een <code>`func.yml<\/code> proiectul:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">schema_version: 20180708\nname: hellonode\nversion: 0.0.3\nruntime: node\nentrypoint: node func.js\nformat: json\ntriggers:\n- name: hellonode-trigger\n  type: http\n  source: \/hellonode-trigger    # URL-ul triggerului<\/code><\/pre>\n<p><\/p>\n<p>Putem schimba numele triggerului pentru a corespunde numelui func\u021biei, ceea ce va simplifica totul:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">triggers:\n- name: hellonode-trigger\n  type: http\n  source: \/hellonode    # se potrive\u0219te cu numele func\u021biei<\/code><\/pre>\n<p><\/p>\n<p>Apoi, relans\u0103m livrarea func\u021biei \u0219i o apel\u0103m din noul trigger:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ fn deploy --app fnexo hellonode --local\n$ curl http:\/\/localhost:8080\/t\/fnexo\/hellonode\n\n{\"message\":\"Hello World\"}<\/code><\/pre>\n<p><\/p>\n<p>Totul func\u021bioneaz\u0103! Este momentul perfect s\u0103 trecem la experimentele reale \u0219i s\u0103 public\u0103m FaaS-ul nostru pe server!<\/p>\n<p><\/p>\n<h2 id=\"ustanovka-servisov-besservernyh-funkciy-na-sobstvennoy-infrastrukture\">Instalarea serviciilor func\u021biilor serverless pe propria infrastructur\u0103<\/h2>\n<p><\/p>\n<p>Hai s\u0103 instal\u0103m rapid o ma\u0219in\u0103 virtual\u0103 folosind CLI Exoscale. Dac\u0103 nu a\u021bi configurat-o \u00eenc\u0103 \u2014 pute\u021bi folosi <noindex><a rel=\"nofollow\" href=\"https:\/\/community.exoscale.com\/documentation\/tools\/exoscale-command-line-interface\/\">ghidul nostru pentru un start rapid<\/a><\/noindex>. Este un instrument genial care va cre\u0219te \u0219i mai mult productivitatea dumneavoastr\u0103. <strong>Nu uita\u021bi s\u0103 configura\u021bi o regul\u0103 pentru a deschide portul 8080 \u00een Security Group!<\/strong> Urm\u0103toarele comenzi vor lansa o ma\u0219in\u0103 virtual\u0103 curat\u0103, gata pentru g\u0103zduirea func\u021biilor noastre:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ exo firewall create fn-securitygroup\n$ exo firewall add fn-securitygroup ssh --my-ip\n$ exo firewall add fn-securitygroup -p tcp -P 8080-8080 -c 0.0.0.0\/0\n$ exo vm create fn-server -s fn-securitygroup<\/code><\/pre>\n<p><\/p>\n<p>Apoi, pute\u021bi accesa ma\u0219ina virtual\u0103 prin ssh \u0219i instala serverul Fn:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ exo ssh fn-server\n\nThe authenticity of host '185.19.30.175 (185.19.30.175)' can't be established.\nECDSA key fingerprint is SHA256:uaCKRYeX4cvim+Gr8StdPvIQ7eQgPuOKdnj5WI3gI9Q.\nAre you sure you want to continue connecting (yes\/no)? yes\nWarning: Permanently added '185.19.30.175' (ECDSA) to the list of known hosts.\nWelcome to Ubuntu 18.04 LTS (GNU\/Linux 4.15.0-20-generic x86_64)<\/code><\/pre>\n<p><\/p>\n<p>Apoi, instal\u0103m Docker \u0219i serverul Fn la fel cum am f\u0103cut deja pe ma\u0219ina local\u0103, pornim serverul:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ sudo apt-get update\n$ sudo apt-get install docker.io\n$ sudo systemctl start docker\n$ curl -LSs https:\/\/raw.githubusercontent.com\/fnproject\/cli\/master\/install | sh\n$ sudo fn start\n\n...\n\n    ______\n   \/ ____\/___\n  \/ \/_  \/ __ \n \/ __\/ \/ \/ \/ \/ \/\n\/_\/   \/_\/ \/_\/ \n    v0.3.643<\/code><\/pre>\n<p><\/p>\n<p>Fn este preg\u0103tit s\u0103 primeasc\u0103 func\u021bii! Pentru a transmite func\u021bii c\u0103tre serverul de la distan\u021b\u0103, vom folosi comanda <code>deploy<\/code> de pe computerul local, om\u00edt\u00e2nd flag-ul <code>--local<\/code>.<\/p>\n<p><\/p>\n<p>\u00cen plus, Fn necesit\u0103 specificarea loca\u021biei serverului Fn \u0219i a registrului Docker. Aceste op\u021biuni pot fi setate prin variabilele de mediu <code>FN_API_URL<\/code> \u0219i <code>FN_REGISTRY<\/code> \u00een consecin\u021b\u0103, dar exist\u0103 \u0219i o modalitate mai convenabil\u0103 pentru gestionarea u\u0219oar\u0103 a cre\u0103rii \u0219i gestion\u0103rii configura\u021biilor pentru desf\u0103\u0219urare.<\/p>\n<p><\/p>\n<p>\u00cen termenii Fn, configura\u021bia pentru desf\u0103\u0219urare se nume\u0219te <code>context<\/code>. Comanda urm\u0103toare va crea un context:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ fn create context exoscale --provider default --api-url http:\/\/185.19.30.175:8080 --registry nfrankel<\/code><\/pre>\n<p><\/p>\n<p>Pute\u021bi vizualiza contexte disponibile astfel:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ fn list contexts\n\nCURRENT NAME      PROVIDER      API URL                      REGISTRY\n    default       default       http:\/\/localhost:8080\/\n    exoscale      default       http:\/\/185.19.30.175:8080    nfrankel\n<\/code><\/pre>\n<p><\/p>\n<p>\u0218i pentru a comuta la contextul care tocmai a fost creat, astfel:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\"> $ fn use context exoscale\n\n Acum utiliz\u0103m contextul: exoscale<\/code><\/pre>\n<p><\/p>\n<p>\u00cencep\u00e2nd de aici, livrarea func\u021biilor Fn va \u00eenc\u0103rca imagini Docker, folosind contul ales de pe DockerHub (\u00een cazul meu \u2014 <code>nfrankel<\/code>), dup\u0103 care va notifica serverul \u00eendep\u0103rtat (\u00een acest exemplu \u2014 <code>http:\/\/185.19.30.175:8080<\/code>) despre loca\u021bia \u0219i versiunea celei mai recente imagini, care con\u021bine func\u021bia dumneavoastr\u0103.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ fn deploy --app fnexo .   # se ruleaz\u0103 pe ma\u0219ina local\u0103 din directorul hellonode\n\nSe desf\u0103\u0219oar\u0103 func\u021bia la: \\\/.\nSe desf\u0103\u0219oar\u0103 hellonode la aplica\u021bia: fnexo\nS-a urcat la versiunea 0.0.5\nConstruind imaginea nfrankel\\\/hellonode:0.0.5 .<\/code><\/pre>\n<p><\/p>\n<p>\u00cen cele din urm\u0103:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ curl http:\\\/\\\/185.19.30.175:8080\\\/t\\\/fnexo\\\/hellonode\n\n{\"message\":\"Hello World\"}<\/code><\/pre>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Construim propriul serverless pe baza Fn\" src=\"\/wp-content\/uploads\/2019\/11\/51a7b88cd6bf4953740cfac937b0acc2.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>Ciclul de via\u021b\u0103 al func\u021biei \u00een calculul serverless bazat pe Fn<\/em><\/p>\n<p><\/p>\n<h2 id=\"preimuschestva-besservernyh-vychisleniy-na-svoih-moschnostyah\">Avantajele calculului serverless pe propriile resurse<\/h2>\n<p><\/p>\n<p>Calculul serverless este o solu\u021bie convenabil\u0103 pentru implementarea rapid\u0103 a p\u0103r\u021bilor independente ale aplica\u021biei, care interac\u021bioneaz\u0103 cu aplica\u021bii sau microservicii mai complexe.<\/p>\n<p><\/p>\n<p>Adesea, acest lucru este asociat cu costuri ascunse legate de furnizorul ales, ceea ce, \u00een func\u021bie de cazul de utilizare specific \u0219i de volum, poate duce la costuri mai mari \u0219i la o flexibiltate sc\u0103zut\u0103 \u00een viitor.<\/p>\n<p><\/p>\n<p>Arhitecturile multi-cloud \u0219i hibride sufer\u0103 de asemenea \u00een astfel de cazuri, deoarece se poate ajunge cu u\u0219urin\u021b\u0103 \u00een situa\u021bia \u00een care s-ar dori utilizarea calculului serverless, dar din cauza politicii de corpora\u021bie acest lucru poate fi imposibil.<\/p>\n<p><\/p>\n<p>Fn este suficient de simplu de utilizat, poate oferi aproape aceea\u0219i interfa\u021b\u0103 FaaS, cu costuri reduse. Acesta elimin\u0103 orice leg\u0103turi cu furnizorul, poate fi instalat local sau la orice furnizor de solu\u021bii cloud ales de dumneavoastr\u0103. De asemenea, exist\u0103 libertatea de a alege limbajul de programare.<\/p>\n<p><\/p>\n<p>Articolul prezint\u0103 doar elementele de baz\u0103 ale Fn, dar crearea propriului mediu de execu\u021bie este destul de simpl\u0103, iar arhitectura general\u0103 poate fi extins\u0103 folosind un echilibrator de \u00eenc\u0103rcare Fn sau situ\u00e2nd Fn \u00een spatele unui proxy pentru protec\u021bie.<\/p>\n<p>Sursa: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/southbridge\/blog\/475044\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0411\u0435\u0441\u0441\u0435\u0440\u0432\u0435\u0440\u043d\u044b\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u2014 \u043e\u0434\u043d\u0430 \u0438\u0437 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0437\u0430\u043c\u0435\u0442\u043d\u044b\u0445 \u0442\u0435\u043d\u0434\u0435\u043d\u0446\u0438\u0439 \u0432 \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f\u0445. \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u0440\u0430\u0431\u043e\u0442\u044b \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u2014 \u0437\u0430\u0431\u043e\u0442\u0430 \u043d\u0435 DevOps\u2019\u043e\u0432, \u0430 \u043f\u043e\u0441\u0442\u0430\u0432\u0449\u0438\u043a\u0430 \u0443\u0441\u043b\u0443\u0433. \u041c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u0434\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0434 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u0438 \u043e\u0431\u043b\u0430\u0434\u0430\u0435\u0442 \u0432\u044b\u0441\u043e\u043a\u043e\u0439 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c\u044e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f. \u0414\u0440\u0443\u0433\u0430\u044f \u043e\u0431\u0449\u0430\u044f \u0447\u0435\u0440\u0442\u0430 \u2014 \u0442\u0435\u043d\u0434\u0435\u043d\u0446\u0438\u044f \u043a \u043c\u0438\u043d\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u0444\u043e\u043a\u0443\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u043a\u043e\u0434\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0431\u0435\u0441\u0441\u0435\u0440\u0432\u0435\u0440\u043d\u044b\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0438\u043d\u043e\u0433\u0434\u0430 \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442 &#171;\u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043a\u0430\u043a \u0443\u0441\u043b\u0443\u0433\u0430&#187; [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-52562","post","type-post","status-publish","format-standard","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2.1 - aioseo.com -->\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/stroim-sobstvennyj-serverless-na-osnove-fn\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"ro_RO\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0421\u0442\u0440\u043e\u0438\u043c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 serverless \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 Fn | ProHoster\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/stroim-sobstvennyj-serverless-na-osnove-fn\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-11-10T21:00:00+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-02-18T11:00:19+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Construim propriul serverless bazat pe Fn | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/stroim-sobstvennyj-serverless-na-osnove-fn","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"ro_RO","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0421\u0442\u0440\u043e\u0438\u043c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 serverless \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 Fn | ProHoster","og:url":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/stroim-sobstvennyj-serverless-na-osnove-fn","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-11-10T21:00:00+00:00","article:modified_time":"2020-02-18T11:00:19+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"52562","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-24 04:03:20","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 20:41:24","updated":"2026-01-24 04:03:20","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/52562","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/comments?post=52562"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/52562\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media?parent=52562"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/categories?post=52562"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/tags?post=52562"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}