Fast Endpoints 一個基於 REPR 設計模式的 .NET 輕量高性能 API 框架

更新於 發佈於 閱讀時間約 8 分鐘
raw-image

fast endpoints 是一個支援 .NET 6 以上(Nuget 版本清單) 的 API 輕量框架,雖以簡單與高性能為主打,但也提供了很多常用的功能實現,如 Swagger 整合、Jwt 認證、Api 版本控制、APi 速率限制、Api 回應快取…很適合以此為基礎打造 Api 服務。

為什麼選用 Fast Endpoints

Fast Endpoints 有一個很大的優勢在於他的效能與功能使用上的彈性,相較於大部分的開發框架由於要實現較為完善的功能而犧牲了部分的效能與開發上彈性,Fast Endpoints 採用最小化的引入門檻,大部分資源都透過引用 Fast Endpoints Nuget 套件來依照需求引用,如 FastEndpoints.SwaggerFastEndpoints.SecurityFastEndpoints.ClientGen…等,依照需求引用配置。

採用了 REPR Design Pattern 的設計,將 Api 拆解成 Request(請求)、Endpoint(端點)、Response(回應),用這樣的方式來處理 Api 的生命週期與資料處理的模型,這樣單純的模式有助於讓我們專注在更單純的 Request、Response 而不是大量的 ViewModel 轉換或是貧血的 Controller 層。

性能

官方做了幾項測試 ,使用到了 bombardierTechEmpower 這兩套知名的性能測試工具。

詳細數據可以到官方提供的 Benchmarks 中查看,這裡只做簡單的小結論

Fast Endpoints 不是每秒能回應最多請求的,與 ASP NET Minimal API 相比仍然是差了一點,但差距不到明顯,考慮到額外能提供的 Swagger 支援與權限控管的機制,仍然是不算虧。

Fast Endpoints 比 ASP NET MVC Controller 多處理了約 35k 個請求,猜測 MVC 架構有較多的轉換與 middleware 層做事,在沒有業務邏輯的情況下稍慢是合理。

雖然官方做了這些測試,但其實我個人不會太以這標準來做技術選型,我認為現代框架重要的是人的開發效率、高可用性與彈性,如何做到架構好改好測試會是比較重要的問題,況且這是在沒有業務邏輯的單純狀況下做測試,很多時候拖累的不是框架本身,而是沒有最佳化的演算法導致程式做了白工,所以這個參考就好。

開始使用

Fast Endpoints 有提供 FastEndpoints.Template 這個啟動範本,可以直接安裝使用,也有提供很多可以直接使用的模板在 scaffolding 可以依據需求選用。

安裝 FastEndpoints.Template 範本,並且使用 [PROJECT-NAME] 啟動專案。

dotnet new --install FastEndpoints.Template
dotnet new fastendpoints --name [PROJECT-NAME]

但我們這裡以最具彈性的方式來做示範,開發一個簡易的 API
Api 的目的為輸入會員的資料,判斷該會員是不是 Premium 高級會員。

API 的規格會有

  1. Request = totalSpend(會員的累積消費金額)
  2. Endpoint = get_member_is_Premium(得到該玩家是否為 Premium 高級會員)
  3. Response = isPremium(是否為 Premium 高級會員)
  4. Logic = 當累積消費金額大於等於 100000 時就算是 Premium 高級會員

所以第一步我們先建一個空白的專案 (目前是使用 .NET 6 作為示範),並且安裝好 FastEndpoints。

dotnet new web -n fastEndpointsDemoApi
cd fastEndpointsDemoApi
dotnet add package FastEndpoints

我們先將 Program.cs 用以下程式碼覆蓋,主要做的更動是將 FastEndpoints 作為全局的引入套件,在每一個檔案中都會預設 using FastEndpoints 而不需額外指定。

global using FastEndpoints;

var builder = WebApplication.CreateBuilder();
builder.Services.AddFastEndpoints();

var app = builder.Build();
app.UseAuthorization();
app.UseFastEndpoints();
app.Run();

