#grpc #p2p #networking #grpc-server #server-client

libp2p-grpc-rs

在LibP2P上运行gRPC的Rust库

1个不稳定版本

0.1.2 2023年8月28日
0.1.1 2023年8月28日

#25 in #grpc-server

自定义许可

43KB
1K SLoC

libp2p-grpc-rs

一个用Rust语言编写的库,在LibP2P基础上运行gRPC,基于rust-libp2ptonic 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