Rust Salvo框架如何配置和使用HTTP2

在Rust的Salvo框架中,如何正确配置HTTP/2协议?具体需要修改哪些配置项,是否要额外依赖库?能否提供一个完整的示例代码,包括服务端启动和路由设置?如果遇到证书或ALPN相关错误该如何解决?

2 回复

Cargo.toml添加依赖:

salvo = { version = "0.41", features = ["http2"] }

创建服务时启用HTTP/2:

use salvo::prelude::*;

#[tokio::main]
async fn main() {
    let router = Router::new();
    let acceptor = TcpListener::new("0.0.0.0:5800").http2().bind().await;
    Server::new(acceptor).serve(router).await;
}

注意:HTTP/2需要TLS加密,实际部署需配置SSL证书。


在Salvo框架中配置和使用HTTP2非常简单,主要通过TLS实现。以下是具体步骤:

1. 添加依赖

首先在 Cargo.toml 中添加必要的依赖:

[dependencies]
salvo = "0.50"
tokio = { version = "1.0", features = ["full"] }
tokio-rustls = "0.24"
rustls = { version = "0.21", features = ["dangerous_configuration"] }
rustls-pemfile = "1.0"

2. 配置TLS证书

HTTP2需要TLS加密,需要准备证书文件:

use salvo::prelude::*;
use std::sync::Arc;
use tokio_rustls::rustls::{self, ServerConfig};

#[handler]
async fn hello() -> &'static str {
    "Hello, HTTP2!"
}

#[tokio::main]
async fn main() {
    // 创建路由
    let router = Router::new().get(hello);
    
    // 配置TLS
    let config = load_rustls_config();
    
    // 启动HTTP2服务器
    let acceptor = TcpListener::new("0.0.0.0:443")
        .rustls(config)
        .bind()
        .await;
    
    Server::new(acceptor).serve(router).await;
}

fn load_rustls_config() -> Arc<ServerConfig> {
    use rustls_pemfile::{certs, pkcs8_private_keys};
    use std::fs::File;
    use std::io::BufReader;

    // 加载证书文件(需要替换为实际路径)
    let cert_file = &mut BufReader::new(File::open("cert.pem").unwrap());
    let key_file = &mut BufReader::new(File::open("key.pem").unwrap());

    let cert_chain = certs(cert_file)
        .unwrap()
        .into_iter()
        .map(rustls::Certificate)
        .collect();
        
    let mut keys: Vec<rustls::PrivateKey> = pkcs8_private_keys(key_file)
        .unwrap()
        .into_iter()
        .map(rustls::PrivateKey)
        .collect();

    let config = ServerConfig::builder()
        .with_safe_defaults()
        .with_no_client_auth()
        .with_single_cert(cert_chain, keys.remove(0))
        .unwrap();

    Arc::new(config)
}

3. 生成测试证书

开发时可以使用自签名证书:

# 生成私钥
openssl genrsa -out key.pem 2048

# 生成证书签名请求
openssl req -new -key key.pem -out csr.pem

# 生成自签名证书
openssl x509 -req -days 365 -in csr.pem -signkey key.pem -out cert.pem

4. 验证HTTP2

启动服务后,可以使用以下命令验证HTTP2:

curl -k --http2 https://localhost:443

注意事项

  1. 生产环境:使用受信任的CA颁发的证书
  2. 端口:HTTP2通常使用443端口(HTTPS)
  3. 性能:HTTP2支持多路复用,能显著提升性能
  4. 兼容性:现代浏览器都支持HTTP2 over TLS

Salvo会自动检测TLS配置并启用HTTP2协议,无需额外配置。

回到顶部