标签: tonic

在 Rust 中使用 prost 和 tonic 时如何导入 .proto?

我正在尝试使用 crates prost 和 tonic 在 Rust 中构建一个简单的 gRPC 客户端。我的 proto 定义非常简单,但我突然坚持使用从其他 proto 导入的消息。

// file src/protos/types.proto
syntax = "proto3";
package Types;

message Message1 {
    uint32 value1 = 1;
    bytes value2 = 2;
}

message Message2 {
    uint32 value1 = 1;
    uint32 value2 = 2;
    uint32 value3 = 3;
    uint32 value4 = 4;
}
Run Code Online (Sandbox Code Playgroud)
// file src/protos/service.proto
syntax = "proto3";
import "types.proto";
package Service;

service Worker {
    rpc Do (Request) returns (Reply);
}

message Request {
    Types.Message1 message1 = 1; …
Run Code Online (Sandbox Code Playgroud)

rust proto tonic grpc prost

4
推荐指数
1
解决办法
1324
查看次数

使用 Tonic 时如何处理外部错误,而我必须使用 tonic::Status?

我正在制作一个使用 Redis 客户端的基于 Tonic 的 gRPC 微服务。我无法找出发生异步错误时将 a 隐式转换RedisError为 a的示例。tonic::Status

async fn make_transaction(
    &self,
    request: Request<TransactionRequest>,
) -> Result<Response<TransactionResponse>, Status> {
    let mut con = self.client.get_async_connection().await?;
    con.set("my_key", 42).await?;
    ...
}
Run Code Online (Sandbox Code Playgroud)

来自 Redis 客户端的连接可能会失败以及设置失败。我宁愿不使用,.map_err()因为这似乎会破坏异步。

我想我需要实现这个特性From<Status>From<RedisError>但不知道如何去做。这是我的尝试,但它不起作用,因为 Tonic 想要一个tonic::Status,而不是ApiError我制作的结构:

pub struct ApiError {}

impl From<tonic::Status> for ApiError {
    fn from(err: Status) -> ApiError {
        ApiError {  }
    }
}

impl From<RedisError> for Status {
    fn from(err: redis::RedisError) -> ApiError { …
Run Code Online (Sandbox Code Playgroud)

redis rust tonic

4
推荐指数
1
解决办法
1601
查看次数

“。” 在 Rust 模块标识符中

关于 gRPC codegen 和 tonic(使用 protoc)的问题。

我使用的第三方原型的包名称如下thirdparty.specificpackage,例如:

syntax = "proto3";

package thirdparty.common;

import "google/protobuf/empty.proto";
import "google/protobuf/wrappers.proto";

service CommonService {
...
}
Run Code Online (Sandbox Code Playgroud)

和一个build.rs看起来像这样的:

tonic_build::configure()
        .protoc_arg("--experimental_allow_proto3_optional") // for older systems
        .build_client(true)
        .build_server(true)
        .out_dir("./src")
        .compile(
            &[
                "src/myprotoproject/protos/services/decision_engine.proto"],
            &["src"],
        )?;
Run Code Online (Sandbox Code Playgroud)

我生成的代码cargo build被命名thirdparty.common.rs- 如何将其导入到我的 Rust 代码中?

mod thirdparty.common不是有效的 Rust 标识符,因为.- 是否有最佳实践?

protocol-buffers rust tonic grpc

2
推荐指数
1
解决办法
138
查看次数

标签 统计

rust ×3

tonic ×3

grpc ×2

prost ×1

proto ×1

protocol-buffers ×1

redis ×1