再接下來的資料夾結構可以依據開發的程式類型或習慣來設計,我這裡習慣是建立一個 Endpoints 的資料夾,並在裡面放置其定義的資料模型與功能

raw-image

我們先來定義 Models

namespace fastEndpointsDemoApi.Endpoints.GetMemberIsPremium;

public class Request
{
public decimal TotalSpend { get; set; }
}

public class Response
{
public bool IsPremium { get; set; }
}

再來定義 Endpoint

namespace fastEndpointsDemoApi.Endpoints.GetMemberIsPremium;

public class Endpoint : Endpoint<Request>
{
public override void Configure()
{
Get("/get_member_is_premium");
AllowAnonymous();
}

public override async Task HandleAsync(Request req, CancellationToken ct)
{
var response = new Response
{
IsPremium = req.TotalSpend >= 100000
};

await SendAsync(response, cancellation: ct);
}
}

我們現在已經完成了一個 端點為 get_member_is_premium 並且可以透過輸入已經儲值的金額判斷是否為 premium 的 API 了,我們馬上來試一下

找不到很正常,因為我們根目錄的確沒寫東西

找不到很正常,因為我們根目錄的確沒寫東西

100 尚未達到 premium 的門檻

100 尚未達到 premium 的門檻

我們來測一下 100000

100000 達到 premium 的門檻,所以回傳了 true

100000 達到 premium 的門檻,所以回傳了 true

至此我們完成了一個簡易的 API,沒有呼叫資料庫所以基本上不會是很常見的 API 型式,我們把這命名為 NoDatabaseApi ,完整的程式碼可以在 這裡 找到,而目前階段的程式碼可以在 add NoDatabaseApi 這個 commit 記錄裡找到

後續的篇章會實現透過 Dapper 與 PostgreSQL 互動的功能

