54次发布
使用旧Rust 2015
0.6.1 | 2019年8月14日 |
---|---|
0.6.0 | 2017年11月5日 |
0.5.1 | 2017年1月13日 |
0.4.0 | 2016年7月4日 |
0.0.5 | 2014年11月25日 |
26 in #focused
12,019 每月下载量
此crate已失去人气
72KB
1K SLoC
Iron
基于Rust的可扩展、以并发为重点的Web开发。
响应计时器示例
extern crate iron;
extern crate time;
use iron::prelude::*;
use iron::{BeforeMiddleware, AfterMiddleware, typemap};
use time::precise_time_ns;
struct ResponseTime;
impl typemap::Key for ResponseTime { type Value = u64; }
impl BeforeMiddleware for ResponseTime {
fn before(&self, req: &mut Request) -> IronResult<()> {
req.extensions.insert::<ResponseTime>(precise_time_ns());
Ok(())
}
}
impl AfterMiddleware for ResponseTime {
fn after(&self, req: &mut Request, res: Response) -> IronResult<Response> {
let delta = precise_time_ns() - *req.extensions.get::<ResponseTime>().unwrap();
println!("Request took: {} ms", (delta as f64) / 1000000.0);
Ok(res)
}
}
fn hello_world(_: &mut Request) -> IronResult<Response> {
Ok(Response::with((iron::status::Ok, "Hello World")))
}
fn main() {
let mut chain = Chain::new(hello_world);
chain.link_before(ResponseTime);
chain.link_after(ResponseTime);
Iron::new(chain).http("localhost:3000").unwrap();
}
概述
Iron是一个在Rust中构建并用于Rust的高层Web框架,基于hyper。Iron旨在利用Rust的最大特点——其出色的类型系统和其在单线程和多线程环境中的所有权原则方法。
Iron高度并发,可以在负载均衡器后面的更多机器上水平扩展,或者在更强大的机器上运行更多线程。Iron通过避免核心框架中的共享写入和锁定来避免在高度并发代码中遇到的瓶颈。
Iron是100%安全代码
$ rg unsafe src | wc
0 0 0
哲学
Iron旨在尽可能可扩展和可插入;Iron的核心集中,并通过将它们留给中间件、插件和修改器来避免不必要的功能。
中间件、插件和修改器是扩展Iron以添加新功能的主要方式。在其他Web框架中由中间件提供的许多扩展,相反通过更简单的修改器和插件系统来解决。
修改器允许外部代码以直观的方式操作请求和响应,允许第三方扩展获得与Iron本身定义的修改器相同的待遇。插件允许对请求和响应进行延迟评估、自动缓存的扩展,非常适合解析、访问和其他延迟操作HTTP连接。
中间件仅在需要修改请求流的控制流、劫持请求的整个处理、检查传入请求或进行最终后处理时使用。这包括路由、挂载、静态资产服务、最终模板渲染、身份验证和日志记录等领域。
Iron仅包含基本的修改器来设置状态、正文和各种头信息,以及创建修改器、插件和中间件的基础设施。Iron不捆绑任何插件或中间件。
性能
Iron的平均性能为每秒72,000+个hello world请求,主要受I/O限制,超过70%的时间在内核中发送或接收数据。
* 这些数字来自我在OS X机器上的分析,你的结果可能会有所不同。
核心扩展
Iron旨在填补Rust Web栈中的一个空白——一个可扩展的高级框架,可以轻松组织复杂的服务器代码。
扩展构建起来毫不费力。一些重要的扩展包括
中间件
插件
两者
这允许设置极其灵活和强大的配置,并允许Iron几乎所有的功能都可以互换——你甚至可以通过替换自己的Chain
来更改中间件解析算法。
* 由于Rust生态系统的快速发展,并非所有内容都能随时构建。请耐心等待,并为破坏性构建提交问题,我们正在尽最大努力。
底层的HTTP实现
Iron基于并使用hyper
作为其HTTP实现,并从中提取了几个类型,包括其头表示、状态和其他核心HTTP类型。在使用Iron时,通常不需要直接使用hyper
,因为Iron提供了对hyper
核心设施的封装,但有时也需要依赖它。
安装
如果你使用的是Cargo
,只需将Iron添加到你的Cargo.toml
。
[dependencies.iron]
version = "*"
文档
文档托管在网上,并且每次成功发布时都会自动更新。您还可以使用cargo doc
来构建本地副本。
示例
查看示例目录!
您可以使用cargo run --example example-name
运行单个示例。请注意,对于基准测试,您应确保使用--release
标志,这将导致Cargo使用优化编译整个工具链。没有--release
,您将得到非常令人沮丧的数字。
寻求帮助
请随时在此或其他相关仓库中通过github issues提问。
获取即时帮助的最佳地点是IRC,在任何以下mozilla网络上的这些频道
#rust-webdev
#iron
#rust
维护者或贡献者中通常有人在场,并且可能能提供帮助。我们鼓励您过来看看,告诉我们您正在使用Iron做什么,即使您没有任何问题。听取用户的反馈非常有价值,而且如果有人在使用我们开发的框架,这总是很令人高兴。
维护者
Jonathan Reem (reem) 是Iron的核心维护者和作者。
提交分布(截至8e55759
)
Jonathan Reem (415)
Zach Pomerantz (123)
Michael Sproul (9)
Patrick Tran (5)
Corey Richardson (4)
Bryce Fisher-Fleig (3)
Barosl Lee (2)
Christoph Burgdorf (2)
da4c30ff (2)
arathunku (1)
Cengiz Can (1)
Darayus (1)
Eduardo Bautista (1)
Mehdi Avdi (1)
Michael Sierks (1)
Nerijus Arlauskas (1)
SuprDewd (1)
许可证
MIT
依赖关系
~4–14MB
~200K SLoC