昨天是 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语言国际社区的开发者们给我的支持,感谢开源PHP提供国内开源平台。
收尾
我们做D语言开源项目已经有 7 年了,也听到很多好的坏的声音,但是我们看到的是一个值得使用的 D语言,我们拥有15年以上的框架架构能力,也希望能够打造一个 DLang 生态中不可或缺的一个开源项目,协助 D语言中文社区生态的发展。
希望更多人参与到开源贡献中,希望开源PHP越办越好,希望码云越来越好尽快度过目前的难关!
QQ交流群
184183224