2个版本
使用旧的Rust 2015
0.7.0-beta.2 | 2018年2月4日 |
---|
2268 in Web编程
76KB
1K SLoC
Zhelezo (铁),由Iron分支而来
Rust中可扩展、以并发为中心的Web开发。
Zhelezo为了保持其维护和功能丰富,从Iron分支而来。
响应计时器示例
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”请求,主要受IO限制,在内核中发送或接收数据的时间超过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
依赖关系
~10–18MB
~253K SLoC