留言
avatar-img
留言分享你的想法!
avatar-img
Sponge | 一塊海綿的沙龍
6會員
10內容數
分享網站開發的前端、後端、資料庫與部屬維運技術,並記錄在工作上的心得
2023/02/20
Hhost 是一個基於 Hasura 並且整合了 Serverless、PostgreSQL、Auth、Storage 的一體化 BaaS 服務,主要的假想敵為 Firebase 而目標是將網站系統開發盡可能的精簡與可拓展化。
Thumbnail
2023/02/20
Hhost 是一個基於 Hasura 並且整合了 Serverless、PostgreSQL、Auth、Storage 的一體化 BaaS 服務,主要的假想敵為 Firebase 而目標是將網站系統開發盡可能的精簡與可拓展化。
Thumbnail
2023/02/19
PaaS 是指平台即服務(platform as a service),意思是可以透過管理介面執行設定與部署而不需要處理底層的伺服器運作與維護。
Thumbnail
2023/02/19
PaaS 是指平台即服務(platform as a service),意思是可以透過管理介面執行設定與部署而不需要處理底層的伺服器運作與維護。
Thumbnail
2023/02/18
在網頁服務中資料庫擔任了很重要的任務,用來保存客戶的資料與提供分析的數據來源,而針對不同的需求會有各類型適合資料庫來負責。 這篇文章中會針對 Row-Oriented (以列為儲存主體) 和 Columnar (以行為儲存主體) 的兩種資料庫來分析任務與資料庫間的合適搭配。
Thumbnail
2023/02/18
在網頁服務中資料庫擔任了很重要的任務,用來保存客戶的資料與提供分析的數據來源,而針對不同的需求會有各類型適合資料庫來負責。 這篇文章中會針對 Row-Oriented (以列為儲存主體) 和 Columnar (以行為儲存主體) 的兩種資料庫來分析任務與資料庫間的合適搭配。
Thumbnail
看更多
你可能也想看
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
關於FastAPI這個框架為什麼有什麼樣的優勢, 為什麼會這麼熱門? 歡迎參考「【Python 技術選型】如何選出適合的API框架呢?」。 站在巨人的肩膀上 FastAPI主要基於以下兩個重要的元件組成, Starlette與Pydantic, 就讓我們來看看兩者的關係吧! 安裝 pip
Thumbnail
關於FastAPI這個框架為什麼有什麼樣的優勢, 為什麼會這麼熱門? 歡迎參考「【Python 技術選型】如何選出適合的API框架呢?」。 站在巨人的肩膀上 FastAPI主要基於以下兩個重要的元件組成, Starlette與Pydantic, 就讓我們來看看兩者的關係吧! 安裝 pip
Thumbnail
每次看到 REST 就讓我想起以前念研究所和老師一起想論文題目時,曾提過國外常會玩這種文字遊戲,像是將 Representational State Transfer 變成一個很簡單的單字 REST,但我的東西不管怎麼想,卻想不出什麼有趣的東西 Orz
Thumbnail
每次看到 REST 就讓我想起以前念研究所和老師一起想論文題目時,曾提過國外常會玩這種文字遊戲,像是將 Representational State Transfer 變成一個很簡單的單字 REST,但我的東西不管怎麼想,卻想不出什麼有趣的東西 Orz
Thumbnail
上一篇我們有介紹「【Postman工具箱】 Mock Server簡介」,相信對於Mock Server的用途應該都具備一些基本概念了,那這次就來介紹一套免費開源的工具庫「Mockoon」並附帶安裝架設的方法,讓我們簡單輕鬆的上架我們的模擬API Server。 系統開發的過程中,假設前/後端分離的
Thumbnail
上一篇我們有介紹「【Postman工具箱】 Mock Server簡介」,相信對於Mock Server的用途應該都具備一些基本概念了,那這次就來介紹一套免費開源的工具庫「Mockoon」並附帶安裝架設的方法,讓我們簡單輕鬆的上架我們的模擬API Server。 系統開發的過程中,假設前/後端分離的
Thumbnail
相信有在開發Web應用的朋友應該對於Postman這套工具相當熟悉, 這套工具可以協助我們在產品尚未完成之前可以先進行一些基本的介接測試,甚至我們可以使用Postman去呼叫雲端的API,像是Google的語音辨識、文字翻譯、字典查詢…,這類大廠相信也都開放許多標準API(Application P
Thumbnail
相信有在開發Web應用的朋友應該對於Postman這套工具相當熟悉, 這套工具可以協助我們在產品尚未完成之前可以先進行一些基本的介接測試,甚至我們可以使用Postman去呼叫雲端的API,像是Google的語音辨識、文字翻譯、字典查詢…,這類大廠相信也都開放許多標準API(Application P
Thumbnail
fast endpoints 是一個支援 .NET 6 以上(Nuget 版本清單) 的 API 輕量框架,雖以簡單與高性能為主打,但也提供了很多常用的功能實現,如 Swagger 整合、Jwt 認證、Api 版本控制、APi 速率限制、Api 回應快取…很適合以此為基礎打造 Api 服務。
Thumbnail
fast endpoints 是一個支援 .NET 6 以上(Nuget 版本清單) 的 API 輕量框架,雖以簡單與高性能為主打,但也提供了很多常用的功能實現,如 Swagger 整合、Jwt 認證、Api 版本控制、APi 速率限制、Api 回應快取…很適合以此為基礎打造 Api 服務。
Thumbnail
Swagger是SmartBear Software的API開發人員套件工具,它是OpenAPI規範的基礎規範。 簡單來說就是 API 文件產生器。
Thumbnail
Swagger是SmartBear Software的API開發人員套件工具,它是OpenAPI規範的基礎規範。 簡單來說就是 API 文件產生器。
Thumbnail
Restful API 其實就是開放一個 EndPoit 的網路接口給其他人使用,並將要做的事情封裝在該接口內,不需要知道真實運作狀況,只要得到答案即可。
Thumbnail
Restful API 其實就是開放一個 EndPoit 的網路接口給其他人使用,並將要做的事情封裝在該接口內,不需要知道真實運作狀況,只要得到答案即可。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News