⭐️Archttp 1.0 新特性來了,簡單、靈活、高並行,D 語言 Web 伺服器端框架!

2022-05-21 09:00:50

昨天是 5.20 中國式情人節,今天是 5.21 我生日,做開源有十多年了,這也是給自己的一個生日禮物。

D語言在國內的環境來說一直熱不起來,我和我的開源團隊也做過很多開源的框架,全功能的,基本對標 springboot 和 springcloud 那種級別,但是新手用起來不夠友好,由於D語言在國內的檔案匱乏導致入門難,執行這麼龐大的框架更是不可想象的難。

Archttp 版本釋出前言

近幾年 Golang 的發展很猛烈,比如使用 gin 框架就可以實現高並行能力的微服務應用,更是這幾年的發展 NodeJS 寫伺服器端的也是越來越多,尤其是 ExpressJS 這優秀的 API 設計讓更多人在做伺服器端開發選型的時候選擇了他們。

今天我們的主角 Archttp,首先來說 Archttp 擁有類似 ExpressJS 的 API 設計,讓開發更輕量簡單,其次擁有 Golang 級別的並行能力。

框架使用對比

我們先看一下 Archttp 最新版本中的基本使用用法和 Gin、Express 的差異。

DLang 的 Archttp 框架:

import archttp;

void main()
{
    auto app = new Archttp;

    app.get("/", (req, res) {
        res.send("Hello, World!");
    });

    app.listen(8080);
}

Golang 的 Gin 框架:

package main

import (
        "net/http"
        "github.com/gin-gonic/gin"
)

func main() {

        r := gin.Default()

        r.GET("/", func(context *gin.Context) {
                context.String(http.StatusOK, "Hello world!")
        })

        r.Run(":8081")
}

NodeJS 的 ExpressJS 框架:

var express = require('express');

var app = express();

app.get('/', function(req, res) {
   res.send("Hello world!");
});

app.listen(8082);

可以看出來這三個框架的使用都夠簡單,關於效能方面大家可以自己去做測試,作者目前只做了 Linux 平臺下的效能測試,目前我的測試結果是 Archttp 最佳,系統是 Debian 11 虛擬機器器,歡迎大家一起來測試和反饋。

新版本特性:

  • 統一將方法名調整為小寫字母駝峰命名
  • 優化 Router 流程和模組調整
  • 支援 response.sendFile(filepath, filename) 形式的下載
  • request 和 response 提供完整的 cookie 支援
  • app.use() 中介軟體功能可用
  • 現在可以通過 app.newRouter() 建立新的 Router 物件
  • 現在 app.use("/admin", Router) 可以進行子路由繫結,方便一個專案編寫多個服務
  • 完善 HttpRequest 內建方法,接近 ExpressJS 的 API 使用
  • 完善 HttpResponse 內建方法,接近 ExpressJS 的 API 使用
  • 穩定性測試和修復

路由功能範例程式碼

import archttp;

void main()
{
    auto app = new Archttp;

    app.get("/", (req, res) {
        res.send("Hello, World!");
    });

    app.get("/user/{id:\\d+}", (req, res) {
        res.send("User id: " ~ req.params["id"]);
    });

    app.get("/blog/{name}", (req, res) {
        res.send("Username: " ~ req.params["name"]);
    });

    app.listen(8080);
}

可以看出 Archttp 的路由功能非常簡單清晰,也支援正則匹配和取值。

中介軟體使用範例程式碼

import archttp;

import std.stdio : writeln;

void main()
{
    auto app = new Archttp;

    app.use((req, res, next) {
        writeln("middleware 1 ..");
        next();
    });

    app.use((req, res, next) {
        writeln("middleware 2 ..");
        next();
    });

    app.use((req, res, next) {
        writeln("middleware 3 ..");
        next();
    });

    app.use((req, es, next) {
        writeln("middleware 4 ..");
    });

    app.use((req, res, next) {
        writeln("middleware 5 ..");
    });

    app.get("/", (req, res) {
        res.send("Hello, World!");
    });

    app.listen(8080);
}

這段程式碼執行之後可以發現沒有執行到 middleware 5,現在 Archttp 的執行遵循洋蔥規則。

Cookie 使用範例程式碼

import archttp;

import std.stdio : writeln;

void main()
{
    auto app = new Archttp;

    app.get("/", (request, response) {

        writeln(request.cookie("token"));
        writeln(request.cookies());

        response.cookie("username", "myuser");
        response.cookie("token", "0123456789");

        response.send("Set cookies ..");
    });

    app.listen(8080);
}

下載檔案範例程式碼

import archttp;

void main()
{
    auto app = new Archttp;

    app.get("/download", (req, res) {
        res.sendFile("./attachments/avatar.jpg");
    });

    app.listen(8080);
}

路由繫結範例程式碼

import archttp;

void main()
{
    auto app = new Archttp;

    app.get("/", (req, res) {
        res.send("Front page!");
    });

    auto adminRouter = Archttp.newRouter();
    
    adminRouter.get("/", (req, res) {
        res.send("Hello, Admin!");
    });

    adminRouter.get("/login", (req, res) {
        res.send("Login page!");
    });

    app.use("/admin", adminRouter);

    app.listen(8080);
}

可以看出 adminRouter 相當於一個路由組(路由組的概念來自於 Hunt Framework),路由組可以使用自己的中介軟體規則,也就是他相當於一個獨立的子應用,可以獨立控制許可權等。

鳴謝

感謝我團隊成員的支援,感謝所有支援我建立D語言中文社群的朋友們,感謝我D語言中文社群聯合創始人張雪平老師和我一起打造D語言國內生態,感謝D語言國際社群的開發者們給我的支援,感謝開源中國提供國內開源平臺。

收尾

我們做D語言開源專案已經有 7 年了,也聽到很多好的壞的聲音,但是我們看到的是一個值得使用的 D語言,我們擁有15年以上的框架架構能力,也希望能夠打造一個 DLang 生態中不可或缺的一個開源專案,協助 D語言中文社群生態的發展。

希望更多人蔘與到開源貢獻中,希望開源中國越辦越好,希望碼雲越來越好儘快度過目前的難關!

QQ交流群

184183224

展開閱讀全文