محاسبات بدون سرور یکی از برجسته ترین گرایش ها در رایانش ابری است. اصل عملیاتی اصلی این است که زیرساخت ها دغدغه DevOps نیست، بلکه مربوط به ارائه دهنده خدمات است. مقیاس بندی منابع به طور خودکار با بارگذاری تنظیم می شود و نرخ تغییر بالایی دارد.
یکی دیگر از ویژگی های رایج تمایل به کوچک سازی و تمرکز کد است، به همین دلیل است که محاسبات بدون سرور گاهی اوقات تابع به عنوان یک سرویس (FaaS) نامیده می شود.
از لحاظ تاریخی، اولین ارائهدهنده ابری که FaaS را با AWS Lambda ارائه میکرد، آمازون بود، از این رو این نام را به خود اختصاص داد. سایر ارائه دهندگان خدمات ابری نیز موارد مشابهی را ارائه می دهند:
توابع ابری از گوگل
توابع Azure از مایکروسافت
همه این شرکتها محاسبات بدون سرور، مقیاسبندی خودکار را ارائه میکنند و فقط برای آنچه واقعاً استفاده میکنید پرداخت میکنند، اما مشتریان را در محصول اختصاصی خود قفل میکنند. با این حال، جایگزین های رایگان و منبع باز برای محاسبات بدون سرور وجود دارد. شایان ذکر است:
توابع ابر بهار، به عنوان بخشی از یک اکوسیستم نسبتاً غنی Spring Framework، که می تواند به عنوان نما برای AWS Lambda، Azure Functions و OpenWhisk نیز استفاده شود.
همه آنها کاملاً مستقل از ابرها هستند، یعنی می توانند در هر ابری اعم از خود شما، عمومی یا خصوصی و البته در Exoscale نصب شوند.
پروژه Fn چگونه کار می کند
Fn کاملاً مبتنی بر Docker است و از دو جزء اصلی تشکیل شده است:
برنامه CLI طراحی شده برای مدیریت تمام جنبه های زیرساخت Fn، و تعامل با سرور Fn،
سرور Fn خود یک برنامه معمولی است که در یک ظرف Docker بسته بندی شده است.
توابع مستقر در Fn نیز در کانتینرهای جداگانه اجرا می شوند که به شما اجازه می دهد از زبان های برنامه نویسی زیادی پشتیبانی کنید، مثلا... Clojure!
آرگومان های تابع به ورودی استاندارد (STDIN) ارسال می شوند، نتایج به خروجی استاندارد (STDOUT) نوشته می شوند. اگر آرگومان ها یا مقادیر برگشتی مقادیر ساده ای نباشند (مانند یک شی JSON)، می توان آنها را با استفاده از یک لایه انتزاعی ارائه شده توسط خود Fn در قالب یک کیت توسعه عملکرد (FDK) تبدیل کرد.
برای راحتی، مجموعههای داخلی قالبها برای تسهیل استقرار FaaS در فهرست گستردهای از زبانهای مختلف و نسخههای آنها (برو، نسخههای مختلف جاوا، پایتون و غیره) ارائه میشوند.
ایجاد یک FaaS با دنبال کردن این نمودار آسان است:
استقرار تابع با استفاده از Fn CLI: یک فایل پیکربندی برنامه برای Fn بر اساس الگوی انتخاب شده ایجاد می شود.
ما عملکرد خود را با استفاده از CLI Fn باز می کنیم: تصویر ظرف در یک مخزن خاص قرار می گیرد و پس از آن سرور از وجود و قرار دادن این تصویر مطلع می شود.
اصل ارائه توابع به Fn
نصب و آزمایش محلی توابع بدون سرور
بیایید شروع به نصب Fn در ماشین محلی کنیم. ابتدا Docker نصب می شود، همانطور که Fn نیاز دارد. با فرض اینکه ما در Debian/Ubuntu هستیم:
ما اکنون آماده هستیم تا در ابتدا تابع خود را با استفاده از CLI اجرا کنیم. برای سادگی، ما از یک محیط راه اندازی داخلی مانند Node استفاده خواهیم کرد:
$ fn init --runtime node --trigger http hellonode
Creating function at: /hellonode
Function boilerplate generated.
func.yaml created.
یک دایرکتوری جدید ایجاد خواهد شد hellonode برای توسعه بیشتر تابع Fn ما با برخی از فایل های پیکربندی اولیه. در داخل دایرکتوری جدید ایجاد شده، می توانید برنامه خود را مطابق با استانداردهای زبان یا زمان اجرا انتخابی خود ایجاد کنید:
# Каталог с node выглядит так:
hellonode
├── func.js
├── func.yaml
└── package.json
# Свежеустановленное окружение Java11 такое:
hellojava11
├── func.yaml
├── pom.xml
└── src
├── main
│ └── java
│ └── com
│ └── example
│ └── fn
│ └── HelloFunction.java
└── test
└── java
└── com
└── example
└── fn
└── HelloFunctionTest.java
Fn ساختار اولیه پروژه را ایجاد می کند، یک فایل ایجاد می کند func.yaml، حاوی تنظیمات لازم برای Fn است و الگوی کد را به زبانی که انتخاب کرده اید تنظیم می کند.
در مورد زمان اجرا Node، این به این معنی است:
$ 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 را راه اندازی می کنیم. همانطور که قبلا ذکر شد، سرور Fn یک کانتینر Docker است، بنابراین، پس از راه اندازی، می رود و تصویر را از رجیستری Docker می گیرد.
$ 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
برای اجرای تابع ما، باید آن را "roll out" کنیم. این نیاز دارد имя приложения: در Fn همه برنامه ها باید به عنوان فضای نام برای توابع مرتبط مشخص شوند.
Fn CLI فایل را جستجو می کند 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
همانطور که از خروجی فرمان می بینید، یک تصویر ظرف Docker جدید ایجاد می شود که حاوی تابع ما است. تابع آماده فراخوانی است و ما دو راه برای انجام آن داریم:
با استفاده از دستور Fn invoke
تماس مستقیم از طریق http
تماس بگیرید invoke از طریق Fn به سادگی کار از طریق HTTP را برای آزمایش شبیه سازی می کند، که برای آزمایش سریع راحت است:
سرور Fn عملکردهای خود را در پورت 8080 نشان می دهد و به نظر می رسد URL تابع با الگو مطابقت دارد t/app/function، اما نه به طور کامل. از طریق HTTP، یک تابع به طور مستقیم فراخوانی نمی شود، بلکه از طریق یک به اصطلاح ماشه، که طبق نام آن، فراخوانی تابع را "شروع" می کند. محرک ها در تعریف شده اند `func.yml پروژه:
همه چیز کار می کند! زمان آن فرا رسیده است که به آزمایشات در مقیاس کامل برویم و FaaS خود را روی سرور منتشر کنیم!
نصب سرویس های عملکرد بدون سرور در زیرساخت خود
بیایید به سرعت یک ماشین مجازی با استفاده از Exoscale CLI نصب کنیم. اگر هنوز آن را تنظیم نکرده اید، می توانید استفاده کنید راهنمای شروع سریع ما. این یک ابزار جالب است که بهره وری شما را بیش از پیش افزایش می دهد. فراموش نکنید که برای باز کردن پورت 8080 در گروه امنیتی باید یک قانون پیکربندی کنید! دستورات زیر یک ماشین مجازی تمیز را راه اندازی می کند که آماده میزبانی توابع ما است:
سپس می توانید وارد ماشین مجازی شوید و سرور Fn راه دور را نصب کنید:
$ 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)
سپس Docker و سرور Fn را به همان روشی که قبلاً در ماشین محلی انجام شد نصب کنید، سرور را راه اندازی کنید:
Fn آماده دریافت توابع است! برای انتقال هدفمند توابع به سرور راه دور، از دستور استفاده خواهیم کرد deploy از رایانه محلی با حذف پرچم --local.
علاوه بر این، Fn از شما می خواهد که مکان سرور Fn و رجیستری Docker را مشخص کنید. این گزینه ها را می توان از طریق متغیرهای محیطی تنظیم کرد FN_API_URL и FN_REGISTRY به ترتیب، اما همچنین راه راحت تری برای مدیریت آسان ایجاد و مدیریت تنظیمات برای استقرار ارائه می دهد.
در اصطلاح Fn، پیکربندی برای استقرار نامیده می شود context. دستور زیر زمینه را ایجاد می کند:
می توانید زمینه های موجود را به این صورت مشاهده کنید:
$ 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
از اینجا به بعد، تحویل ویژگی Fn تصاویر Docker را با استفاده از حساب انتخابی DockerHub دانلود می کند (در مورد من - 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 .
محاسبات بدون سرور یک راه حل مناسب برای پیاده سازی سریع بخش های مستقل یک برنامه کاربردی است که با برنامه های کاربردی یا میکروسرویس های پیچیده تر تعامل دارند.
این اغلب به دلیل هزینه پنهان قفل کردن در فروشنده انتخاب شده است، که بسته به مورد استفاده و حجم خاص، می تواند منجر به هزینه های بالاتر و کاهش انعطاف پذیری در آینده شود.
معماری ابری چند ابری و ترکیبی نیز در این مورد آسیب می بیند، زیرا شما به راحتی می توانید در موقعیتی قرار بگیرید که بخواهید از محاسبات بدون سرور استفاده کنید، اما به دلیل سیاست های شرکت ممکن است این امکان وجود نداشته باشد.
استفاده از Fn بسیار آسان است و می تواند تقریباً همان رابط FaaS را با سربار کمی ارائه دهد. هر گونه قفل فروشنده را حذف می کند و می تواند به صورت محلی یا در هر ارائه دهنده راه حل ابری مناسب مورد نظر شما نصب شود. در انتخاب زبان برنامه نویسی نیز آزادی وجود دارد.
این مقاله فقط اصول اولیه Fn را پوشش میدهد، اما ایجاد زمان اجرا برای خودتان بسیار ساده است، و معماری کلی را میتوان با استفاده از متعادلکننده بار Fn یا با قرار دادن Fn در پشت یک پروکسی برای محافظت، بهطور گستردهتر اجرا کرد.