{"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\/pt\/blog\/administrirovanie\/stroim-sobstvennyj-serverless-na-osnove-fn","title":{"rendered":"Construindo nosso pr\u00f3prio serverless baseado no Fn","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Construindo nosso pr\u00f3prio serverless baseado no 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\">Computa\u00e7\u00e3o sem servidor<\/a><\/noindex> \u2014 \u00e9 uma das tend\u00eancias mais not\u00e1veis na computa\u00e7\u00e3o em nuvem. O princ\u00edpio b\u00e1sico \u00e9 que a infraestrutura \u00e9 responsabilidade do provedor de servi\u00e7os, n\u00e3o dos DevOps. O dimensionamento dos recursos se ajusta automaticamente \u00e0 carga e possui alta velocidade de altera\u00e7\u00e3o.<\/p>\n<p><\/p>\n<p>Outra caracter\u00edstica comum \u00e9 a tend\u00eancia \u00e0 minimiza\u00e7\u00e3o e ao foco do c\u00f3digo, por isso a computa\u00e7\u00e3o sem servidor \u00e9 \u00e0s vezes chamada de \"fun\u00e7\u00e3o como servi\u00e7o\" (FaaS).<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Historicamente, o primeiro provedor de servi\u00e7os em nuvem a oferecer FaaS com o AWS Lambda foi a Amazon, de onde vem esse nome. Outros provedores de servi\u00e7os em nuvem tamb\u00e9m oferecem an\u00e1logos:<\/p>\n<p><\/p>\n<ul>\n<li>Cloud Functions da Google<\/li>\n<li>Azure Functions da Microsoft<\/li>\n<\/ul>\n<p><\/p>\n<p>Todas essas empresas oferecem computa\u00e7\u00e3o sem servidor, escalonamento autom\u00e1tico e pagamento apenas pelos recursos realmente utilizados, mas, ao mesmo tempo, vinculam os clientes ao seu produto propriet\u00e1rio. No entanto, existem alternativas gratuitas de c\u00f3digo aberto para organizar computa\u00e7\u00e3o sem servidor. Vale a pena notar:<\/p>\n<p><\/p>\n<ul>\n<li>A plataforma <noindex><a rel=\"nofollow\" href=\"https:\/\/openwhisk.apache.org\/\">Apache OpenWhisk<\/a><\/noindex>, desenvolvida no incubador pela IBM,<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.spring.io\/spring-cloud-function\/\">Spring Cloud Functions<\/a><\/noindex>, como parte de um ecossistema bastante rico do Spring Framework, que tamb\u00e9m pode ser usado como fachada para AWS Lambda, Azure Functions e OpenWhisk,<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/fnproject\">O projeto Fn<\/a><\/noindex>, apoiado pela Oracle.<\/li>\n<\/ul>\n<p><\/p>\n<p>Todos eles s\u00e3o totalmente independentes de nuvens, ou seja, podem ser instalados em qualquer nuvem, incluindo a sua pr\u00f3pria, p\u00fablica ou privada, e claro, na Exoscale.<\/p>\n<p><\/p>\n<h2 id=\"kak-proekt-fn-ustroen\">Como o projeto Fn \u00e9 estruturado<\/h2>\n<p><\/p>\n<p>O Fn \u00e9 totalmente baseado em Docker, consistindo em dois componentes principais:<\/p>\n<p><\/p>\n<ul>\n<li>Uma interface de linha de comando (CLI) destinada a gerenciar todos os aspectos da infraestrutura do Fn e a interagir com o servidor Fn,<\/li>\n<li>O pr\u00f3prio servidor Fn, um aplicativo comum empacotado em um cont\u00eainer Docker.<\/li>\n<\/ul>\n<p><\/p>\n<p>As fun\u00e7\u00f5es implantadas no Fn tamb\u00e9m s\u00e3o executadas em cont\u00eaineres separados, permitindo o suporte a muitas linguagens de programa\u00e7\u00e3o, como\u2026 Clojure!<\/p>\n<p><\/p>\n<p>Os argumentos das fun\u00e7\u00f5es s\u00e3o passados para a entrada padr\u00e3o (STDIN), e os resultados s\u00e3o escritos na sa\u00edda padr\u00e3o (STDOUT). Se os argumentos ou valores retornados n\u00e3o forem valores simples (por exemplo, um objeto JSON), eles podem ser convertidos usando a camada de abstra\u00e7\u00e3o fornecida pelo pr\u00f3prio Fn na forma de um kit de desenvolvimento de fun\u00e7\u00f5es (FDK).<\/p>\n<p><\/p>\n<p>Para conveni\u00eancia, s\u00e3o oferecidos conjuntos de templates incorporados que facilitam a implementa\u00e7\u00e3o de FaaS em uma ampla lista de diferentes linguagens e suas vers\u00f5es (Go, diferentes vers\u00f5es do Java, Python, etc.).<\/p>\n<p><\/p>\n<p>Criar FaaS \u00e9 simples, seguindo este esquema:<\/p>\n<p><\/p>\n<ul>\n<li>Implementamos a fun\u00e7\u00e3o usando o CLI Fn: um arquivo de configura\u00e7\u00e3o do aplicativo para o Fn \u00e9 criado com base no template escolhido.<\/li>\n<li>Implantamos nossa pr\u00f3pria fun\u00e7\u00e3o, novamente usando o CLI Fn: a imagem do cont\u00eainer \u00e9 colocada em um reposit\u00f3rio, ap\u00f3s o que o servidor \u00e9 notificado sobre a exist\u00eancia e localiza\u00e7\u00e3o dessa imagem.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Construindo nosso pr\u00f3prio serverless baseado no Fn\" src=\"\/wp-content\/uploads\/2019\/11\/5add8b58c80e976cd61a156fdd0fba11.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>Princ\u00edpio de fornecimento de fun\u00e7\u00f5es no Fn<\/em><\/p>\n<p><\/p>\n<h2 id=\"lokalnaya-ustanovka-i-testirovanie-besservernyh-funkciy\">Instala\u00e7\u00e3o e teste local de fun\u00e7\u00f5es serverless<\/h2>\n<p><\/p>\n<p>Vamos come\u00e7ar a instalar o Fn na m\u00e1quina local. Primeiro, instalamos o Docker, como exigido pelo Fn. Assume-se que estamos no 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>Ou use o gerenciador de pacotes\/constru\u00e7\u00e3o do Docker de acordo com seu sistema. Em seguida, podemos prosseguir diretamente para a instala\u00e7\u00e3o do Fn CLI. Por exemplo, usando 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>Se voc\u00ea estiver no OSX com o Homebrew instalado, pode seguir por outro caminho:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ brew install fn\n\n==&gt; Downloading https:\/\/homebrew.bintray.com\/bottles\/fn-0.5.8.high_sierra.bottle.tar.gz\n==&gt; Downloading from https:\/\/akamai.bintray.com\/b1\/b1767fb00e2e69fd9da73427d0926b1d1d0003622f7ddc0dd3a899b2894781ff?__gda__=exp=1538038849~hmac=c702c9335e7785fcbacad1f29afa61244d02f2eebb\n######################################################################## 100.0%\n==&gt; Pouring fn-0.5.8.high_sierra.bottle.tar.gz\n  \/usr\/local\/Cellar\/fn\/0.5.8: 5 files, 16.7MB<\/code><\/pre>\n<p><\/p>\n<p>Agora tudo est\u00e1 pronto para a implanta\u00e7\u00e3o inicial de nossa fun\u00e7\u00e3o usando o CLI. Para simplificar, usaremos um ambiente incorporado de execu\u00e7\u00e3o, como o Node:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ fn init --runtime node --trigger http hellonode\n\nCreating function at: \/hellonode\nFunction boilerplate generated.\nfunc.yaml created.<\/code><\/pre>\n<p><\/p>\n<p>Um novo diret\u00f3rio ser\u00e1 criado <code>hellonode<\/code> para o cont\u00ednuo desenvolvimento de nossa fun\u00e7\u00e3o Fn com alguns arquivos de configura\u00e7\u00e3o b\u00e1sicos. Dentro do diret\u00f3rio rec\u00e9m-criado, voc\u00ea pode criar seu aplicativo, seguindo os padr\u00f5es da linguagem ou ambiente de execu\u00e7\u00e3o que voc\u00ea escolheu:<\/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>O Fn cria a estrutura inicial do projeto, cria o arquivo <code>func.yaml<\/code>, contendo as configura\u00e7\u00f5es necess\u00e1rias para o Fn, e estabelece o template para o c\u00f3digo na linguagem que voc\u00ea escolheu.<\/p>\n<p><\/p>\n<p>No caso do ambiente de execu\u00e7\u00e3o Node, isso significa:<\/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>Agora vamos rapidamente testar nossa fun\u00e7\u00e3o localmente para ver como tudo funciona.<\/p>\n<p><\/p>\n<p>Primeiro, vamos iniciar o servidor Fn. Como j\u00e1 mencionado, o servidor Fn \u00e9 um container Docker, portanto, ap\u00f3s o in\u00edcio, ele ir\u00e1 buscar a imagem no registro Docker.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ fn start -d                    # iniciamos o servidor local em segundo plano\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>Para iniciar nossa fun\u00e7\u00e3o, \u00e9 necess\u00e1rio \"lan\u00e7\u00e1-la\". Para isso, \u00e9 necess\u00e1rio <code>o nome do aplicativo<\/code>: no Fn, todos os aplicativos devem ser especificados como namespaces para fun\u00e7\u00f5es relacionadas.<\/p>\n<p><\/p>\n<p>O Fn CLI procurar\u00e1 um arquivo <code>func.yaml<\/code> no diret\u00f3rio atual, que ser\u00e1 utilizado para configurar a fun\u00e7\u00e3o. Ent\u00e3o, primeiro, precisamos navegar at\u00e9 nosso diret\u00f3rio <code>hellonode<\/code>.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ cd hellonode\n$ fn deploy --app fnexo --local  # implantamos a fun\u00e7\u00e3o localmente, o nome do aplicativo \u00e9 fnexo.\n                                 # o par\u00e2metro local n\u00e3o envia a imagem para o registro remoto,\n                                 # rodando-a diretamente\n\nImplantando hellonode no app: fnexo\nVers\u00e3o 0.0.2 aumentada\nConstruindo imagem nfrankel\/hellonode:0.0.3 .\nAtualizando a fun\u00e7\u00e3o hellonode usando a imagem nfrankel\/hellonode:0.0.3...\nAplicativo criado com sucesso:  fnexo\nFun\u00e7\u00e3o criada com sucesso: hellonode com nfrankel\/hellonode:0.0.3\nGatilho criado com sucesso: hellonode-trigger<\/code><\/pre>\n<p><\/p>\n<p>Como pode ser visto na sa\u00edda do comando, uma nova imagem de container para Docker est\u00e1 sendo criada, contendo nossa fun\u00e7\u00e3o. A fun\u00e7\u00e3o est\u00e1 pronta para ser chamada, e temos duas maneiras de fazer isso:<\/p>\n<p><\/p>\n<ul>\n<li>usando o comando Fn <code>invoke<\/code><\/li>\n<li>chamando diretamente atrav\u00e9s de <code>http<\/code><\/li>\n<\/ul>\n<p><\/p>\n<p>Chamada <code>invoke<\/code> pelo Fn apenas emula a opera\u00e7\u00e3o via HTTP para testes, o que \u00e9 conveniente para uma verifica\u00e7\u00e3o r\u00e1pida:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ fn invoke fnexo hellonode      # chamamos a fun\u00e7\u00e3o hellonode do aplicativo fnexo\n\n{\"message\":\"Hello World\"}<\/code><\/pre>\n<p><\/p>\n<p>Para chamar a fun\u00e7\u00e3o diretamente, \u00e9 necess\u00e1rio conhecer a URL completa:<\/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>O servidor Fn oferece suas fun\u00e7\u00f5es atrav\u00e9s da porta 8080, e, aparentemente, a URL da fun\u00e7\u00e3o corresponde ao esquema <code>t\/app\/function<\/code>, mas n\u00e3o completamente. Atrav\u00e9s do HTTP, a fun\u00e7\u00e3o \u00e9 chamada n\u00e3o diretamente, mas atrav\u00e9s do chamado trigger, que, como o nome sugere, \"dispara\" a chamada da fun\u00e7\u00e3o. Os triggers s\u00e3o definidos em <code>`func.yml<\/code> do projeto:<\/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 do gatilho<\/code><\/pre>\n<p><\/p>\n<p>Podemos mudar o nome do gatilho para que corresponda ao nome da fun\u00e7\u00e3o, isso ir\u00e1 simplificar tudo:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">triggers:\n- name: hellonode-trigger\n  type: http\n  source: \/hellonode    # corresponde ao nome da fun\u00e7\u00e3o<\/code><\/pre>\n<p><\/p>\n<p>Em seguida, iniciamos a entrega da fun\u00e7\u00e3o novamente e a chamamos do novo gatilho:<\/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\":\"Ol\u00e1 Mundo\"}<\/code><\/pre>\n<p><\/p>\n<p>Tudo est\u00e1 funcionando! \u00c9 hora de passar para experimentos reais e publicar nosso FaaS no servidor!<\/p>\n<p><\/p>\n<h2 id=\"ustanovka-servisov-besservernyh-funkciy-na-sobstvennoy-infrastrukture\">Instala\u00e7\u00e3o de servi\u00e7os de fun\u00e7\u00f5es sem servidor em infraestrutura pr\u00f3pria<\/h2>\n<p><\/p>\n<p>Vamos rapidamente instalar uma m\u00e1quina virtual usando o CLI Exoscale. Se voc\u00ea ainda n\u00e3o a configurou, pode usar <noindex><a rel=\"nofollow\" href=\"https:\/\/community.exoscale.com\/documentation\/tools\/exoscale-command-line-interface\/\">nosso guia para uma configura\u00e7\u00e3o r\u00e1pida<\/a><\/noindex>. \u00c9 uma ferramenta incr\u00edvel que aumentar\u00e1 ainda mais a sua produtividade. <strong>N\u00e3o se esque\u00e7a de configurar uma regra para abrir a porta 8080 no Grupo de Seguran\u00e7a!<\/strong> Os seguintes comandos v\u00e3o iniciar uma m\u00e1quina virtual limpa, pronta para hospedar nossas fun\u00e7\u00f5es:<\/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>Em seguida, voc\u00ea pode acessar a m\u00e1quina virtual via ssh e instalar o servidor remoto Fn:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ exo ssh fn-server\n\nA autenticidade do host '185.19.30.175 (185.19.30.175)' n\u00e3o pode ser estabelecida.\nA impress\u00e3o digital da chave ECDSA \u00e9 SHA256:uaCKRYeX4cvim+Gr8StdPvIQ7eQgPuOKdnj5WI3gI9Q.\nTem certeza de que deseja continuar conectando (sim\/n\u00e3o)? sim\nAviso: Adicionado permanentemente '185.19.30.175' (ECDSA) \u00e0 lista de hosts conhecidos.\nBem-vindo ao Ubuntu 18.04 LTS (GNU\/Linux 4.15.0-20-generic x86_64)<\/code><\/pre>\n<p><\/p>\n<p>Em seguida, instalamos o Docker e o servidor Fn da mesma forma que j\u00e1 foi feito na m\u00e1quina local, iniciamos o servidor:<\/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 est\u00e1 pronto para receber fun\u00e7\u00f5es! Para o envio de fun\u00e7\u00f5es para o servidor remoto, vamos usar o comando <code>deploy<\/code> do computador local, omitindo a flag <code>--local<\/code>.<\/p>\n<p><\/p>\n<p>Al\u00e9m disso, o Fn requer que voc\u00ea especifique o local do servidor Fn e do registro Docker. Esses par\u00e2metros podem ser definidos atrav\u00e9s das vari\u00e1veis de ambiente <code>FN_API_URL<\/code> e <code>FN_REGISTRY<\/code> respectivamente, mas tamb\u00e9m \u00e9 oferecido um m\u00e9todo mais conveniente para f\u00e1cil gerenciamento de cria\u00e7\u00e3o e gest\u00e3o de configura\u00e7\u00f5es para implanta\u00e7\u00e3o.<\/p>\n<p><\/p>\n<p>Em termos de Fn, a configura\u00e7\u00e3o para a implanta\u00e7\u00e3o \u00e9 chamada <code>contexto<\/code>. O seguinte comando criar\u00e1 um contexto:<\/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>Voc\u00ea pode visualizar os contextos dispon\u00edveis assim:<\/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>E mudar para o contexto que foi criado recentemente assim:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\"> $ fn use context exoscale\n\n Agora usando o contexto: exoscale<\/code><\/pre>\n<p><\/p>\n<p>A partir deste ponto, a entrega das fun\u00e7\u00f5es Fn come\u00e7ar\u00e1 a carregar as imagens Docker usando a conta selecionada no DockerHub (no meu caso \u2014 <code>nfrankel<\/code>), e logo notificar\u00e1 o servidor remoto (neste exemplo \u2014 <code>http:\/\/185.19.30.175:8080<\/code>) sobre a localiza\u00e7\u00e3o e a vers\u00e3o da \u00faltima imagem que cont\u00e9m sua fun\u00e7\u00e3o.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ fn deploy --app fnexo .   # executado na m\u00e1quina local a partir do diret\u00f3rio hellonode\n\nImplantando fun\u00e7\u00e3o em: \nImplantando hellonode no aplicativo: fnexo\nAtualizado para vers\u00e3o 0.0.5\nConstruindo imagem nfrankel\/hellonode:0.0.5 .<\/code><\/pre>\n<p><\/p>\n<p>Finalmente:<\/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=\"Construindo nosso pr\u00f3prio serverless baseado no Fn\" src=\"\/wp-content\/uploads\/2019\/11\/51a7b88cd6bf4953740cfac937b0acc2.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>Ciclo de vida da fun\u00e7\u00e3o em computa\u00e7\u00e3o serverless baseadas em Fn<\/em><\/p>\n<p><\/p>\n<h2 id=\"preimuschestva-besservernyh-vychisleniy-na-svoih-moschnostyah\">Vantagens da computa\u00e7\u00e3o serverless em suas pr\u00f3prias instala\u00e7\u00f5es<\/h2>\n<p><\/p>\n<p>A computa\u00e7\u00e3o serverless \u00e9 uma solu\u00e7\u00e3o conveniente para a r\u00e1pida implementa\u00e7\u00e3o de partes independentes de um aplicativo que interagem com aplicativos mais complexos ou microservi\u00e7os.<\/p>\n<p><\/p>\n<p>Isso muitas vezes est\u00e1 associado ao custo oculto de estar vinculado ao fornecedor escolhido, o que, dependendo do caso de uso espec\u00edfico e do volume, pode resultar em custos mais altos e menor flexibilidade no futuro.<\/p>\n<p><\/p>\n<p>Arquiteturas multicloud e h\u00edbridas tamb\u00e9m sofrem neste caso, pois \u00e9 f\u00e1cil se encontrar em uma situa\u00e7\u00e3o onde se deseja usar computa\u00e7\u00e3o serverless, mas devido \u00e0 pol\u00edtica corporativa isso pode ser imposs\u00edvel.<\/p>\n<p><\/p>\n<p>O Fn \u00e9 bastante f\u00e1cil de usar, pode fornecer quase a mesma interface FaaS, com poucos custos. Ele elimina quaisquer amarras ao fornecedor, podendo ser instalado localmente ou em qualquer fornecedor de solu\u00e7\u00f5es de nuvem de sua escolha. Tamb\u00e9m h\u00e1 liberdade na escolha da linguagem de programa\u00e7\u00e3o.<\/p>\n<p><\/p>\n<p>Este artigo apresenta apenas os fundamentos do Fn, mas criar seu pr\u00f3prio ambiente de execu\u00e7\u00e3o \u00e9 bastante simples, e a arquitetura geral pode ser expandida mais usando um balanceador de carga Fn, ou colocando o Fn atr\u00e1s de um proxy para prote\u00e7\u00e3o.<\/p>\n<p>Fonte: <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.3 - 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\/pt\/blog\/administrirovanie\/stroim-sobstvennyj-serverless-na-osnove-fn\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"pt_PT\" \/>\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\/pt\/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\udd47Construindo nosso pr\u00f3prio serverless baseado em Fn | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/stroim-sobstvennyj-serverless-na-osnove-fn","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pt_PT","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\/pt\/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\/pt\/wp-json\/wp\/v2\/posts\/52562","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/comments?post=52562"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/52562\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media?parent=52562"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/categories?post=52562"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/tags?post=52562"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}