Giới thiệu thư viện hono.dev - Tạo máy chủ API dễ dàng trên serverless

Giới thiệu thư viện hono.dev - Tạo máy chủ API dễ dàng trên serverless

Threads
  • Tuôi" để ý là cứ đợt nào ham đọc cái là lại lười viết, tuần nay tuôi đang đọc một lúc 3 cuốn, à phải là đọc 2 và nghe 1.

    Cuốn sách ám ảnh nhất đến thời điểm hiện tại: Đại dương đen - thuật lại 12 câu chuyện của 12 người mắc bệnh trầm cảm. Thần kinh vững, nhưng mới đọc 2 câu truyện đầu thôi mà cảm giác ngộp thở, bứt rứt thật khó tả 😰

    Câu chuyện tiếp theo đó thì mang lại cảm giác dễ thở hơn vì họ kiểm soát được bản thân. Nhưng sang tiếp câu chuyện thứ 4, thứ 5 thì lại như một có một bàn tay siết họng mình lại. Không thể nhắm mắt mà nghe được á, có gì đó rất đáng sợ.

    Một câu mà mình cảm thấy ám ảnh nhất là khi ba mẹ của người mắc trầm cảm luôn miệng hỏi tại sao con lại như thế mỗi khi sắp lên cơn và gào thét. Họ chỉ đành bất lực trả lời là "Làm sao mà con biết! Cũng giống như hỏi một người bị ốm là tại sao lại ốm? Làm sao mà biết được chứ! Có ai muốn đâu!".

    » Xem thêm
  • Mistral.ai là một công ty AI có trụ sở tại Pháp, được biết đến với nhiều mô hình ngôn ngữ lớn Mistral. Mới đây họ vừa ra mắt thêm một số mô hình có kích thước siêu lớn, siêu mạnh... Nhưng tạm khoan nói đến vì Mistral Chat cũng vừa được ra mắt với nhiều tính năng hay ho tương tự như Chat GPT mà lại miễn phí 😇

    » Xem thêm
  • Qwen2.5-Coder-32B đang là tâm điểm của sự chú ý khi điểm số của nó đánh bại cả GPT-4o hay kể cả là Claude Sonet 3.5. Điều đáng chú ý là nó là mã nguồn mở. Điều đó đồng nghĩa với việc bạn hoàn toàn có thể kéo models về máy và chạy cục bộ dưới máy tính của mình. Nhưng...

    Để chạy được mô hình thì GPU máy tính phải đạt cấp độ quái vật. Cụ thể trong một bài đăng của người dùng thử nghiệm Qwen2.5-Coder-32B trên GTX 3090 thì tốc độ tối đa models cho ra nằm ở mức hơn 30 tokens/s.

    Hy vọng vài nữa sẽ có một bên như Groq hay SambaNova dựng lên để "kiểm thử" hiệu năng con chip của họ, và quan trọng hơn hết là cho anh em dùng "chùa" thì hay biết mấy 🫣

    Tham khảo: Qwen2.5-Coder-32B is an LLM that can code well that runs on my Mac

    » Xem thêm

Vấn đề

Express.js chắc hẳn là một thư viện mà bất kỳ lập trình viên JavaScript/Node.js đều biết. Nó giúp chúng ta xây dựng một máy chủ API theo tiêu chuẩn REST một cách nhanh chóng. Bên cạnh đó là rất nhiều thư viện hay middleware được tạo ra để tương thích và dễ dàng tích hợp vào trong các dự án sử dụng express.js, làm cho nó ngày càng trở nên phổ biến, cũng như được nhiều người biết đến.

Bắt đầu với express.js cũng không hề khó. Chỉ cần qua vài bước cài đặt thư viện và viết một ít mã, rồi sử dụng lệnh node để khởi động máy chủ. Quá trình deploy cũng không khó khăn hơn là mấy. Đẩy mã lên git, từ máy chủ "pull" về, sử dụng một công cụ quản lý tiến trình như pm2 khởi động lên thế là xong.

