搜尋套件、儲存庫與 APP 分類

套件詳情v2.1.5

fennec

Fennec 是一個多線程、強大的 Dart 伺服器端框架。

AndroidiOSmacOSWindowsLinux
近 30 天下載
103
喜歡數
46
Pub 分數
135

安裝套件

flutter pub add fennec

套件介紹

根據套件公開資料產生的選型評估,僅供參考。

Fennec 是一個多執行緒、穩健的 Dart 後端框架,專為建立高效率的後端服務而設計。它讓開發者能使用 Dart 建立可擴展的 Web 伺服器與 API,並利用平行處理來有效處理多個請求。Fennec 以可靠性與速度為核心打造,支援在 Android、iOS、macOS、Windows 與 Linux 上部署,非常適合跨平台後端解決方案。其架構強調簡潔性與開發人員生產力,同時維持強大的效能特徵。

適用情境

  • 建構 RESTful API
  • 建立即時後端服務
  • 開發跨平台伺服器應用程式
  • 處理高併發工作負載
  • 與 Flutter 前端應用程式整合

主要特色

  • 多線程架構
  • 跨平台支援
  • 高效能與可擴展性
  • 內建的併發模型
  • 簡單的 API 設計
  • 強大的錯誤處理

適合對象

  • 使用 Dart 的後端開發人員
  • 建構全-stack Flutter 應用的團隊
  • 需要高吞吐量的項目
  • 尋求輕量級伺服器框架的開發者
  • 需要跨平台部署的應用程式

使用建議

  • 需要理解 Dart 並發
  • 與成熟框架相比,生態系統有限
  • 最適合現代 Dart 項目
  • 可能需要額外的工具來部署生產環境
  • 初學者對伺服器端 Dart 不熟悉時的學習曲線

原始 README

以下為關聯原始碼儲存庫的 README 原文快照,最新內容請造訪原始碼儲存庫。

Fennec is a multi-threaded, robust Dart Server-Side Framework.

Packages

Packages pub
fennec (core framework) fennec
fennec_pg fennec_pg
fennec_jwt fennec_jwt
fennec_socket_io_server fennec_socket_io_server

installation:

  1. create a simple dart project. you can use terminal for that dart create 'projectname'
  2. install the framework from pub.dev

supported features by fennec:

  1. Multi-threaded http request.
  2. Sharing Data between Isolates if using multiples Isolates.
  3. WebSocket request.
  4. Handling requests with a simple and solid Router logic.
  5. Handling dynamic path routes.
  6. Middlewares at level of every request and Router level.
  7. Templates rendering system with html extension.
  8. Handling Form Data.

make your first request:

you can make a request by creating a [Route] and add it to [Application] instance or create a [Router] and add it to [application] instance.

create a Router.

Router testRouter() {
  Router router = Router();

  router.get(
      path: "/test",
      requestHandler: (context, req, res) async {
        return res.ok(body: "hello world");
      });

  return router;
}


Middleware

it must be a typedef MiddlewareHandler and must return always MiddleWare. here an example how to implement it:

  Future<Middleware> testMiddleware(ServerContext serverContext, Request req, Response res) async {
  if (1 == 2) {
    return Next();
  }
  return Stop(res.forbidden(body: {"error": "not allowed"}).json());
}


Add Middleware to a Router

you can use also define a Router Middleware by.


router.useMiddleware((
serverContext, req, res) {
if (1 == 2) {
return Next();
}
return Stop(res.forbidden(body: {"error": "not allowed"}).json());
});


Sharing Data between Isolates if using multiples Isolates.

Isolate is an isolated environment, inside which there is memory allocated to it and its EventLoop. but sometimes you want to share Data between Isolates or have the same Data content on all Isolates.

Fennec let you do that by using Actor Concept.

first you need to create your Actor customized class that is a subclass of Actor.

example how to implement it.


