#grpc #grpc-server #grpc-client #rpc #client-server

tonic-web

为tonic服务提供grpc-web协议转换

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 网络编程

Download history 15093/week @ 2024-05-02 19568/week @ 2024-05-09 25024/week @ 2024-05-16 25063/week @ 2024-05-23 17124/week @ 2024-05-30 26332/week @ 2024-06-06 25409/week @ 2024-06-13 26019/week @ 2024-06-20 28632/week @ 2024-06-27 22896/week @ 2024-07-04 24165/week @ 2024-07-11 19584/week @ 2024-07-18 21517/week @ 2024-07-25 23530/week @ 2024-08-01 27218/week @ 2024-08-08 19492/week @ 2024-08-15

每月95,059次下载
用于 31 个crate(21个直接使用)

MIT 许可证

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