當 Web 應用程式變得越來越大時,開發和維護系統的複雜性也隨之增加。解決此問題的常見方法是使用微服務架構,開發人員將系統分解為更小的、管理良好的元件,這些元件可以單獨管理和擴展。
為了有效地做到這一點,使用微服務框架通常很有幫助。但選擇原生支援微服務的正確框架可能具有挑戰性。在本文中,我們將看看 Encore.ts 和 Nest.js 作為兩個相關的替代方案,因為它們都原生支援微服務架構和 TypeScript。
Encore.ts 是一個較新的開源框架,以其高效能、類型安全和可觀察性功能而脫穎而出。另一方面,Nest.js 引領了用於建立微服務應用程式的 TypeScript 框架。每個框架都有強大的功能,因此我們將從架構、效能和可擴展性方面檢查每個框架,並解釋如何確定哪個最適合您。
開始之前,我們先來看看下圖的基準資料:
基準資料顯示,Encore.ts 在沒有驗證的情況下每秒可以處理 121,005 個請求,在有模式驗證的情況下每秒可以處理 107,018 個請求。這比傳統框架快得多。例如,在沒有驗證的情況下,帶有 Zod 的 Express.js 每秒只能命中約 15,707 個請求,而在經過驗證的情況下,每秒只能命中 11,878 個請求。因此,Encore.ts 比 Express 快大約 9 倍,Nestjs 是基於 Express 建置的。
當您開始一個專案時,您需要一個不僅功能強大而且易於開發人員使用的框架。 Encore.ts 和 NestJS 在內建了 Typescript 支援的微服務框架中脫穎而出,但它們以自己獨特的方式運作。
Encore.ts 是一個開源雲端原生框架,專為具有內建基礎設施自動化的後端開發而設計。它允許您使用聲明性基礎設施庫建立模組化分散式系統。
Encore.ts 在 Rust 運行時上運行 ****透過 napi 與 Node.js 集成,在處理 I/O 和多執行緒方面具有出色的性能,同時允許您在 TypeScript 中編寫邏輯。
以下是如何在 Encore.ts 中定義服務的簡單範例:
import { Service } from "encore.dev/service"; export default new Service("hello");
建立此 hello 服務後,Encore.ts 會自動將整個目錄視為服務的一部分 — 無需額外配置。
另一方面,NestJS 有自己的風格。它是一個靈活的 TypeScript 框架,可讓您完全控制建立應用程式的方式,讓您可以自由地以自己的方式建立事物。
雖然它不處理基礎設施自動化,但 NestJS 可以輕鬆地與幾乎任何第三方庫集成,這為不同的項目開闢了很多可能性。
以下是如何在 NestJS 中定義類似的服務:
import { Service } from "encore.dev/service"; export default new Service("hello");
NestJS 為您提供了更大的靈活性,但沒有 Encore.ts 中的內建自動化功能。
框架的架構決定如何隨著時間的推移建立和維護應用程式。 Encore.ts 和 NestJS 都很強大,但它們的核心理念不同。
Encore.ts 固執己見,*雲端優先,使其成為具有許多微服務的大型類型安全*分散式系統的理想選擇。其突出功能之一是對 Pub/Sub 的本機支持,從而無縫地實現事件驅動架構。
以下是如何使用 Pub/Sub 在 Encore.ts 中定義事件驅動服務:
import { Controller, Get } from '@nestjs/common'; @Controller('hello') export class HelloWorldController { @Get() sayHello(): string { return 'Hello, World!'; } }
NestJS 雖然能夠支援微服務和事件驅動架構,但提供了更模組化的方法。其核心遵循 MVC 模式,它允許開發人員透過提供對配置的更大控制來以自己的方式建立系統。
例如,以下是如何使用更模組化的方法在 NestJS 中定義服務和事件:
import { Topic, Subscription } from "encore.dev/pubsub"; // Define the event type for order creation export interface OrderCreatedEvent { orderId: string; } // Create a topic for order creation events export const orders = new Topic<OrderCreatedEvent>("orders", { deliveryGuarantee: "at-least-once", }); // Create a subscription to listen for the order creation event export const _ = new Subscription(orders, "process-order", { handler: async (event: OrderCreatedEvent) => { console.log('Order created:', event.orderId); }, });
根據設計,NestJS 對元件如何互動提供了許多控制權,但缺點是更多的樣板程式碼,您還必須自己管理基礎架構配置。
在分散式系統的開發中,框架提供的功能往往會帶來開發過於複雜的風險。
Encore.ts 的突出特點是它提供了在本地開發和雲端環境中自動化基礎設施配置的方法。這包括資料庫、Pub/Sub、cron 作業等等。 Encore.ts 還提供本機開發儀表板,自動產生 API 文件、架構圖和分散式追蹤。它還會產生前端客戶端,包括對 REST API 的 OpenAPI 規範支持,這可以為開發人員節省大量時間。
以下是在 Encore.ts 中定義 REST API 的範例,它也會自動產生 OpenAPI 文件:
import { Service } from "encore.dev/service"; export default new Service("hello");
使用 Encore.ts,當您定義服務時,文件和圖表就會自動可用,無需額外設定。
NestJS 因其靈活性而廣受歡迎。從第一天起,它就輕鬆支援 REST、GraphQL 和 WebSocket,但其受歡迎的主要原因是它可以輕鬆地與第三方程式庫連接。
例如,如果您想添加 GraphQL 支持,這是一個簡單的過程。
import { Controller, Get } from '@nestjs/common'; @Controller('hello') export class HelloWorldController { @Get() sayHello(): string { return 'Hello, World!'; } }
NestJS 讓建立其核心功能變得簡單,但它不提供與 Encore.ts 相同等級的自動化基礎架構和功能。
建構分散式系統時,尤其是大規模分散式系統時,效能至關重要。
Encore.ts 專為高效能而構建,其 Rust 運行時可有效處理 I/O 操作和多執行緒。 Rust 的速度和記憶體安全性使 Encore.ts 比純粹基於 Node.js 的框架具有顯著優勢。在可擴展性方面,Encore.ts 是雲端原生的,可以使用無伺服器架構或 Kubernetes 自動擴展,具體取決於您的部署策略。
另一方面,NestJS 在處理效能和可擴充性方面更為傳統。由於 NestJS 純粹基於 TypeScript 和 JavaScript,因此它依賴於您在設定過程中應用的效能最佳化。擴展 NestJS 應用程式通常涉及手動配置 Kubernetes、Docker 或 AWS Lambda 等無伺服器平台。
雖然 NestJS 在擴展方式方面提供了靈活性,但與 Encore.ts 的內建自動化相比,配置需要更多的手動工作。
讓我們從下圖的基準資料了解 encore.ts 和 Nest.js 的效能差異:
從基準資料來看,encore.ts 在效能方面表現突出,啟動時間僅為 8.3 毫秒,而 NestJS 則需要約 143.7 毫秒,比傳統框架快了近九倍。
如何部署應用程式是任何專案的關鍵考慮因素,尤其是在考慮雲端環境時。
Encore.ts 透過其開源工具或 Encore 雲端平台提供了簡單的部署路徑。使用開源版本,您可以使用 encore build 來建置專案並建立 Docker 映像,然後可以部署在支援 Docker 的任何地方:
import { Topic, Subscription } from "encore.dev/pubsub"; // Define the event type for order creation export interface OrderCreatedEvent { orderId: string; } // Create a topic for order creation events export const orders = new Topic<OrderCreatedEvent>("orders", { deliveryGuarantee: "at-least-once", }); // Create a subscription to listen for the order creation event export const _ = new Subscription(orders, "process-order", { handler: async (event: OrderCreatedEvent) => { console.log('Order created:', event.orderId); }, });
這將建立一個可以部署在任何地方的 Docker 映像。
或者,如果您選擇使用 Encore 雲端平台,它會自動執行整個 CI/CD 管道,透過無伺服器或 Kubernetes 選項直接部署到 AWS 或 GCP 上您自己的雲端。
相較之下,NestJS 需要手動設定才能部署。通常,開發人員使用 Docker 來容器化 NestJS 應用程式並將其部署到他們選擇的雲端提供者。雖然這使您可以控制部署策略,但它需要更多配置 - 即使對於簡單的應用程序,您也需要執行許多步驟:
import { Service } from "encore.dev/service"; export default new Service("hello");
import { Controller, Get } from '@nestjs/common'; @Controller('hello') export class HelloWorldController { @Get() sayHello(): string { return 'Hello, World!'; } }
import { Topic, Subscription } from "encore.dev/pubsub"; // Define the event type for order creation export interface OrderCreatedEvent { orderId: string; } // Create a topic for order creation events export const orders = new Topic<OrderCreatedEvent>("orders", { deliveryGuarantee: "at-least-once", }); // Create a subscription to listen for the order creation event export const _ = new Subscription(orders, "process-order", { handler: async (event: OrderCreatedEvent) => { console.log('Order created:', event.orderId); }, });
您的應用程式變得越大,對多個暫存和測試環境的需求就越多,這種手動配置方法就會變得越繁重 - 維護時間持續增長。
在 Encore.ts 和 NestJS 之間進行選擇時,應根據專案的特定需求做出決定。
Encore.ts 非常適合受益於內建自動化的雲端優先應用程式和大型分散式系統。它的 Rust 支援的運行時和基礎設施管理使其成為事件驅動架構、微服務和高效能應用程式的理想選擇。 Encore 快速發展的社群是支援和尋找整合第三方工具方法的可靠來源。
另一方面,當需要靈活性和客製化時,NestJS 就會大放異彩。它非常適合需要對各個方面進行細粒度控制並且可以接受花時間進行手動配置的企業應用程式。 NestJS 相對廣泛的生態系統和社群支援讓您更容易找到資源和第三方工具。
在 Encore.ts 和 NestJS 之間進行選擇取決於您專案的特定需求。
如果您正在尋找一個簡單、高效能、具有內建自動化功能的雲端原生框架,Encore.ts 是一個絕佳的選擇。它透過自動管理基礎設施來簡化分散式系統的開發,其由 Rust 驅動的效能難以匹敵。
但是,如果您需要一個非常靈活的模組化框架來讓您控制每一個細節,NestJS 可能是您的最佳選擇。其可擴展性和龐大的生態系統使其成為客製化企業解決方案的可靠選擇。
這兩個框架本身都很強大,最好的選擇取決於您是重視性能和簡單性,還是完全的靈活性和控制。
如果效能和簡單性對您的專案很重要,那麼嘗試 Encore.ts 可能是個好主意。而且它都是開源的,因此您可以查看程式碼並在 GitHub 上做出貢獻。
以上是NestJS 與 Encore.ts:為您的 TypeScript 微服務選擇正確的框架的詳細內容。更多資訊請關注PHP中文網其他相關文章!