
је један од најистакнутијих трендова у рачунарству у облаку. Основни принцип рада је да инфраструктура није брига ДевОпс-а, већ провајдера услуга. Скалирање ресурса се аутоматски прилагођава учитавању и има високу стопу промене.
Још једна уобичајена карактеристика је тенденција минимизирања и фокусирања кода, због чега се рачунарство без сервера понекад назива функција као услуга (ФааС).
Историјски гледано, први провајдер облака који је понудио ФааС са АВС Ламбда био је Амазон, отуда и име. Други добављачи услуга у облаку такође нуде сличне:
- Цлоуд функције од Гоогле-а
- Азуре функције из Мицрософта
Све ове компаније пружају рачунарство без сервера, аутоматско скалирање и плаћају само оно што стварно користите, али закључавају купце у свој власнички производ. Међутим, постоје бесплатне и опен соурце алтернативе за рачунарство без сервера. Вреди напоменути:
- Платформа , развијен у инкубатору од стране ИБМ-а,
- , као део прилично богатог Спринг Фрамеворк екосистема, који се такође може користити као фасада за АВС Ламбда, Азуре Фунцтионс и ОпенВхиск,
- , коју подржава Орацле.
Сви су потпуно независни од облака, односно могу се инсталирати у било који облак, укључујући ваш, јавни или приватни, и наравно у Екосцале.
Како функционише пројекат Фн
Фн је у потпуности заснован на Доцкер-у, састоји се од две главне компоненте:
- ЦЛИ програм дизајниран за управљање свим аспектима Фн инфраструктуре и интеракцију са Фн сервером,
- Сам Фн сервер је обична апликација упакована у Доцкер контејнер.
Функције распоређене у Фн-у се такође извршавају у посебним контејнерима, што вам омогућава да подржите много програмских језика, на пример... Цлојуре!
Аргументи функције се прослеђују на стандардни улаз (СТДИН), резултати се записују на стандардни излаз (СТДОУТ). Ако аргументи или повратне вредности нису једноставне вредности (као што је ЈСОН објекат), могу се конвертовати помоћу слоја апстракције који обезбеђује сам Фн у облику комплета за развој функција (ФДК).
Ради практичности, понуђени су уграђени сетови шаблона који олакшавају примену ФааС-а на опсежној листи различитих језика и њихових верзија (Го, различите верзије Јаве, Питхон, итд.).
Прављење ФааС-а је лако пратећи овај дијаграм:
- Примена функције помоћу Фн ЦЛИ: конфигурациона датотека апликације за Фн се креира на основу изабраног шаблона.
- Развијамо сопствену функцију, поново користећи ЦЛИ Фн: слика контејнера се поставља у одређено спремиште, након чега се сервер обавештава о постојању и постављању ове слике.

