#web-framework #api-server #hyper-http #actix-web #metrics #shutdown

hyper-fast

基于Hyper和Rust的非常快的HTTP Web框架(比actix和其他框架快得多)

7个版本

0.3.5 2023年9月20日
0.3.4 2023年9月19日
0.1.0 2023年9月18日

#370HTTP服务器 中排名

每月 39 次下载

Apache-2.0

54KB
1K SLoC

hyper-fast

基于Hyper和Rust的非常快的HTTP Web框架(比actix和其他框架快得多)。

特性

  • 支持请求和响应的brotli、deflate和gzip编码
  • 内置API的访问日志和度量
  • 简单的API获取当前度量 - JSON和Prometheus格式
  • 内置OOR(Out of rotation API),可取服务器出轮询
  • 内置服务器健康API
  • 非常简单且快速的基于匹配模式的路由
  • 比actix和其他Web服务器快得多。
  • 支持可选的守护进程服务,服务器启动时启动,服务器关闭时停止
  • 内置服务器关闭处理

示例

查看examples/example_server.rs以获取一个工作示例。示例可以用cargo run --example example_server运行。

  1. 定义一个服务类,为API路由实现Service特质。
pub struct ExampleService {
    // any service level properties
}

#[async_trait]
impl Service for ExampleService {
    async fn api_handler<'a>(
        &'a self,
        _: Body,
        route: &HttpRoute<'a>,
        path: &[&str],
    ) -> Result<Response<Body>, ApiError> {
        match path {
            ["test"] if matches!(route.method, &http::Method::GET) => {
                self.get_test(route).await
            }
            _ => HttpResponse::not_found(route.path),
        }
    }
}

impl ExampleService {
    pub async fn get_test(&self, route: &HttpRoute<'_>) -> Result<Response<Body>, ApiError> {
        HttpResponse::string(route, "GET::/api/test - test passed".to_string())
    }
}
  1. 可选的服务守护进程,可以是空实现 - 如果不需要的话。
pub struct ExampleServiceDaemon {}

#[async_trait]
impl ServiceDaemon<ExampleService> for ExampleServiceDaemon {
    async fn start(&self, _service: Arc<ExampleService>) {
        //no impl for now.
    }
}
  1. 实现ServiceBuilder特质。
pub struct ExampleServiceBuilder {
    // any service builder level properties
}

#[async_trait]
impl ServiceBuilder<ExampleService, ExampleServiceDaemon> for ExampleServiceBuilder {
    async fn build(self) -> anyhow::Result<(ExampleService, Option<ExampleServiceDaemon>)> {
        let service = ExampleService {};

        Ok((service, None))
    }
}
  1. 在主方法中调用start_http_server
#[tokio::main(flavor = "multi_thread")]
async fn main() -> Result<(), anyhow::Error> {
    load_config("examples/config", "dev")?;
    setup_logging("examples/config/log4rs.yml")?;

    start_http_server("127.0.0.1:6464", ExampleServiceBuilder {}).await
}

API

  1. /oor - 切换服务器在轮询中的状态
  2. /status - 提供服务器在轮询中的状态
  3. /metrics/json - JSON格式的度量
  4. /metrics/prometheus - Prometheus格式的度量
  5. /api/<你的API路由> - 所有API路由都在/api之后

依赖关系

~14–23MB
~460K SLoC