Devahoy Logo
PublishedAt

WASM

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

บันทึกการลองเล่น 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 คือ

  1. โหลด latest release แล้วมาแตกไฟล์เอง
  2. ติดตั้งผ่าน cargo
  3. ติดตั้งด้วย Makefile

สำหรับผมเลือกติดตั้ง ผ่าน make ครับ

Terminal window
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 คำสั่งอื่นๆ:

1
./target/release/spin --help

จากนั้น ก็เพิ่ม PATH เพื่อให้ ใช้คำสั่ง spin ได้จากทุกๆ directory โดยผมใช้ ZSH ก็เลยเพิ่มไปในไฟล์ .zshrc

1
export PATH="$PATH:/Users/<YOUR_FOLDER>/spin/target/release"

Reload หรือเปิด Terminal ใหม่

1
source ~/.zshrc

ทีนี้ spin เราก็เรียกจาก ที่ไหนก็ได้แล้ว โดยไม่ต้องเข้าไป .target/release/spin

1
spin --version

ผลลัพธ์

1
spin 0.3.0 (9a49057 2022-07-06)

Hello Spin

สร้าง Project ขึ้นมาใหม่ด้วย template แต่เรายังไม่มี template เลย ก็ทำการ install template ก่อน

1
spin templates install --git https://github.com/fermyon/spin

เช็คว่า มี template เรียบร้อยแล้ว:

1
spin template list

จะได้ผลลัพธ์แบบนี้

1
| Name Description |
2
+===================================================+
3
| http-go HTTP request handler using (Tiny)Go |
4
| http-rust HTTP request handler using Rust |
5
| redis-go Redis message handler using (Tiny)Go |
6
| redis-rust Redis message handler using Rust |
7
+---------------------------------------------------+

จากนั้น ผมก็ทำการสร้างโปรเจ็คโดยใช้ template http-rust

1
spin new http-rust hello-spin

จากนั้นก็ตอบคำถาม ตั้งชื่อ name, description กำหนด HTTP base และ path:

1
Project description: Hello Spin
2
Project name: hello-spin
3
HTTP base: /
4
HTTP path: /hello

จะได้โฟลเดอร์ hello-spin ที่เราสร้างขึ้น ลองสำรวจซักหน่อย ข้างในก็จะมีไฟล์ประมาณนี้

1
├── Cargo.toml
2
├── spin.toml
3
└── src
4
└── lib.rs
5
6
1 directory, 3 files

ตัวไฟล์ spin.toml ข้างในจะกำหนด WebAssembly components และตัว triggers

Cargo.toml
1
spin_version = "1"
2
description = "Hello Spin"
3
name = "hello-spin"
4
trigger = { type = "http", base = "/" }
5
version = "0.1.0"
6
7
[[component]]
8
id = "hello-spin"
9
source = "target/wasm32-wasi/release/hello_spin.wasm"
10
[component.trigger]
11
route = "/hello"
12
[component.build]
13
command = "cargo build --target wasm32-wasi --release"

จะเห็นว่า เรามีกำหนด component hello-spin และตัว source ก็คือ hello_spin.wasm ไฟล์ที่เราจะได้หลังจาก build release ส่วน route ก็จะเป็น /hello

ทดลอง build project

1
spin build

Running application

ลอง start server ด้วย spin up ครับ จะได้เว็บ http://localhost:3000/hello

1
spin up

ลอง curl ดูผลลัพธ์หรือเปิดหน้าเว็บดูก็ได้

1
curl -i http://localhost:3000/hello

ได้ผลลัพธ์

1
HTTP/1.1 200 OK
2
foo: bar
3
content-length: 14
4
date: Sat, 09 Jul 2022 07:36:37 GMT
5
6
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
avatar

Chai Phonbopit

เป็น Web Dev ในบริษัทแห่งหนึ่ง ทำงานมา 10 ปีกว่าๆ ด้วยภาษาและเทคโนโลยี เช่น JavaScript, Node.js, React, Vue และปัจจุบันกำลังสนใจในเรื่องของ Blockchain และ Crypto กำลังหัดเรียนภาษา Rust

Related Posts