问题标签 [rust-tonic]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
81 浏览

rust - 不能在 tokio::spawn 函数中使用结构的成员变量

我实现了一个 gRPC 服务器,它将数据流式传输到其客户端。我希望服务器通过“通道通知器”开始发送回另一个模块事件的数据。

为了说明要点,我将实现简化为“hello”服务器。gRPC 原型文件是:

rs文件很简单:

我在 main 中创建了一对通道端点,然后将接收器端点用作 gRPC 服务器中的通知器。发送端点被分配给另一个模块,该模块在此代码中省略,用于发送新生成的数据。

我知道这个错误一定与ownershipRust 的有关。我试图将通道端点包装Arc<T>Mutex<T>. 但是,它不起作用。

0 投票
0 回答
328 浏览

rust - 如何使用 Tonic 对 gRPC 双向流执行半关闭?

我正在为谷歌的 Dialogflow流检测意图实现一个 Rust 库,该库利用 gRPC 使用 Tonic 库。

流式传输工作正常,但是一旦所有音频数据都被推送到流中,我需要发送一个半关闭呼叫。没有这个,检测意图流将不会使用最终文本调用意图检测,并且会超时并抱怨没有提供超过 11 秒的音频数据。

如何通过 Tonic 发送半关闭?我需要这样的 Golang 示例

我的锈代码如下。注意:明确删除发件人似乎没有任何区别。结果将是相同的(超时,API 永远不会识别到没有更多数据将到达,因此它应该已经执行 NLP)。

示例日志:

[2021-05-21T10:15:15Z 信息 session_client_streaming_detect_intent] session_client_streaming_detect_intent 示例

[2021-05-21T10:15:16Z INFO sessions_client_streaming_detect_intent] 音频发送器已丢弃

[2021-05-21T10:15:16Z INFO sessions_client_streaming_detect_intent] 识别结果 StreamingDetectIntentResponse { response_id: "", recognition_result: Some(StreamingRecognitionResult { message_type: Transcript, transcript: "he llo", is_final: false, 置信度: 0.0, 稳定性: 0.01 , speech_word_info: [], speech_end_offset: Some(Duration { seconds: 0, nanos: 480000000 }), dtmf_digits: None }), query_result: None, alternative_query_results: [], webhook_stat us: None, output_audio: [], output_audio_config: None }

[2021-05-21T10:15:17Z INFO sessions_client_streaming_detect_intent] 识别结果 StreamingDetectIntentResponse { response_id: "", recognition_result: Some(StreamingRecognitionResult { message_type: Transcript, transcript: "he llo Ray", is_final: false, 置信度: 0.0, 稳定性: 0.01,speech_word_info:[],speech_end_offset:一些(持续时间 { 秒:0,nanos:930000000 }),dtmf_digits:无}),query_result:无,alternative_query_results:[],webhook_ 状态:无,output_audio:[],output_audio_config:没有任何 }

[2021-05-21T10:15:17Z INFO session_client_streaming_detect_intent] 识别结果 StreamingDetectIntentResponse { response_id: "", recognition_result: Some(StreamingRecognitionResult { message_type: Transcript, transcript: "he llo Russ", is_final: false, confidence: 0.0, 稳定性: 0.01,speech_word_info:[],speech_end_offset:一些(持续时间 { 秒:0,nanos:960000000 }),dtmf_digits:无}),query_result:无,alternative_query_results:[],webhook _status:无,output_audio:[],output_audio_config:无} [2021-05-21T10:15:17Z INFO session_client_streaming_detect_intent] 识别结果 StreamingDetectIntentResponse { response_id: "", recognition_result: Some(StreamingRecognitionResult { message_type: Transcript, transcript: "他

llo Russ”,is_final:假,置信度:0.0,稳定性:0.01,speech_word_info:[],speech_end_offset:一些(持续时间 { 秒:1,纳米:50000000 }),dtmf_digits:无 }),query_result:无,alternative_query_results:[ ],webhook_ 状态:无,输出音频:[],输出音频配置:无 }