Đấy là một quy trình gần như là điều hiển nhiên để áp dụng trong trường hợp viết và triển khai một máy chủ Node. Kể cả sau này đi làm việc ở nhiều công ty, cái công đoạn "push" mã lên git, "pull" về máy chủ rồi "pm2 restart" mà tôi gọi vui là quy trình 3P để vận hành máy chủ.

Cho đến một ngày, bất chợt anh CTO nhắc đến Cloudflare Workers, một dạng của serverless. Nào là nó làm được cái này, làm được cái kia... mỗi ngày một ít và khiến tôi trở nên tò mò. Thi thoảng mỗi khi anh nhắc lại lên mạng đọc nhưng thú thật nó thật là khó hiểu. Mặc dù ai cũng biết khái niệm về serverless nhưng tính ứng dụng của nó trong thực tế là như thế nào thì lại không biết.

Cái gì được nhắc đến nhiều lần thì cũng gây được sự chú ý. Tôi bắt đầu đọc các bài viết về serverless một cách nghiêm túc hơn, nhưng cũng chỉ là đọc trên cơ sở lý thuyết. Còn không biết cách để triển khai mã lên cái gọi là serverless thì phải làm như thế nào. Bởi vì serverless là không có máy chủ, vậy thì push - pull - pm2 restart lúc này được thực hiện ở đâu?

À hoá ra có hẳn một quy trình riêng dành cho việc deploy mọi thứ lên serverless. Thậm chí quá trình này còn đơn giản hơn nhiều so với cách 3P truyền thống. Tất cả những chỉ cần làm chỉ là chạy một lệnh deploy ở dưới máy của mình. Khi đó tất cả mã nguồn sẽ được tải lên máy chủ serverless và sẵn sàng để được chạy ngay lập tức.

Trong phạm vi bài viết này, tôi sẽ tạm thời không đề cập đến quá trình triển khai mã lên máy chủ serverless. Mà trước tiên cần phải biết đến một thư viện giúp chúng ta xây dựng API trên serverless. Tại sao ư? Tại vì express.js và các thư viện tương tự khác không thể chạy được trên nhiều máy chủ serverless.

hono.dev

hono.dev là một thư viện tương tự express.js, nó cung cấp giải pháp để xây dựng API. Nhưng tại sao lại cần hono? Thì hãy nhìn vào hướng dẫn tạo một endpoint đơn giản dưới đây của Cloudflare Workers:

export default {  
  async fetch(request, env, ctx) {  
    return new Response("Hello World!");  
  },  
};  

Đoạn mã này sẽ phản hồi lại cụm từ "Hello World!". Nếu muốn thêm một method POST thì cần phải kiểm tra thêm điều kiện:


export default {  
  async fetch(request, env, ctx) {  
    if (request.method === "GET") {  
      return new Response("Hello World!");  
    } else if (request.method === "POST") {  
      const data = await request.json();  
      return new Response(`Hello, ${data.name}!`);  
    }  
  },  
};  

Quá rườm rà và phức tạp, một máy chủ API không đơn giản chỉ như thế, mà nó còn là tập hợp của hàng chục, hàng trăm endpoint khác nhau. Đây là lúc hono phát huy tác dụng.

import { Hono } from 'hono'  
const app = new Hono()  

app.get('/', (c) => c.text('Hello World!'))  
app.post('/', (c) => c.text(`Hello ${(await c.req.body()).name}`))  

export default app  

Thật nhanh gọn phải không!

Hono.dev khá giống với express.js hoặc koa.js. Hono tập trung vào sự đơn giản, router và cả middleware. Sử dụng hono khá tương đồng với các thư viện REST API mà bạn đang sử dụng lâu nay.

Ví dụ một middleware đơn giản để đo thời gian xử lý của request:

app.use(async (c, next) => {  
  const start = Date.now()  
  await next()  
  const end = Date.now()  
  c.res.headers.set('X-Response-Time', `${end - start}`)  
});  

