{"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\/lv\/blog\/administrirovanie\/stroim-sobstvennyj-serverless-na-osnove-fn","title":{"rendered":"Veidojam savu serverless risin\u0101jumu, balstoties uz Fn","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Veidojam savu serverless risin\u0101jumu, balstoties uz 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\">Serverless skait\u013co\u0161ana<\/a><\/noindex> \u2014 viena no izteikt\u0101kaj\u0101m tendenc\u0113m m\u0101ko\u0146skait\u013co\u0161an\u0101. Pamata darb\u012bbas princips ir t\u0101ds, ka infrastrukt\u016bra ir pakalpojumu sniedz\u0113ju r\u016bpe, nevis DevOps speci\u0101listu. Resursu m\u0113rogo\u0161ana autom\u0101tiski piel\u0101gojas slodzei un ir ar augstu izmai\u0146u \u0101trumu.<\/p>\n<p><\/p>\n<p>V\u0113l viena kop\u0113ja iez\u012bme ir tendence minimiz\u0113t un koncentr\u0113ties uz kodu, t\u0101p\u0113c bezserveru skait\u013co\u0161ana da\u017ereiz tiek d\u0113v\u0113ta par \"funkcija k\u0101 pakalpojums\" (FaaS).<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>V\u0113sturisk\u0101 zi\u0146\u0101 pirmais m\u0101ko\u0146pakalpojumu sniedz\u0113js, kur\u0161 pied\u0101v\u0101ja FaaS ar AWS Lambda, bija Amazon, no kurienes ar\u012b radies \u0161is nosaukums. Citi m\u0101ko\u0146pakalpojumu sniedz\u0113ji pied\u0101v\u0101 l\u012bdz\u012bgas alternat\u012bvas:<\/p>\n<p><\/p>\n<ul>\n<li>Google Cloud Functions<\/li>\n<li>Microsoft Azure Functions<\/li>\n<\/ul>\n<p><\/p>\n<p>Visas \u0161\u012bs komp\u0101nijas pied\u0101v\u0101 serverless skait\u013co\u0161anu, autom\u0101tisku m\u0113rogo\u0161anu un maks\u0101\u0161anu tikai par faktiski izmantotajiem resursiem, bet taj\u0101 pa\u0161\u0101 laik\u0101 piesaista klientus savam patent\u0113tajam produktam. Tom\u0113r past\u0101v bezmaksas alternat\u012bvas ar atv\u0113rt\u0101 koda risin\u0101jumiem serverless skait\u013co\u0161anai. V\u0113rts piemin\u0113t:<\/p>\n<p><\/p>\n<ul>\n<li>Platformu <noindex><a rel=\"nofollow\" href=\"https:\/\/openwhisk.apache.org\/\">Apache OpenWhisk<\/a><\/noindex>, kuru izstr\u0101d\u0101 IBM inkubators,<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.spring.io\/spring-cloud-function\/\">Spring Cloud Functions<\/a><\/noindex>, k\u0101 da\u013cu no diezgan bag\u0101t\u012bgas Spring Framework ekosist\u0113mas, kuru var izmantot ar\u012b k\u0101 AWS Lambda, Azure Functions un OpenWhisk saskarni,<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/fnproject\">Projektu Fn<\/a><\/noindex>, kuru atbalsta Oracle.<\/li>\n<\/ul>\n<p><\/p>\n<p>Visi tie ir piln\u012bgi neatkar\u012bgi no m\u0101ko\u0146iem, t.i., tos var uzst\u0101d\u012bt jebkur\u0101 m\u0101ko\u0146os, tostarp j\u016bsu pa\u0161u, publiskaj\u0101 vai priv\u0101taj\u0101, un protams, Exoscale.<\/p>\n<p><\/p>\n<h2 id=\"kak-proekt-fn-ustroen\">K\u0101 ir izveidots projekts Fn<\/h2>\n<p><\/p>\n<p>Fn piln\u012bb\u0101 balst\u0101s uz Docker, sast\u0101v no diviem galvenajiem komponentiem:<\/p>\n<p><\/p>\n<ul>\n<li>CLI programma, kas paredz\u0113ta, lai p\u0101rvald\u012btu visus Fn infrastrukt\u016bras aspektus, un mijiedarbojas ar Fn serveri,<\/li>\n<li>Pats Fn servers, parasts lietojums, iepakots Docker konteiner\u0101.<\/li>\n<\/ul>\n<p><\/p>\n<p>Funkcijas, kas izvietotas Fn, tiek izpild\u012btas ar\u012b atsevi\u0161\u0137os konteineros, kas \u013cauj atbalst\u012bt daudzus programm\u0113\u0161anas valodas, piem\u0113ram\u2026 Clojure!<\/p>\n<p><\/p>\n<p>Funkciju argumenti tiek nodoti standarta ievad\u0101 (STDIN), rezult\u0101ti tiek rakst\u012bti standarta izvad\u0101 (STDOUT). Ja argumenti vai atgriezam\u0101s v\u0113rt\u012bbas nav vienk\u0101r\u0161i v\u0113rt\u012bbas (piem\u0113ram, JSON objekts) \u2014 t\u0101s var tikt p\u0101rveidotas, izmantojot abstrah\u0113\u0161anas sl\u0101ni, ko nodro\u0161ina Fn k\u0101 funkciju izstr\u0101des komplektu (FDK).<\/p>\n<p><\/p>\n<p>Lai atvieglotu darbu, tiek pied\u0101v\u0101ti ieb\u016bv\u0113ti veid\u0146u komplekti, kas atvieglo FaaS izv\u0113r\u0161anu pla\u0161\u0101 da\u017e\u0101du valodu un to versiju sarakst\u0101 (Go, da\u017e\u0101das Java versijas, Python u.c.).<\/p>\n<p><\/p>\n<p>FaaS izveide ir vienk\u0101r\u0161a, sekojot \u0161ai sh\u0113mai:<\/p>\n<p><\/p>\n<ul>\n<li>Izvietot funkciju, izmantojot CLI Fn: tiek izveidots lietojumprogrammas konfigur\u0101cijas fails Fn, pamatojoties uz izv\u0113l\u0113to veidni.<\/li>\n<li>Izdojam savu funkciju, atkal izmantojot CLI Fn: konteineru att\u0113ls tiek ievietots k\u0101d\u0101 kr\u0101tuv\u0113, p\u0113c tam serveris tiek inform\u0113ts par att\u0113la esam\u012bbu un izvietojumu.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Veidojam savu serverless risin\u0101jumu, balstoties uz Fn\" src=\"\/wp-content\/uploads\/2019\/11\/5add8b58c80e976cd61a156fdd0fba11.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>Funkciju pieg\u0101des princips Fn<\/em><\/p>\n<p><\/p>\n<h2 id=\"lokalnaya-ustanovka-i-testirovanie-besservernyh-funkciy\">Lok\u0101l\u0101 uzst\u0101d\u012b\u0161ana un bezserveru funkciju test\u0113\u0161ana<\/h2>\n<p><\/p>\n<p>S\u0101ksim ar Fn uzst\u0101d\u012b\u0161anu viet\u0113j\u0101 dator\u0101. Vispirms ir j\u0101instal\u0113 Docker, k\u0101 to prasa Fn. Pie\u0146emam, ka esam 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>Vai nu izmantojiet pakot\u0146u p\u0101rvaldnieku \/ Docker b\u016bvniec\u012bbu atbilsto\u0161i j\u016bsu sist\u0113mai. P\u0113c tam varat tie\u0161i p\u0101riet uz Fn CLI uzst\u0101d\u012b\u0161anu. Piem\u0113ram, izmantojot 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>Ja str\u0101d\u0101jat ar OSX, kur ir uzst\u0101d\u012bts Homebrew, varat doties citu ce\u013cu:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ brew install fn\n\n==&gt; Lejupiel\u0101d\u0113 https:\/\/homebrew.bintray.com\/bottles\/fn-0.5.8.high_sierra.bottle.tar.gz\n==&gt; Lejupiel\u0101d\u0113 no https:\/\/akamai.bintray.com\/b1\/b1767fb00e2e69fd9da73427d0926b1d1d0003622f7ddc0dd3a899b2894781ff?__gda__=exp=1538038849~hmac=c702c9335e7785fcbacad1f29afa61244d02f2eebb\n######################################################################## 100.0%\n==&gt; Tiek ielejots fn-0.5.8.high_sierra.bottle.tar.gz\n  \/usr\/local\/Cellar\/fn\/0.5.8: 5 faili, 16.7MB<\/code><\/pre>\n<p><\/p>\n<p>Tagad viss ir gatavs, lai s\u0101kotn\u0113ji izv\u0113rstu m\u016bsu funkciju, izmantojot CLI. Lai atvieglotu, m\u0113s izmantosim ieb\u016bv\u0113to vidi palai\u0161anai, piem\u0113ram, Node:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ fn init --runtime node --trigger http hellonode\n\nIzveido funkciju: \/hellonode\nFunkciju paraugs \u0123ener\u0113ts.\nfunc.yaml izveidots.<\/code><\/pre>\n<p><\/p>\n<p>Tiks izveidots jauns katalogs <code>hellonode<\/code> turpm\u0101kai m\u016bsu Fn funkcijas att\u012bst\u012bbai ar da\u017eiem pamatkonfigur\u0101cijas failiem. Iek\u0161 jaunizveidot\u0101 kataloga j\u016bs varat izveidot savu lietojumprogrammu, iev\u0113rojot izv\u0113l\u0113t\u0101 valodas vai izpildes vides standartu:<\/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 izveido projekta s\u0101kotn\u0113jo strukt\u016bru, izveidojot failu <code>func.yaml<\/code>, kas satur nepiecie\u0161am\u0101s iestat\u012b\u0161anas fn un nosaka veidni kodam valod\u0101, kuru izv\u0113l\u0113j\u0101ties.<\/p>\n<p><\/p>\n<p>Ja run\u0101jam par Node izpildlaiku, tas noz\u012bm\u0113:<\/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>Tagad m\u0113s \u0101tri p\u0101rbaud\u012bsim m\u016bsu funkciju lok\u0101li, lai redz\u0113tu, k\u0101 viss darbojas.<\/p>\n<p><\/p>\n<p>Vispirms m\u0113s palaid\u012bsim Fn serveri. K\u0101 jau tika teikts, Fn servers ir Docker konteiners, t\u0101p\u0113c p\u0113c palai\u0161anas tas \u0146ems att\u0113lu no Docker re\u0123istra.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ fn start -d                    # palaid\u012bsim lok\u0101lo serveri fon\u0101\n\nImage 'fnproject\/fnserver:latest' nav atrasts lok\u0101li\nlatest: Velk no fnproject\/fnserver\nff3a5c916c92: Velk pabeigts\n1a649ea86bca: Velk pabeigts\nce35f4d5f86a: Velk pabeigts\n\n...\n\nStatus: Lejupiel\u0101d\u0113ts jaun\u0101ks att\u0113ls k\u0101 fnproject\/fnserver:latest\n668ce9ac0ed8d7cd59da49228bda62464e01bff2c0c60079542d24ac6070f8e5<\/code><\/pre>\n<p><\/p>\n<p>Lai palaistu m\u016bsu funkciju, to ir j\u0101p\u0101rvieto. Tam ir nepiecie\u0161ams <code>lieto\u0161anas nosaukums<\/code>: Fn vis\u0101m lietojumprogramm\u0101m j\u0101b\u016bt noteikt\u0101m k\u0101 nosaukumu telp\u0101m saist\u012bt\u0101m funkcij\u0101m.<\/p>\n<p><\/p>\n<p>Fn CLI mekl\u0113s failu <code>func.yaml<\/code> pa\u0161reiz\u0113j\u0101 katalog\u0101, kas tiks izmantots funkcijas konfigur\u0113\u0161anai. T\u0101p\u0113c vispirms j\u0101p\u0101rsl\u0113dzas uz m\u016bsu katalogu <code>hellonode<\/code>.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ cd hellonode\n$ fn deploy --app fnexo --local  # izlaid\u012bsim funkciju lok\u0101li, lietojumprogrammas nosaukums - fnexo.\n                                 # viet\u0113jais parametrs neieliek att\u0113lu att\u0101lin\u0101taj\u0101 re\u0123istr\u0101,\n                                 # palaid\u012bsim to tie\u0161i\n\nIzlai\u017eot hellonode lietojumprogramm\u0101: fnexo\nPalielin\u0101ts l\u012bdz versijai 0.0.2\nVeido att\u0113lu nfrankel\/hellonode:0.0.3 .\nAtjaunojam funkciju hellonode, izmantojot att\u0113lu nfrankel\/hellonode:0.0.3...\nVeiksm\u012bgi izveidota lietojumprogramma:  fnexo\nVeiksm\u012bgi izveidota funkcija: hellonode ar nfrankel\/hellonode:0.0.3\nVeiksm\u012bgi izveidots triggers: hellonode-trigger<\/code><\/pre>\n<p><\/p>\n<p>K\u0101 var redz\u0113t no komandas izvad\u0113, tiek izveidots jauns Docker konteinera att\u0113ls, kas satur m\u016bsu funkciju. Funkcija ir gatava v\u0101rdus saukt, un mums ir divi veidi, k\u0101 to izdar\u012bt:<\/p>\n<p><\/p>\n<ul>\n<li>izmantojot Fn komandu <code>invoke<\/code><\/li>\n<li>izsaucot tie\u0161i caur <code>http<\/code><\/li>\n<\/ul>\n<p><\/p>\n<p>Izsaukt <code>invoke<\/code> izmantojot Fn, vienk\u0101r\u0161i emul\u0113 HTTP darbu testiem, kas ir \u0113rti \u0101trai p\u0101rbaudei:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ fn invoke fnexo hellonode      # izsaucam funkciju hellonode lietojumprogramm\u0101 fnexo\n\n{\"message\":\"Hello World\"}<\/code><\/pre>\n<p><\/p>\n<p>Lai izsauktu funkciju tie\u0161i, j\u0101zina pilns URL:<\/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>Fn servers pied\u0101v\u0101 savas funkcijas caur 8080 portu, un, k\u0101 \u0161\u0137iet, funkcijas URL atbilst sh\u0113mai <code>t\/app\/function<\/code>, bet ne piln\u012bb\u0101. Caur HTTP funkciju izsauc ne tie\u0161i, bet caur t\u0101 saukto trigeri, kas, k\u0101 nosaukums nor\u0101da, \"izsauc\" funkcijas izpildi. Trigeri tiek defin\u0113ti <code>`func.yml<\/code> projekta:<\/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    # Trigeru URL<\/code><\/pre>\n<p><\/p>\n<p>M\u0113s varam main\u012bt trigeru nosaukumu, lai tas atbilstu funkcijas nosaukumam, tas atvieglos procesu:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">triggers:\n- name: hellonode-trigger\n  type: http\n  source: \/hellonode    # atbilst funkcijas nosaukumam<\/code><\/pre>\n<p><\/p>\n<p>P\u0113c tam m\u0113s v\u0113lreiz palai\u017eam funkcijas pieg\u0101di un izsaucam to no jauna trigera:<\/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>Viss str\u0101d\u0101! Tagad ir \u012bstais laiks veikt re\u0101lus eksperimentus un public\u0113t m\u016bsu FaaS server\u012b!<\/p>\n<p><\/p>\n<h2 id=\"ustanovka-servisov-besservernyh-funkciy-na-sobstvennoy-infrastrukture\">Serverless funkciju pakalpojumu uzst\u0101d\u012b\u0161ana uz savas infrastrukt\u016bras<\/h2>\n<p><\/p>\n<p>\u0100tri uzst\u0101d\u012bsim virtu\u0101lo ma\u0161\u012bnu, izmantojot Exoscale CLI. Ja j\u016bs to v\u0113l neesat konfigur\u0113jis \u2014 varat izmantot <noindex><a rel=\"nofollow\" href=\"https:\/\/community.exoscale.com\/documentation\/tools\/exoscale-command-line-interface\/\">m\u016bsu \u0101tr\u0101 palai\u0161anas rokasgr\u0101matu<\/a><\/noindex>. Tas ir lielisks r\u012bks, kas v\u0113l vair\u0101k palielin\u0101s j\u016bsu produktivit\u0101ti. <strong>Neaizmirstiet iestat\u012bt noteikumu, lai atv\u0113rtu 8080 portu dro\u0161\u012bbas grup\u0101!<\/strong> \u0160ie komandas palaid\u012bs t\u012bru virtu\u0101lo ma\u0161\u012bnu, kas gatava m\u016bsu funkciju izvieto\u0161anai:<\/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>P\u0113c tam varat piek\u013c\u016bt virtu\u0101lajai ma\u0161\u012bnai, izmantojot ssh, un uzst\u0101d\u012bt Fn at\u0101lin\u0101to serveri:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ exo ssh fn-server\n\nHosta '185.19.30.175 (185.19.30.175)' autentiskums nevar tikt noteikts.\nECDSA atsl\u0113gas pirksta nospiedums ir SHA256:uaCKRYeX4cvim+Gr8StdPvIQ7eQgPuOKdnj5WI3gI9Q.\nVai esat p\u0101rliecin\u0101ts, ka v\u0113laties turpin\u0101t savienojumu (j\u0101\/n\u0113)? j\u0101\nBr\u012bdin\u0101jums: uz visiem laikiem pievienots '185.19.30.175' (ECDSA) zin\u0101mo hostu sarakstam.\nLaipni l\u016bdzam Ubuntu 18.04 LTS (GNU\/Linux 4.15.0-20-generic x86_64)<\/code><\/pre>\n<p><\/p>\n<p>P\u0113c tam uzst\u0101d\u0101m Docker un Fn serveri t\u0101pat k\u0101 tas tika dar\u012bts uz viet\u0113j\u0101s ma\u0161\u012bnas, palai\u017eam serveri:<\/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 ir gatavs funkciju sa\u0146em\u0161anai! Lai funkcijas m\u0113r\u0137tiec\u012bgi nolas\u012btu no att\u0101lin\u0101t\u0101 servera, izmantosim komandu <code>deploy<\/code> no viet\u0113j\u0101 datora, izsl\u0113dzot egl\u012btes <code>--local<\/code>.<\/p>\n<p><\/p>\n<p>Turkl\u0101t Fn prasa nor\u0101d\u012bt Fn servera un Docker re\u0123istra atra\u0161an\u0101s vietu. \u0160ie parametri var tikt iestat\u012bti, izmantojot vides main\u012bgos <code>FN_API_URL<\/code> un <code>FN_REGISTRY<\/code> atbilsto\u0161i, ta\u010du tiek pied\u0101v\u0101ts ar\u012b \u0113rt\u0101ks veids, k\u0101 viegli p\u0101rvald\u012bt konfigur\u0101ciju izveidi un p\u0101rvald\u012bbu izvieto\u0161anai.<\/p>\n<p><\/p>\n<p>Fn terminolo\u0123ij\u0101 kontekstu izvieto\u0161anai sauc par <code>context<\/code>. N\u0101kam\u0101 komanda izveidos kontekstu:<\/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>J\u016bs varat apskat\u012bt pieejamos kontekstus \u0161\u0101di:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ fn list contexts\n\nPA\u0160REIZ\u0112JAIS NOSAUKUMS  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>Un p\u0101rsl\u0113gties uz tikko izveidoto kontekstu ir \u0161\u0101di:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\"> $ fn use context exoscale\n\n Tagad izmantojam kontekstu: exoscale<\/code><\/pre>\n<p><\/p>\n<p>S\u0101kot no \u0161\u012bs vietas, Fn funkciju pieg\u0101de tiks iel\u0101d\u0113jusi Docker att\u0113lus, izmantojot izv\u0113l\u0113to kontu DockerHub (man\u0101 gad\u012bjum\u0101 \u2014 <code>nfrankel<\/code>), p\u0113c tam pazi\u0146ojot att\u0101lin\u0101tajam serverim (\u0161aj\u0101 piem\u0113r\u0101 \u2014 <code>http:\/\/185.19.30.175:8080<\/code>) par p\u0113d\u0113j\u0101 att\u0113la, kas satur j\u016bsu funkciju, atra\u0161an\u0101s vietu un versiju.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ fn deploy --app fnexo .   # izpild\u0101ms uz lok\u0101l\u0101s ma\u0161\u012bnas no hellonode direktorijas\n\nPieg\u0101d\u0101 funkciju: \/.\nPieg\u0101de hellonode uz lietotni: fnexo\nJums pie\u0161\u0137irta versija 0.0.5\nB\u016bv\u0113jot att\u0113lu nfrankel\/hellonode:0.0.5 .<\/code><\/pre>\n<p><\/p>\n<p>Visbeidzot:<\/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=\"Veidojam savu serverless risin\u0101jumu, balstoties uz Fn\" src=\"\/wp-content\/uploads\/2019\/11\/51a7b88cd6bf4953740cfac937b0acc2.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>Funkcijas dz\u012bves cikls bezserveru skait\u012b\u0161an\u0101, balstoties uz Fn<\/em><\/p>\n<p><\/p>\n<h2 id=\"preimuschestva-besservernyh-vychisleniy-na-svoih-moschnostyah\">Bezserveru skait\u012b\u0161anas priek\u0161roc\u012bbas uz j\u016bsu iesp\u0113j\u0101m<\/h2>\n<p><\/p>\n<p>Bezserveru skait\u012b\u0161ana \u2014 \u0113rts risin\u0101jums, lai \u0101tri ieviestu neatkar\u012bgas lietojumprogrammas da\u013cas, kas sadarbojas ar sare\u017e\u0123\u012bt\u0101k\u0101m lietojumprogramm\u0101m vai mikropakalpojumiem.<\/p>\n<p><\/p>\n<p>Bie\u017ei tas saist\u012bts ar sl\u0113pt\u0101m izmaks\u0101m, piesaistot izv\u0113l\u0113tajam pakalpojumu sniedz\u0113jam, kas atkar\u012bb\u0101 no konkr\u0113t\u0101 pielietojuma un apjoma var novest pie augst\u0101k\u0101m izmaks\u0101m un samazin\u0101tas elast\u012bbas n\u0101kotn\u0113.<\/p>\n<p><\/p>\n<p>Multicloud un hibr\u012bdas m\u0101ko\u0146u arhitekt\u016bras ar\u012b cie\u0161 \u0161\u0101d\u0101 gad\u012bjum\u0101, jo var viegli non\u0101kt situ\u0101cij\u0101, kad v\u0113l\u0113tos izmantot bezserveru skait\u012b\u0161anu, bet korporat\u012bv\u0101s politikas d\u0113\u013c tas var\u0113tu b\u016bt neiesp\u0113jami.<\/p>\n<p><\/p>\n<p>Fn ir pietiekami vienk\u0101r\u0161s lieto\u0161an\u0101, var sniegt gandr\u012bz t\u0101du pa\u0161u FaaS interfeisu, ar neliel\u0101m izmaks\u0101m. Tas atbr\u012bvos no jebk\u0101d\u0101m piesaist\u0113m pakalpojumu sniedz\u0113jiem, to var uzst\u0101d\u012bt lok\u0101li vai pie jebkura \u0113rt\u0101 m\u0101ko\u0146u pakalpojumu sniedz\u0113ja p\u0113c j\u016bsu izv\u0113les. T\u0101pat ir br\u012bv\u012bba izv\u0113l\u0113ties programm\u0113\u0161anas valodu.<\/p>\n<p><\/p>\n<p>Rakst\u0101 ir apl\u016bkotas tikai Fn pamati, ta\u010du pa\u0161a izpildes vides izveide ir diezgan vienk\u0101r\u0161a, un visp\u0101r\u0113jo arhitekt\u016bru var izplat\u012bt pla\u0161\u0101k, izmantojot Fn slodzes balans\u0113t\u0101ju vai izvietojot Fn aiz proksi aizsardz\u012bbai.<\/p>\n<p>Avots: <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.5 - 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\/lv\/blog\/administrirovanie\/stroim-sobstvennyj-serverless-na-osnove-fn\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.5\" \/>\n\t\t<meta property=\"og:locale\" content=\"lv_LV\" \/>\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\/lv\/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\udd47Veidojam savu bezserveru risin\u0101jumu, balstoties uz Fn | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/lv\/blog\/administrirovanie\/stroim-sobstvennyj-serverless-na-osnove-fn","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"lv_LV","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\/lv\/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\/lv\/wp-json\/wp\/v2\/posts\/52562","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/comments?post=52562"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/posts\/52562\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/media?parent=52562"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/categories?post=52562"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/tags?post=52562"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}