Принцип достављања функција Фн
Локална инсталација и тестирање функција без сервера
Хајде да почнемо са инсталирањем Fn на локалној машини. Прво, инсталирамо Docker, како захтева Fn. Ово претпоставља да смо на Debian/Ubuntu:
$ sudo apt-get update
$ sudo apt-get install docker.ioИли користите менаџер пакета/Доцкер буилд према вашем систему. Затим можете прећи директно на инсталирање Фн ЦЛИ. На пример, користећи цурл:
$ curl -LSs https://raw.githubusercontent.com/fnproject/cli/master/install | shАко сте на ОСКС-у са инсталираним Хомебрев-ом, можете ићи другим путем:
$ brew install fn
==> Downloading https://homebrew.bintray.com/bottles/fn-0.5.8.high_sierra.bottle.tar.gz
==> Downloading from https://akamai.bintray.com/b1/b1767fb00e2e69fd9da73427d0926b1d1d0003622f7ddc0dd3a899b2894781ff?__gda__=exp=1538038849~hmac=c702c9335e7785fcbacad1f29afa61244d02f2eebb
######################################################################## 100.0%
==> Pouring fn-0.5.8.high_sierra.bottle.tar.gz
/usr/local/Cellar/fn/0.5.8: 5 files, 16.7MBСада смо спремни да првобитно применимо нашу функцију користећи ЦЛИ. Ради једноставности, користићемо уграђено окружење за покретање, као што је Ноде:
$ fn init --runtime node --trigger http hellonode
Creating function at: /hellonode
Function boilerplate generated.
func.yaml created.Нови директоријум ће бити креиран hellonode да даље развијамо нашу Фн функцију са неким основним конфигурационим датотекама. Унутар новоствореног директоријума, можете креирати своју апликацију пратећи стандарде одабраног језика или времена извршавања:
# Каталог с 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Фн креира почетну структуру пројекта, креира датотеку func.yaml, који садржи неопходна подешавања за Фн, и поставља шаблон за код на језику који сте изабрали.
У случају времена извршавања чвора, то значи:
$ 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}
})Сада ћемо брзо локално тестирати нашу функцију да видимо како све функционише.
Прво ћемо покренути Фн сервер. Као што је већ поменуто, Фн сервер је Доцкер контејнер, па ће након покретања отићи и узети слику из Доцкер регистра.
$ fn start -d # запускаем локальный сервер в фоне
Unable to find image 'fnproject/fnserver:latest' locally
latest: Pulling from fnproject/fnserver
ff3a5c916c92: Pull complete
1a649ea86bca: Pull complete
ce35f4d5f86a: Pull complete
...
Status: Downloaded newer image for fnproject/fnserver:latest
668ce9ac0ed8d7cd59da49228bda62464e01bff2c0c60079542d24ac6070f8e5Да бисмо покренули нашу функцију, она мора бити „разбачена“. Ово захтева имя приложения: У Фн-у, све апликације морају бити специфициране као простори имена за повезане функције.
Фн ЦЛИ ће тражити датотеку func.yaml у тренутном директоријуму који ће се користити за конфигурисање функције. Дакле, прво морате да одете у наш именик hellonode.
$ cd hellonode
$ fn deploy --app fnexo --local # выкатываем функцию локально, имя приложения - fnexo.
# параметр local не заливает образ в удаленный реестр,
# запуская его напрямую
Deploying hellonode to app: fnexo
Bumped to version 0.0.2
Building image nfrankel/hellonode:0.0.3 .
Updating function hellonode using image nfrankel/hellonode:0.0.3...
Successfully created app: fnexo
Successfully created function: hellonode with nfrankel/hellonode:0.0.3
Successfully created trigger: hellonode-triggerКао што можете видети из излаза команде, креира се нова слика Доцкер контејнера која садржи нашу функцију. Функција је спремна за позивање и имамо два начина да то урадимо:
- користећи команду Фн
invoke - позива директно преко
http
Изазов invoke преко Фн-а једноставно емулира рад преко ХТТП-а за тестове, што је згодно за брзо тестирање:
$ fn invoke fnexo hellonode # вызываем функцию hellonode приложения fnexo
{"message":"Hello World"}Да бисте директно позвали функцију, морате знати пуну УРЛ адресу:
$ curl http://localhost:8080/t/fnexo/hellonode-trigger
{"message":"Hello World"}Фн сервер излаже своје функције на порту 8080 и изгледа да УРЛ функције одговара шаблону t/app/function, али не у потпуности. Преко ХТТП-а функција се не позива директно, већ преко такозваног окидача, који, према свом називу, „покреће“ позив функције. Окидачи су дефинисани у `func.yml пројекат:
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 триггераМожемо променити име окидача тако да одговара имену функције, ово ће све поједноставити:
triggers:
- name: hellonode-trigger
type: http
source: /hellonode # совпадает с именем функцииЗатим поново покрећемо испоруку функције и позивамо је из новог окидача:
$ fn deploy --app fnexo hellonode --local
$ curl http://localhost:8080/t/fnexo/hellonode
{"message":"Hello World"}Све ради! Време је да пређемо на експерименте пуног обима и објавимо наш ФааС на серверу!
Инсталирање сервиса функција без сервера на сопствену инфраструктуру
Хајде да брзо инсталирамо виртуелну машину користећи Екосцале ЦЛИ. Ако га још нисте подесили, можете га користити . Ово је кул алат који ће још више повећати вашу продуктивност. Не заборавите да морате да конфигуришете правило за отварање порта 8080 у безбедносној групи! Следеће команде ће покренути чисту виртуелну машину, спремну да угости наше функције:
$ 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Затим можете ссх у виртуелну машину и инсталирати удаљени Фн сервер:
$ exo ssh fn-server
The authenticity of host '185.19.30.175 (185.19.30.175)' can't be established.
ECDSA key fingerprint is SHA256:uaCKRYeX4cvim+Gr8StdPvIQ7eQgPuOKdnj5WI3gI9Q.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '185.19.30.175' (ECDSA) to the list of known hosts.
Welcome to Ubuntu 18.04 LTS (GNU/Linux 4.15.0-20-generic x86_64)Затим инсталирајте Доцкер и Фн сервер на исти начин као што је већ урађено на локалној машини, покрените сервер:
$ 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Фн је спреман за пријем функција! За циљани пренос функција на удаљени сервер користићемо команду deploy са локалног рачунара тако што ћете изоставити заставицу --local.
Поред тога, Фн захтева да наведете локацију Фн сервера и Доцкер регистра. Ове опције се могу подесити преко променљивих окружења FN_API_URL и FN_REGISTRY респективно, али такође нуди погоднији начин за једноставно управљање креирањем и управљањем конфигурацијама за примену.
У Фн терминима, конфигурација за примену се зове context. Следећа команда ће креирати контекст:
$ fn create context exoscale --provider default --api-url http://185.19.30.175:8080 --registry nfrankelДоступне контексте можете видети овако:
$ fn list contexts
CURRENT NAME PROVIDER API URL REGISTRY
default default http://localhost:8080/
exoscale default http://185.19.30.175:8080 nfrankel
И пређите на контекст који је управо креиран овако:
$ fn use context exoscale
Now using context: exoscaleОд сада, испорука функције Фн ће преузимати Доцкер слике користећи изабрани ДоцкерХуб налог (у мом случају - nfrankel), а затим обавестите удаљени сервер (у овом примеру - http://185.19.30.175:8080) о локацији и верзији најновије слике која садржи вашу функцију.
$ fn deploy --app fnexo . # выполняется на локальной машине из каталога hellonode
Deploying function at: /.
Deploying hellonode to app: fnexo
Bumped to version 0.0.5
Building image nfrankel/hellonode:0.0.5 .коначно:
$ curl http://185.19.30.175:8080/t/fnexo/hellonode
{"message":"Hello World"}
Животни циклус функције у рачунарству без сервера заснованом на Фн-у
Предности рачунарства без сервера у сопственом капацитету
Рачунарство без сервера је згодно решење за брзу имплементацију независних делова апликације који су у интеракцији са сложенијим апликацијама или микросервисима.
Ово је често због скривених трошкова закључавања за изабраног добављача, што, у зависности од специфичног случаја употребе и обима, може довести до већих трошкова и смањене флексибилности у будућности.
Мулти-цлоуд и хибридне клауд архитектуре такође трпе у овом случају, јер се лако можете наћи у ситуацији да бисте желели да користите рачунарство без сервера, али због корпоративних политика то можда неће бити могуће.
Фн је прилично једноставан за коришћење и може да обезбеди скоро исти ФааС интерфејс, са малим трошковима. Елиминише свако закључавање добављача и може се инсталирати локално или у било ком прикладном добављачу решења у облаку по вашем избору. Постоји и слобода у избору програмског језика.
Овај чланак покрива само основе Фн-а, али креирање сопственог времена извршавања је прилично једноставно, а целокупна архитектура се може применити шире коришћењем Фн балансера оптерећења или постављањем Фн иза проксија ради заштите.
Извор: ввв.хабр.цом