Hono rất nhẹ, chỉ 14kb cho gói hono/tiny khiến nó lý tưởng cho môi trường có nhiều hạn chế như serverless. Với cách triển khai ứng dụng trên máy chủ thông thường, kích thước gói hoặc kích thước thư viện không thành vấn đề vì tài nguyên hệ thống dồi dào, dễ nâng cấp. Nhưng trong môi trường serverless thì không được như thế, tài nguyên hạn hẹp nên việc tìm kiếm các thư viện nhanh và nhẹ là điều hết sức cần thiết.

Có thể bạn đã nghe đến cụm từ universal module và adapter, chúng thường được dùng để chỉ một modules có thể hoạt động trong nhiều môi trường khác nhau. Từ máy chủ, trình duyệt hay thậm chí là trong cả môi trường serverless. Để làm được điều đó, universal module tận dụng những API mà môi trường hỗ trợ để thích nghi, hoặc tạo ra các adapter để chúng ta chủ động lựa chọn. Thậm chí nếu cấu trúc dự án đủ tốt thì không cần phải sửa quá nhiều mã để chạy trong các môi trường khác nhau.

Hono hỗ trợ nhiều adapter và điều đó làm cho nó hoàn hảo trong môi trường serverless. Một vài cái tên nổi bật có thể kể đến như là Cloudflare Workers, Vercel, Netlify, AWS Lambda... hay thậm chí là cả Service Worker ở trong trình duyệt.

Ví dụ một đoạn mã chạy tốt trong môi trường Cloudflare Worker dưới đây:

import { Hono } from 'hono'  
const app = new Hono()  

app.get('/', (c) => {  
  return c.text('Hello Hono!') 
})  

export default app  

Thì để chuyển sang môi trường serverless của Netlify thì cần thay đổi Adatper:

import { Hono } from 'jsr:@hono/hono'  
import { handle } from 'jsr:@hono/hono/netlify'  

const app = new Hono()  
app.get('/', (c) => {  
  return c.text('Hello Hono!')  
})

export default handle(app)  

Lưu ý vì môi trường serverless có cách triển khai khác nhau cho nên cách tốt nhất để lựa chọn được cách cấu hình phù hợp với từng môi trường là tham khảo tài liệu của Hono.

Tài liệu của Hono cũng hết sức đơn giản và ngắn gọn, chỉ cần đọc vài lượt là có thể bắt đầu dựng ngay một dự án. Các Middleware "cây nhà lá vườn" liên tục được bổ sung để làm tăng thêm trải nghiệm cho các nhà phát triển, không cần phải phát minh lại bánh xe nữa. Ngoài ra, Hono cũng đang nhận được sự quan tâm của cộng đồng khi có tốc độ tăng trưởng trên Github rất ấn tượng.

Đây là một bài viết ngắn giới thiệu về Hono và cả những gì nó làm được. Trong bài viết sau, chúng ta sẽ cùng nhau triển khai từ đầu đến cuối một máy chủ API lên Cloudflare Workers nhé!

hoặc
* Bản tin tổng hợp được gửi mỗi 1-2 tuần, huỷ bất cứ lúc nào.
Author

Xin chào, tôi tên là Hoài - một anh Dev kể chuyện bằng cách viết ✍️ và làm sản phẩm 🚀. Với nhiều năm kinh nghiệm lập trình, tôi đã đóng góp một phần công sức cho nhiều sản phẩm mang lại giá trị cho người dùng tại nơi đang làm việc, cũng như cho chính bản thân. Sở thích của tôi là đọc, viết, nghiên cứu... Tôi tạo ra trang Blog này với sứ mệnh mang đến những bài viết chất lượng cho độc giả của 2coffee.dev.Hãy theo dõi tôi qua các kênh LinkedIn, Facebook, Instagram, Telegram.

Bạn thấy bài viết này có ích?
Không

Bình luận (0)

Nội dung bình luận...