2个版本
0.8.1-alpha.1 | 2022年8月29日 |
---|
#39 in #grpc-client
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客户端只能执行
unary
和server-streaming
调用。这是此crate设计处理的唯一请求。当客户端支持时,将正式支持客户端和双向流。 - 不支持WebSocket传输。
依赖项
~8–18MB
~232K SLoC