2个版本

0.8.1-alpha.12022年8月29日

#39 in #grpc-client

MIT许可证

52KB
1K 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)
       .add_service(tonic_web::enable(greeter))
       .serve(addr)
       .await?;

   Ok(())
}

示例

请参阅示例文件夹中的服务器和客户端示例。


lib.rs:

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

tonic_web使tonic服务器能够直接处理来自grpc-web客户端的请求,无需外部代理。这是通过将单个tonic服务包裹在一个执行协议转换和处理cors请求的tower服务中来实现的。

入门

[dependencies]
tonic_web = "0.1"

启用tonic服务

最简单的方法是使用您的tonic服务调用enable函数,并允许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客户端配合良好。有关详细信息,请参阅Config文档。

或者,如果您有一个启用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客户端只能执行unaryserver-streaming调用。这是此crate设计处理的唯一请求。当客户端支持时,将正式支持客户端和双向流。
  • 不支持WebSocket传输。

依赖项

~8–18MB
~232K SLoC