1个不稳定版本
0.1.2 | 2023年8月28日 |
---|---|
0.1.1 |
|
#25 in #grpc-server
43KB
1K SLoC
libp2p-grpc-rs
一个用Rust语言编写的库,在LibP2P基础上运行gRPC,基于rust-libp2p和tonic crate。灵感来自go-libp2p-grpc
用法
更多示例,请查看examples/文件夹。
给定一个RPC服务
service NodeService {
// Echo asks a node infomation to respond with a message.
rpc Info(NodeInfoRequest) returns (NodeInfoResponse) {}
}
Cargo.toml中必需的依赖项
[dependencies]
tonic = <tonic-version>
prost = <prost-version>
libp2p-grpc-rs = <libp2p-grpc-rs-version>
[build-dependencies]
tonic-build = <tonic-version>
对于服务器端,实现服务(参见tonic的教程),然后构建libp2p Swarm并开始监听。
let transport = tcp::tokio::Transport::default()
.upgrade(Version::V1Lazy)
.authenticate(noise::Config::new(&local_key)?)
.multiplex(yamux::Config::default())
.boxed();
// create tonic gRPC router for services
let router = Server::builder().add_service(nodeinfo::new(local_peer_id.to_base58()));
let mut swarm = SwarmBuilder::with_tokio_executor(
transport,
GrpcBehaviour::new(local_peer_id.clone(), Some(router)),
local_peer_id,
)
.build();
let listener_port = args.listener_port.unwrap_or(0);
swarm.listen_on(format!("/ip4/127.0.0.1/tcp/{}", listener_port).parse()?)?;
...
对于客户端,本crate的行为被引入以构建libp2p的Swarm。
use libp2p_grpc_rs::Behaviour as GrpcBehaviour;
...
let swarm = SwarmBuilder::with_tokio_executor(
transport,
GrpcBehaviour::new(local_peer_id.clone(), None),
local_peer_id,
)
.build();
并调用行为的initiate_grpc_outbound(target_peer_id)方法以获取tonic的Channel。
let grpc_outbound_result = self.swarm
.behaviour_mut()
.initiate_grpc_outbound(&target_peer_id);
let channel = match grpc_outbound_result.map().await {
Ok((channel, _)) => channel,
Err(e) => {
tracing::error!("gRPC outbound error: {:?}", e);
return
}
};
// build the client of the service
let mut client = NodeServiceClient::new(channel);
// call the service api
let resp = client.info(Request::new(NodeInfoRequest {})).await.unwrap();
tracing::debug!(response=?resp, "got response");
待办事项
- 文档注释
- 单元或集成测试
- 更多gRPC功能示例
- 性能测试
贡献
接受PR。
依赖项
~11–19MB
~286K SLoC