如何在 Rust 中使用 Tonic 运行服务器和客户端?

时间:2021-05-06 20:35:59

标签: rust grpc

我正在尝试从另一个 grpc 服务器向 grpc 服务器发送请求。但问题是我似乎对如何访问共享数据没有任何想法。

假设我有 3 个应用程序,app1、app2 和 app3 app2 和 app3 都是用 tonic 用 Rust 编写的。

  1. 所以 app1 向 app2 发送了一个 grpc 请求 - 这是有效的
  2. app2 接收请求并处理数据 - 这也能正常工作
  3. app2 需要向 app3 发送 grpc 请求 - 我不知道该怎么做
  4. app3 接收请求并发回回复 - 这是有效的。

这是我尝试发送数据的代码:

async fn list_modules(
        &self,
        request: Request<ListModulesRequest>,
    ) -> Result<Response<ListModulesResponse>, Status> {
        println!("Got a request: {:?}", request);
        let request_data = request.into_inner();
        let request = tonic::Request::new(DalListModulesRequest {
            request_id: Uuid::new_v4().to_string(),
            app_id: APP_ID.to_string(),
        });
        let mut dal_client = ModulesDalManager::connect("http://[::1]:50052").await?;
        let mut response = dal_client.list_modules(request).await?;
        let reply = ListModulesResponse {
            request_id: response.request_id,
            modules: response.modules,
        };
        Ok(Response::new(reply))
    }

在这里,我想我不应该创建如下所示的 dal_client,因为它给了我错误。但我不明白在哪里创建它。 let mut dal_client = ModulesDalManager::connect("http://[::1]:50052").await?;

有人可以给我一些关于如何进行的想法吗?

这是我得到的错误:

error[E0599]: no function or associated item named `connect` found for trait object `(dyn ModulesDalManager + 'static)` in the current scope
  --> src/bal/services/module_manager.rs:48:49
   |
48 |         let mut dal_client = ModulesDalManager::connect("http://[::1]:50052").await?;
   |                                                 ^^^^^^^ function or associated item not found in `(dyn ModulesDalManager + 'static)`
   |
   = help: items from traits can only be used if the trait is implemented and in scope
   = note: the following traits define an item `connect`, perhaps you need to implement one of them:
           candidate #1: `hyper::client::connect::sealed::Connect`
           candidate #2: `hyper::client::connect::sealed::ConnectSvc`

1 个答案:

答案 0 :(得分:0)

ModulesDalManager 没有 connect。我应该用 ModulesDalManagerClient 代替。所以这条线变成了

let mut dal_client = ModulesDalManager::connect("http://[::1]:50052").await?;

PS:来自 rust 非官方 IRC 频道的 jbg 帮助我解决了这个问题。

相关问题