[2021-05-21T10:15:17Z INFO sessions_client_streaming_detect_intent] 识别结果 StreamingDetectIntentResponse { response_id: "", recognition_result: Some(StreamingRecognitionResult { message_type: Transcript, transcript: "he llo rust", is_final: false, confidence: 0.0, 稳定性: 0.01,speech_word_info: [],speech_end_offset: Some(Duration { seconds: 1, nanos: 260000000 }), dtmf_digits: None }), query_result: None, alternative_query_results: [], webhook _status: None, output_audio: [], output_audio_config:没有任何 }

[2021-05-21T10:15:27Z INFO sessions_client_streaming_detect_intent] 识别结果 StreamingDetectIntentResponse { response_id: "", recognition_result: Some(StreamingRecognitionResult { message_type: Transcript, transcript: "he llo rust", is_final: true, confidence: 0.60010684, 稳定性: 0.0, speech_word_info: [], speech_end_offset: Some(Duration { seconds: 1, nanos: 380000000 }), dtmf_digits: None }), query_result: None, alternative_query_results: [], we bhook_status: None, output_audio: [], output_audio_config:没有任何 }

[2021-05-21T10:15:27Z ERROR sessions_client_streaming_detect_intent] streaming_detect_intent 错误错误{消息:“状态:OutOfRange,消息:“调用云语音API时:音频超时错误:长时间没有音频。音频应接近实时发送。”,详细信息:[],元数据:MetadataMap { headers:{“grpc-server-stats-bin”:“AAAhxq1zAgAAAA”} }”,代码:无 }

0 投票
0 回答
313 浏览

swift - 客户端崩溃后无法重新连接到 gRPC 服务器

我做了很多研究,但找不到解决 gRPC 问题的方法:

概括; 在我的 swift gRPC 客户端应用程序崩溃后,没有 gRPC 客户端可以连接到我的 gRPC 服务器(请参阅下面的错误)

我的设置: 我有一个 Swift 前端应用程序和一个 Rust 后端。rust 后端运行一个 gRPC 服务器(tonic)https://github.com/hyperium/tonic一个 rust 客户端(也是 tonic)和一个 Swift 客户端(https://github.com/grpc/grpc-swift)可以连接至。Swift 客户端崩溃后,所有客户端都无法再连接到服务器。

rust 客户端报告: Error: Status { code: Cancelled, message: "h2 protocol error: protocol error: stream no longer needed" }

迅速的客户报告: StreamClosed(streamID: HTTP2StreamID(1), errorCode: HTTP2ErrorCode<0x8 Cancel>, location: ".../swift-nio-http2/Sources/NIOHTTP2/HTTP2StreamChannel.swift:820")

我尝试过在服务器中 设置了一个http2 keepalive,但这并没有做任何事情。我试图通过故意使 rust 客户端崩溃来重现相同的效果——但没有成功。

我什至不确定是要查看 swift-grpc 和 tonic 库还是 grpc 本身(对我来说,看起来服务器故意关闭了流)。
有谁知道我能做些什么来解决这个问题?提前致谢!

0 投票
1 回答
442 浏览

rust - 如何获取用于在我的 Rust Tonic 服务中进行身份验证的客户端证书?

在我的 Rust Tonic 设置中,我在客户端和服务器之间配置了 mTLS(相互 TLS)身份验证。

现在,我想使用存储在客户端证书中的数据a)授权访问(拦截器)b)用于提供服务(即我想看看Hello PetrPetr是否正在连接)

我找不到任何关于此的示例,并且遍历 Tonic 源代码也对我没有帮助。

0 投票
1 回答
311 浏览

multithreading - 如何从标准库衍生线程向 Tokio 异步任务发送消息?

我有一个设置,我的程序使用std::thread::spawn.

我需要一个 GRPC 服务器来处理传入的命令以及工作线程完成的流输出。我正在使用tonicGRPC 服务器,它只在 Tokio 未来提供异步实现。

我需要能够从我的“正常”标准库线程向 Tokio 未来发送消息。

我在这里将我的代码简化为最低限度:

我的主要工作线程如何与 Tokio 生成的 GRPC 服务器通信?

0 投票
0 回答
698 浏览

rust - 有没有办法在同一个主目录中同时启动 tonic gRPC 和 actix Web 应用程序?

