Devahoy Logo
Published on
WASM

บันทึกการลองเล่น Spin

hello-spin
Discord

วันนี้ได้ลองหัดเล่นตัว 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 คือ

  1. โหลด latest release แล้วมาแตกไฟล์เอง
  2. ติดตั้งผ่าน cargo
  3. ติดตั้งด้วย 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

Cargo.toml
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
Discord