บันทึกการลองเล่น Spin
วันนี้ได้ลองหัดเล่นตัว Spin ก็เลยนำมาเขียนบันทึกเป็นการเรียนรู้เอาไว้ครับ ซึ่งจริงๆแล้วตัว Spin มันก็ยังเป็น early preview อยู่นะครับ เนื่องจากช่วงนี้ผมสนใจ Rust และ WASM ก็เลยได้เจอ Spin ผ่านๆ และอยากลองเล่นดูซักหน่อย
สำหรับแหล่งอ้างอิง, Docs และตัวอย่างเพิ่มเติม
ณ วันที่เขียนบทความคือ spin 0.3.0 ซึ่งในอนาคตอาจจะมี breaking changes ก็ได้ เนื่องจากยังเป็น Early Preview / Experimental code อยู่
Spin คืออะไร?
Spin is a framework for building and running event-driven microservice applications with WebAssembly (Wasm) components
ก็คือมองว่า เราสามารถ Run App ที่เราเขียนขึ้นจากภาษาอะไรก็ได้ (ที่มันสามารถแปลงเป็น WebAssembly ได้) ก็สามารถใช้งาน Spin ได้ เพราะตัวอย่าง ก็มีทั้ง Go และ Rust รวมถึงภาษาอื่นๆด้วย เหมือนเป็น Serverless เวอร์ชั่น WebAssembly
Prerequisites
- ติดตั้ง Rust และ Cargo เรียบร้อยแล้ว (แนะนำใช้ rustup)
- (Optional) ติดตั้ง Apple's Command Line Tools (กรณีติดตั้ง spin ด้วย Make)
- ใช้
wasm32-wasi
เพิ่มได้ด้วยคำสั่งrustup target add wasm32-wasi
การติดตั้ง spin
ถ้าจาก Docs มีวิธีการติดตั้งหลายท่าครับ Quickstart คือ
- โหลด latest release แล้วมาแตกไฟล์เอง
- ติดตั้งผ่าน
cargo
- ติดตั้งด้วย Makefile
สำหรับผมเลือกติดตั้ง ผ่าน make
ครับ
git clone https://github.com/fermyon/spin -b v0.3.0
cd spin & make build
rustup target add wasm32-wasi
cargo install --path .
ช่วง build จะใช้เวลาซักพัก และ CPU วิ่งไป 100% ทำเอาพัดลมของ Macbook M1 ดังเลยแฮะ เมื่อติดตั้งเสร็จ เราสามารถใช้คำสั่ง spin
ได้แล้ว ทดสอบ เช็ค version ดู หรือดู help คำสั่งอื่นๆ:
./target/release/spin --help
จากนั้น ก็เพิ่ม PATH เพื่อให้ ใช้คำสั่ง spin
ได้จากทุกๆ directory โดยผมใช้ ZSH ก็เลยเพิ่มไปในไฟล์ .zshrc
export PATH="$PATH:/Users/<YOUR_FOLDER>/spin/target/release"
Reload หรือเปิด Terminal ใหม่
source ~/.zshrc
ทีนี้ spin เราก็เรียกจาก ที่ไหนก็ได้แล้ว โดยไม่ต้องเข้าไป .target/release/spin
spin --version
ผลลัพธ์
spin 0.3.0 (9a49057 2022-07-06)
Hello Spin
สร้าง Project ขึ้นมาใหม่ด้วย template แต่เรายังไม่มี template เลย ก็ทำการ install template ก่อน
spin templates install --git https://github.com/fermyon/spin
เช็คว่า มี template เรียบร้อยแล้ว:
spin template list
จะได้ผลลัพธ์แบบนี้
| Name Description |
+===================================================+
| http-go HTTP request handler using (Tiny)Go |
| http-rust HTTP request handler using Rust |
| redis-go Redis message handler using (Tiny)Go |
| redis-rust Redis message handler using Rust |
+---------------------------------------------------+
จากนั้น ผมก็ทำการสร้างโปรเจ็คโดยใช้ template http-rust
spin new http-rust hello-spin
จากนั้นก็ตอบคำถาม ตั้งชื่อ name, description กำหนด HTTP base และ path:
Project description: Hello Spin
Project name: hello-spin
HTTP base: /
HTTP path: /hello
จะได้โฟลเดอร์ hello-spin
ที่เราสร้างขึ้น ลองสำรวจซักหน่อย ข้างในก็จะมีไฟล์ประมาณนี้
├── Cargo.toml
├── spin.toml
└── src
└── lib.rs
1 directory, 3 files
ตัวไฟล์ spin.toml
ข้างในจะกำหนด WebAssembly components และตัว triggers
spin_version = "1"
description = "Hello Spin"
name = "hello-spin"
trigger = { type = "http", base = "/" }
version = "0.1.0"
[[component]]
id = "hello-spin"
source = "target/wasm32-wasi/release/hello_spin.wasm"
[component.trigger]
route = "/hello"
[component.build]
command = "cargo build --target wasm32-wasi --release"
จะเห็นว่า เรามีกำหนด component hello-spin
และตัว source ก็คือ hello_spin.wasm
ไฟล์ที่เราจะได้หลังจาก build release ส่วน route ก็จะเป็น /hello
ทดลอง build project
spin build
Running application
ลอง start server ด้วย spin up
ครับ จะได้เว็บ http://localhost:3000/hello
spin up
ลอง curl ดูผลลัพธ์หรือเปิดหน้าเว็บดูก็ได้
curl -i http://localhost:3000/hello
ได้ผลลัพธ์
HTTP/1.1 200 OK
foo: bar
content-length: 14
date: Sat, 09 Jul 2022 07:36:37 GMT
Hello, Fermyon
ต่อจากนี้?
หลังจากเริ่ม Hello World ไป ตัว Doc เค้าก็มี Tutorial การทำ URL Shortener ด้วย Spin เหมือนกัน ก็ว่าจะลองไปนั่งอ่าน และทำตามหลังจากนี้ต่อครับ
และก็ตัวอย่างอื่นๆ spin-kitchensink สามารถดูตัวอย่างเพิ่มเติมได้ มีทั้งแบบการเขียนด้วยภาษาต่างๆ เช่น AssemblyScript, C#, Go, Python, Rust, Zig ด้วยตัวอย่างหลายๆแบบ:
- แอพ Hello World ธรรมดา
- ตัวอย่างการ serve static assets
- การ send HTTP Request
หรือตัวอย่างจาก ภาษาอื่นๆ เพิ่มเติม Building Spin components in other languages
จบไปแล้วกับบันทึกสั้นๆ แม้ว่าทั้งหมด จะทำตาม Tutorial พื้นฐาน แต่ก็สนุกดี ได้ลองลงมือทำ ถือว่าได้ลองเล่นอะไรเล็กๆน้อยๆ ช่วงเช้าของวันหยุดไปละกัน 🤣
Happy Coding ❤️
- Authors
- Name
- Chai Phonbopit
- Website
- @Phonbopit