⭐️Archttp 1.0 新特性来了,简单、灵活、高并发,D 语言 Web 服务端框架!

来源: 投稿
作者: zoujiaqing
2022-05-21 03:49:00

昨天是 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

展开阅读全文
精彩评论
另外建议一下作者,可以写点文档,就哪怕是小白也可以快速入门使用这个框架,因为很多人在还没到这一步的时候,就因为不会D就放弃了
2022-05-21 09:46
3
举报
国内学什么看风气,营销号、培训班、砖家吹什么什么就火,python就很火,但perl就不火,但其实perl在国外非常吃香
2022-05-21 08:16
2
举报
在某些方面的确会取代 cpp
2022-05-22 20:20
1
举报
D语言终将取代C++
2022-05-22 19:58
1
举报
现在很多应用都要用到websocket了吧
2022-05-21 21:20
1
举报
10 收藏
分享
38 评论
10 收藏
分享
返回顶部
顶部
返回顶部
顶部