คุณสมบัติทั่วไปอีกประการหนึ่งคือแนวโน้มที่จะย่อเล็กสุดและโฟกัสโค้ด ซึ่งเป็นเหตุผลว่าทำไมบางครั้งการประมวลผลแบบไร้เซิร์ฟเวอร์จึงถูกเรียกว่าฟังก์ชันเป็นบริการ (FaaS)
ในอดีต ผู้ให้บริการระบบคลาวด์รายแรกที่เสนอ FaaS กับ AWS Lambda คือ Amazon จึงเป็นที่มาของชื่อ ผู้ให้บริการคลาวด์รายอื่นก็มีผู้ให้บริการที่คล้ายกัน:
- ฟังก์ชั่นคลาวด์จาก Google
- ฟังก์ชัน Azure จาก Microsoft
บริษัทเหล่านี้ทั้งหมดให้บริการการประมวลผลแบบไร้เซิร์ฟเวอร์ ปรับขนาดอัตโนมัติ และจ่ายเฉพาะส่วนที่คุณใช้จริงเท่านั้น แต่บริษัทเหล่านี้จะล็อคลูกค้าให้เข้าถึงผลิตภัณฑ์ที่เป็นกรรมสิทธิ์ของตน อย่างไรก็ตาม มีทางเลือกโอเพ่นซอร์สฟรีสำหรับการประมวลผลแบบไร้เซิร์ฟเวอร์ เป็นที่น่าสังเกตว่า:
- แพลตฟอร์ม
อาปาเช่ OpenWhisk ที่ถูกพัฒนาในตู้ฟักโดยไอบีเอ็ม ฟังก์ชั่นสปริงคลาวด์ ซึ่งเป็นส่วนหนึ่งของระบบนิเวศ Spring Framework ที่ค่อนข้างสมบูรณ์ ซึ่งสามารถใช้เป็นส่วนหน้าสำหรับ AWS Lambda, Azure Functions และ OpenWhisk ได้ด้วยโครงการเอฟเอ็น ซึ่งได้รับการสนับสนุนโดยออราเคิล
ทั้งหมดเป็นอิสระจากคลาวด์โดยสิ้นเชิง กล่าวคือ สามารถติดตั้งได้บนคลาวด์ใดก็ได้ รวมถึงของคุณเอง สาธารณะหรือส่วนตัว และแน่นอนใน Exoscale
โครงการ Fn ทำงานอย่างไร
Fn มีพื้นฐานมาจาก Docker โดยสมบูรณ์ ประกอบด้วยองค์ประกอบหลัก XNUMX ส่วน:
- โปรแกรม CLI ออกแบบมาเพื่อจัดการโครงสร้างพื้นฐาน Fn ทุกด้าน และโต้ตอบกับเซิร์ฟเวอร์ Fn
- เซิร์ฟเวอร์ Fn นั้นเป็นแอปพลิเคชันทั่วไปที่บรรจุอยู่ในคอนเทนเนอร์นักเทียบท่า
ฟังก์ชันที่ใช้งานใน Fn จะถูกดำเนินการในคอนเทนเนอร์ที่แยกจากกันด้วย ซึ่งช่วยให้คุณรองรับภาษาการเขียนโปรแกรมได้มากมาย เช่น... Clojure!
อาร์กิวเมนต์ของฟังก์ชันจะถูกส่งผ่านไปยังอินพุตมาตรฐาน (STDIN) ผลลัพธ์จะถูกเขียนไปยังเอาต์พุตมาตรฐาน (STDOUT) หากอาร์กิวเมนต์หรือค่าที่ส่งคืนไม่ใช่ค่าธรรมดา (เช่น อ็อบเจ็กต์ JSON) ก็สามารถแปลงได้โดยใช้เลเยอร์นามธรรมที่ Fn เตรียมไว้ให้ในรูปแบบของ Function Development Kit (FDK)
เพื่อความสะดวก มีการเสนอชุดเทมเพลตในตัวเพื่ออำนวยความสะดวกในการปรับใช้ FaaS ในรายการภาษาต่างๆ และเวอร์ชันต่างๆ มากมาย (Go, Java เวอร์ชันต่างๆ, Python ฯลฯ )
การสร้าง FaaS เป็นเรื่องง่ายโดยทำตามแผนภาพนี้:
- การปรับใช้ฟังก์ชันโดยใช้ Fn CLI: ไฟล์การกำหนดค่าแอปพลิเคชันสำหรับ Fn จะถูกสร้างขึ้นตามเทมเพลตที่เลือก
- เราเปิดตัวฟังก์ชันของเราเองอีกครั้งโดยใช้ CLI Fn: อิมเมจคอนเทนเนอร์จะถูกวางในพื้นที่เก็บข้อมูลบางแห่ง หลังจากนั้นเซิร์ฟเวอร์จะได้รับแจ้งถึงการมีอยู่และตำแหน่งของอิมเมจนี้
หลักการส่งฟังก์ชันให้กับ Fn
การติดตั้งและการทดสอบฟังก์ชันแบบไร้เซิร์ฟเวอร์ในเครื่อง
มาเริ่มการติดตั้ง Fn บนเครื่องโลคัลกันดีกว่า ขั้นแรก ให้ติดตั้ง Docker ตามที่ Fn ต้องการ สมมติว่าเราอยู่บน Debian/Ubuntu:
$ sudo apt-get update
$ sudo apt-get install docker.io
หรือใช้ตัวจัดการแพ็คเกจ/นักเทียบท่าบิลด์ตามระบบของคุณ จากนั้นคุณก็สามารถดำเนินการติดตั้ง Fn CLI ได้โดยตรง ตัวอย่างเช่น การใช้ curl:
$ curl -LSs https://raw.githubusercontent.com/fnproject/cli/master/install | sh
หากคุณใช้ OSX โดยติดตั้ง Homebrew คุณสามารถไปอีกทางหนึ่งได้:
$ 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
ตอนนี้เราพร้อมที่จะปรับใช้ฟังก์ชันของเราเป็นครั้งแรกโดยใช้ CLI เพื่อความง่าย เราจะใช้สภาพแวดล้อมการเปิดตัวในตัว เช่น โหนด:
$ 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 และตั้งค่าเทมเพลตสำหรับโค้ดในภาษาที่คุณเลือก
ในกรณีของรันไทม์ของโหนด หมายความว่า:
$ 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
หากต้องการเรียกใช้ฟังก์ชันของเรา จะต้อง "เปิดตัว" สิ่งนี้ต้องการ имя приложения
: ใน 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 invoke fnexo hellonode # вызываем функцию hellonode приложения fnexo
{"message":"Hello World"}
หากต้องการเรียกใช้ฟังก์ชันโดยตรง คุณต้องทราบ URL แบบเต็ม:
$ curl http://localhost:8080/t/fnexo/hellonode-trigger
{"message":"Hello World"}
เซิร์ฟเวอร์ Fn เปิดเผยฟังก์ชันบนพอร์ต 8080 และ URL ของฟังก์ชันดูเหมือนจะตรงกับรูปแบบ t/app/function
แต่ไม่สมบูรณ์ ผ่าน HTTP ฟังก์ชันจะไม่ถูกเรียกโดยตรง แต่ผ่านทางทริกเกอร์ที่เรียกว่าซึ่งตามชื่อ "เริ่ม" การเรียกใช้ฟังก์ชัน ทริกเกอร์ถูกกำหนดไว้ใน `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"}
ทุกอย่างทำงานได้! ถึงเวลาที่จะไปสู่การทดลองเต็มรูปแบบและเผยแพร่ FaaS ของเราบนเซิร์ฟเวอร์!
การติดตั้งบริการฟังก์ชันไร้เซิร์ฟเวอร์บนโครงสร้างพื้นฐานของคุณเอง
มาติดตั้งเครื่องเสมือนอย่างรวดเร็วโดยใช้ Exoscale CLI หากคุณยังไม่ได้ตั้งค่าก็สามารถใช้งานได้
$ 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
จากนั้นคุณสามารถ ssh ลงในเครื่องเสมือนและติดตั้งเซิร์ฟเวอร์ 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 ในลักษณะเดียวกับที่ทำไปแล้วบนเครื่องท้องถิ่น เริ่มเซิร์ฟเวอร์:
$ 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
Fn พร้อมรับฟังก์ชั่นแล้ว! สำหรับการถ่ายโอนฟังก์ชันแบบกำหนดเป้าหมายไปยังเซิร์ฟเวอร์ระยะไกล เราจะใช้คำสั่ง deploy
จากเครื่องคอมพิวเตอร์โดยละเว้นแฟล็ก --local
.
นอกจากนี้ Fn ยังกำหนดให้คุณต้องระบุตำแหน่งของเซิร์ฟเวอร์ Fn และรีจิสทรี Docker ตัวเลือกเหล่านี้สามารถตั้งค่าได้ผ่านตัวแปรสภาพแวดล้อม FN_API_URL
и FN_REGISTRY
ตามลำดับ แต่ยังนำเสนอวิธีที่สะดวกกว่าในการจัดการการสร้างและการจัดการการกำหนดค่าสำหรับการปรับใช้ได้อย่างง่ายดาย
ในแง่ Fn เรียกว่าการกำหนดค่าสำหรับการปรับใช้ 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
จากนี้ไป การส่งมอบฟีเจอร์ 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 .
ในที่สุด:
$ curl http://185.19.30.175:8080/t/fnexo/hellonode
{"message":"Hello World"}
วงจรการใช้งานฟังก์ชันในคอมพิวเตอร์แบบไร้เซิร์ฟเวอร์ที่ใช้ Fn
ข้อดีของการประมวลผลแบบไร้เซิร์ฟเวอร์ตามความสามารถของคุณเอง
การประมวลผลแบบไร้เซิร์ฟเวอร์เป็นโซลูชันที่สะดวกสำหรับการนำส่วนที่เป็นอิสระของแอปพลิเคชันไปใช้งานอย่างรวดเร็ว ซึ่งโต้ตอบกับแอปพลิเคชันหรือไมโครเซอร์วิสที่ซับซ้อนมากขึ้น
สาเหตุนี้มักเกิดจากต้นทุนที่ซ่อนอยู่ในการล็อกเข้ากับผู้จำหน่ายที่เลือก ซึ่งอาจนำไปสู่ต้นทุนที่สูงขึ้นและลดความยืดหยุ่นในอนาคต ทั้งนี้ขึ้นอยู่กับกรณีการใช้งานและปริมาณเฉพาะ
สถาปัตยกรรมมัลติคลาวด์และไฮบริดคลาวด์ก็ประสบปัญหาเช่นกัน ในกรณีนี้ เนื่องจากคุณจะพบว่าตัวเองอยู่ในสถานการณ์ที่คุณต้องการใช้การประมวลผลแบบไร้เซิร์ฟเวอร์ได้อย่างง่ายดาย แต่เนื่องจากนโยบายขององค์กร จึงอาจไม่สามารถทำได้
Fn ค่อนข้างใช้งานง่ายและมีอินเทอร์เฟซ FaaS เกือบเหมือนกันโดยมีค่าใช้จ่ายเพียงเล็กน้อย ช่วยลดการล็อคอินของผู้จำหน่าย และสามารถติดตั้งภายในเครื่องหรือในผู้ให้บริการโซลูชันคลาวด์ที่สะดวกสบายที่คุณเลือกได้ นอกจากนี้ยังมีอิสระในการเลือกภาษาการเขียนโปรแกรม
บทความนี้ครอบคลุมเฉพาะพื้นฐานของ Fn เท่านั้น แต่การสร้างรันไทม์ของคุณเองนั้นค่อนข้างง่าย และสถาปัตยกรรมโดยรวมสามารถปรับใช้ในวงกว้างมากขึ้นโดยใช้โหลดบาลานเซอร์ Fn หรือโดยการวาง Fn ไว้ด้านหลังพร็อกซีเพื่อป้องกัน
ที่มา: will.com