我正在尝试实现一个服务于 gRPC 和 REST 调用并且由单个二进制文件启动的服务器。

在这个主要功能中,我试图启动一个 tonic gRPC 服务器和一个 actix-web REST API。

我找到了这个答案,但它对我不起作用:使用 Tokio 应用程序中的 Actix:混合 actix_web::main 和 tokio::main?

Tonic 使用#[tokio::main]而 actix 使用#[actix_web::main]

我运行cargo expand了两个主要功能并得到以下信息:

  • #[tokio::main]
  • #[actix_web::main]

我尝试遵循此讨论中的代码:https://github.com/actix/actix-web/issues/1283他们在其中使用此代码:

但我收到一个编译错误,说 `expected struct tokio::task::local::LocalSet, found struct LocalSet,我不知道如何继续。

我对 Rust 很陌生,所以任何建议都值得赞赏。

0 投票
1 回答
253 浏览

rust - 取消固定 BoxStream 以使用 Tonic gRPC 流发送

我是 Rust 的新手,正在编写一个简单的应用程序,该应用程序将使用Tonic通过 gRPC 流式传输一些值。这些值最初是从外部库作为BoxStream ( Pin<Box<Stream>>) 获取的,并且 tonic 的 API 需要实现的东西Stream(当然 Pin 不需要)。

Tonic 的流式传输示例使用ReceiverStream将 mpsc 通道转换为流,并分离一个线程以将值推送到其中。这将需要一个流的生命周期,'static这对于我的实际实现来说不是一个选项,因为我的流的生命周期与返回它的类相关联。

提供实现 Stream 的东西的最佳方式是什么,我可以从我Pin<Box<Stream>>

src/main.rs(这不会编译,因为 BoxStream<'static, Entry> 没有实现 IntoStreamingRequest)

货运.toml

提供编译错误:

0 投票
1 回答
87 浏览

rust - 在塔层中检索请求主体以签署 GRPC 请求

我正在尝试使用塔式中间件层功能在 grpc 之上(通过 tonic)实现身份验证层。为此,我需要获取请求的主体,包括发送到服务器的 protobuf 有效负载,使用 HMAC 对其进行身份验证,然后在元数据/标头中设置身份验证 HMAC。

但是,我在通过 API 检索请求正文时遇到了一些问题,这似乎没有等待整个请求被概括为小型和大型流式请求。后者在实际向服务器发出请求之前需要在内存中缓冲一个大的主体。由于我可以控制要拦截的请求,并且我知道我的请求足够小,可以在内存中缓冲而没有太多开销,因此这种概括增加了一些我不知道如何处理的复杂性。

我的图层目前看起来像这样:

它失败是因为request是不可变的,因此我们不能调用data()身体。由于请求很小,我可以克隆整个请求,缓冲正文,然后在其上计算 HMAC,然后再将请求转发给inner服务,但我尝试的一切都失败了。但是,理想情况下,可以就地缓冲并转发原件。

我怎样才能得到身体http::Request

0 投票
2 回答
405 浏览

rust - 没有为 Type 实现 trait `std::marker::Copy`

我正在尝试在 b/w 不同的线程周围移动一些数据,但收到 ole Copy trait-not-implemented 错误。这是一些代码:

错误:

我不能(或者我可以)Copy在结构上添加属性,Publisher但这不起作用,因为并非所有字段都实现了Copy. 尽管如此,我已经注释掉了Publisher不隐含的字段Copy并将属性添加到它只是为了查看,并且通过这种方法我得到:

Request 是protobuf使用 prost lib 编译的基于结构的结构。我无法向其中添加Copy属性,因为它的某些字段没有实现Copy,例如Stringand Timestamp

我想知道这里的设计是否天生就很糟糕,或者是否有一个简单的修复方法。

0 投票
0 回答
64 浏览

rust - 如何集成测试补品应用

嗨,我有一个简单的应用程序,它有一个 gRPC 方法,它可以按预期工作,但是我不知道如何正确集成测试它。(我也是生锈的新手)。即我想调用 gRPC add_merchant 方法并检查响应是否包含正确的值。

我有以下结构:

商人.proto

商人.rs

main.rs

Mercer_test.rs 应该是什么样子?