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
注意事项
- 生产环境:使用受信任的CA颁发的证书
- 端口:HTTP2通常使用443端口(HTTPS)
- 性能:HTTP2支持多路复用,能显著提升性能
- 兼容性:现代浏览器都支持HTTP2 over TLS
Salvo会自动检测TLS配置并启用HTTP2协议,无需额外配置。