class CustomisedActor extends Actor {
final List<String> _strings = [];

CustomisedActor(String name) : super(name);

@override
FutureOr<void> execute(String action,
{Map<String, dynamic> data = const {}}) {
if (action == 'insert') {
_strings.add(" new item");
} else {
if (_strings.isNotEmpty) {
_strings.removeLast();
}
}
}

@override
FutureOr get(String action, {Map<String, dynamic> data = const {}}) {
if (action == "get") {
return _strings;
}
return null;
}
}


after implementing of your needed subclasses of [Actor], you need just to add it/them to your [Application] by using addActor or addActors in [Application] instance.

with [ServerContext] instance you can have access to your Actor/Actors by their name and you can call get and execute methods to return some Data from Actor or execute some operations.

dynamic routes

here is an example how to use dynamic path routes

router.get(path: "
/test/{id}
"
,
requestHandler: (
context, req, res) {
return res.ok(body: {"id": req.pathParams['id']}).json();
});

File System Routing

an example how to handle files

router.get(path: "
/getFile
"
,
requestHandler: (
context, req, res) {
return res.ok(body: req.files.first.filename);
});

Template with html extension

you can render also html templates with fennec Framework. you need to determine the path for your html files. application.setViewPath(path.current + '/example');

an example how to use it.


router.get(path: "
/template
"
,
requestHandler: (
context, req, res) {
return res.render("file");
});

WebSocket

WebSocket is already integrated in the core of Framework. firstly to use Websocket . you need to make the useWebSocket object at [Application] instance true.

how to use it :

  router.ws(path: "
/connect
"
,
websocketHandler: (
context, websocket) {
/// handle new connected websocket client.
});


Multithreading

Fennec Framework supports also Multithreading over isolates. To increase the number of used isolates just call the function setNumberOfIsolates. the default number of isolates is 1

example


application.setNumberOfIsolates(1
);

Start your Server and test your first Request

import 'package:fennec/fennec.dart';


void main(List<String> arguments) async {
  Application application = Application();

  application.setNumberOfIsolates(1);
  application.useWebSocket(true);
  application.setPort(8000);
  application.addRouters([testRouter()]);

  ServerInfo serverInfo = await application.runServer();
  print("Server is running at Port ${serverInfo.port}");
}}

deploy

  • heroku cloud: here is heroku-buildpack for dart and inside it an example how to deploy Fennec Framework on heroku cloud for free. to test an example you can try this two endpoints:

    • https://fennec-deploy.herokuapp.com/healthcheck/servercheck

    • https://fennec-deploy.herokuapp.com/healthcheck

  • for next days, another example for aws and goolge run will be uploaded.

Benchmarks using wrk

after running this endpoint using Fennec Framework on local machine (MacBook Pro (13-inch, 2019, Two Thunderbolt 3 ports), we could gets this data:

  • t: number of threads
  • c: number of open connections
  • d: duration of test
  router.get(path: "
/test
"
,
requestHandler: (
context, req, res) async {
return res.ok(body: "hello world");
});

wrk -t1 -c100 -d60s http://localhost:8000/example/test

  • Running 1m test @ http://localhost:8000/example/test
  • 1 threads and 100 connections
  • Thread Stats Avg Stdev Max +/- Stdev
  • Latency 6.63ms 1.83ms 86.51ms 96.81%
  • Req/Sec 15.30k 1.38k 16.52k 91.17%
  • 913472 requests in 1.00m, 177.72MB read
  • Requests/sec: 15209.67
  • Transfer/sec: 2.96MB

wrk -t10 -c100 -d60s http://localhost:8000/example/test

  • Running 1m test @ http://localhost:8000/example/test
  • 10 threads and 100 connections
  • Thread Stats Avg Stdev Max +/- Stdev
  • Latency 6.50ms 1.27ms 104.08ms 96.71%
  • Req/Sec 1.55k 124.24 2.41k 87.15%
  • 926903 requests in 1.00m, 180.33MB read
  • Requests/sec: 15435.91
  • Transfer/sec: 3.00MB

import information

Fennec Framework after with version >= 1.0.0 doesn't support more annotations because the big discussions about the library mirrors. as alernatives you can use Route or Route as showed in this example.

License

MIT

所屬分類

依賴

依賴清單 2 項

原始碼儲存庫

使用此套件的專案

暫無相關資料。