14个版本 (8个破坏性更新)
0.12.1 | 2024年7月17日 |
---|---|
0.11.0 | 2024年2月8日 |
0.10.2 | 2023年9月28日 |
0.9.2 | 2023年4月17日 |
0.1.0 | 2021年7月8日 |
#1316 in 网络编程
每月95,059次下载
用于 31 个crate(21个直接使用)
1MB
11K SLoC
tonic-web
允许tonic服务器直接处理来自grpc-web
客户端的请求,无需外部代理。
入门指南
[dependencies]
tonic-web = "<tonic-web-version>"
启用tonic服务
最简单的入门方法是调用函数,传入您的tonic服务,并允许tonic服务器接受HTTP/1.1请求
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let addr = "[::1]:50051".parse().unwrap();
let greeter = GreeterServer::new(MyGreeter::default());
Server::builder()
.accept_http1(true)
.layer(GrpcWebLayer::new())
.add_service(greeter)
.serve(addr)
.await?;
Ok(())
}
示例
请参阅示例文件夹中的服务器和客户端示例。
lib.rs
:
为tonic
服务提供grpc-web协议转换。
tonic_web
允许tonic服务器直接处理来自grpc-web客户端的请求,无需外部代理。它通过将单个tonic服务包装在执行协议转换和处理cors
请求的tower服务中来实现这一点。
启用tonic服务
最简单的入门方法是调用enable
函数,传入您的tonic服务,并允许tonic服务器接受HTTP/1.1请求
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let addr = "[::1]:50051".parse().unwrap();
let greeter = GreeterServer::new(MyGreeter::default());
Server::builder()
.accept_http1(true)
.add_service(tonic_web::enable(greeter))
.serve(addr)
.await?;
Ok(())
}
这将应用默认配置,与grpc-web客户端配合良好。
您可以通过使用您选择的cors层来自定义GrpcWebLayer
来定制CORS配置。
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let addr = "[::1]:50051".parse().unwrap();
let greeter = GreeterServer::new(MyGreeter::default());
Server::builder()
.accept_http1(true)
// This will apply the gRPC-Web translation layer
.layer(GrpcWebLayer::new())
.add_service(greeter)
.serve(addr)
.await?;
Ok(())
}
或者,如果您有一个启用了tls的服务器,您可以跳过将accept_http1
设置为true
。这是因为浏览器将处理ALPN
。
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let cert = tokio::fs::read("server.pem").await?;
let key = tokio::fs::read("server.key").await?;
let identity = Identity::from_pem(cert, key);
let addr = "[::1]:50051".parse().unwrap();
let greeter = GreeterServer::new(MyGreeter::default());
// No need to enable HTTP/1
Server::builder()
.tls_config(ServerTlsConfig::new().identity(identity))?
.add_service(tonic_web::enable(greeter))
.serve(addr)
.await?;
Ok(())
}
限制
tonic_web
设计用于仅与grpc-web兼容的客户端一起工作。它不期望处理任意的HTTP/x.x请求或专用协议。- 同样,该crate实现的cors支持将仅处理grpc-web和grpc-web预请求。
- 目前,grpc-web客户端只能执行
单例
和服务器流式
调用。这些是这个crate设计来处理的所有请求。当客户端支持时,将正式支持客户端和双向流式传输。 - 不支持WebSocket传输。
依赖项
~5–7MB
~119K SLoC