这是我的场景。grpc 服务器是一个异步服务器,它从其他源订阅数据。它还为其客户端提供了订阅功能,因此一旦从其他来源接收到数据,它就可以将数据推送到 grpc 客户端。服务器是用Java 实现的。
@Override
public StreamObserver<Message> subscribe (
StreamObserver<Message> responseObserver) {
return new StreamObserver<Message>() {
@Override
public void onNext(Message message) {
api.subscribe(message.value, Message -> {
synchronized (responseObserver) {
...
...
// get data from other source
responseObserver.onNext(Converter.create().toProtobuf(Message.class, data));
}
});
}
@Override
public void onError(Throwable t) {
log.warn("Encountered error in sub", t);
}
@Override
public void onCompleted() {
responseObserver.onCompleted();
}
};
}
Run Code Online (Sandbox Code Playgroud)
我想使用 python 实现 grpc 客户端来订阅该服务器。然而,奇怪的是,Python一旦订阅数据,就立即关闭,而不等待Java服务器的异步返回。然而,Java 客户端可以永远运行并等待来自服务器的异步数据。
原型
message Message{
string value = 1;
}
service test …Run Code Online (Sandbox Code Playgroud) Protocol buffers 的官方文档https://developers.google.com/protocol-buffers/docs/proto3说 protobuf 消息中字段的最大字段数是 2^29-1。但为什么会有这个限制呢?请问谁能详细解释一下吗?我对此是新手。
我阅读了这个问题的答案,即Why 2^29-1 is the Maximum key in protocol buffers。但我并没有澄清
背景:
我们正在尝试将我们的 API 网关从 REST 迁移到 gRPC。API Gateway 将由 Backend Team 使用REST 使用,API Gateway 与微服务的通信将使用gRPC。我们的 API 网关使用Tornado Python 框架、Gunicorn构建,并tornado.curl_httpclient.CurlAsyncHTTPClient用于为每个端点启用 Async/Future。每个端点将使用一元 RPC调用微服务,gRPC 存根将返回Future。
因此,在完全迁移到 gRPC 之前,我们尝试比较 gRPC 与 REST 的性能。以下是您可能需要了解的详细信息:
/0, /1, 和/2单个字符串负载。有效载荷大小为 100KB、1MB 和 4MB。这些消息在实例刚启动时就已经创建好了,所以端点只需要检索它。我正在使用最新的 Ubuntu 21.04 for aarch64。为了试验 gRPC,我安装了 grpc 东西:
python3 -m pip install grpc
python3 -m pip install grpcio-tools
Run Code Online (Sandbox Code Playgroud)
我也尝试过:
pip3 install grpc
pip3 install grpcio-tools
Run Code Online (Sandbox Code Playgroud)
这些似乎很成功,但是当我尝试从 .proto 文件生成 gRPC Python 代码时,系统告诉我没有安装 grpcio-tools。
如何解决这个问题?Ubuntu for aarch64 刚刚坏了吗?
是否可以使用 protoc 从生成的 pb2.py 中获取 proto 文件?gRPC 是否可以进行相同的逆向工程?
我有一个 grpc 服务器(在 Go 中),它具有有效的 TLS 证书,并且不需要客户端 TLS。由于某种原因,我无法在 Python 中实现没有 mTLS 的客户端,尽管我可以在 Golang 中实现。
在Python中我有
os.environ["GRPC_VERBOSITY"] = "DEBUG"
# os.environ["GRPC_DEFAULT_SSL_ROOTS_FILE_PATH"] = "/etc/ssl/certs/ca-bundle.crt"
channel = grpc.secure_channel(ADDR, grpc.ssl_channel_credentials())
grpc.channel_ready_future(channel).result(timeout=10)
Run Code Online (Sandbox Code Playgroud)
这给了我以下错误
D0513 08:02:08.147319164 21092 security_handshaker.cc:181] Security handshake failed: {"created":"@1652446928.147311309","description":"Handshake failed","file":"src/core/lib/security/transport/security_handshaker.cc","file_line":377,"tsi_code":10,"tsi_error":"TSI_PROTOCOL_FAILURE"}
Run Code Online (Sandbox Code Playgroud)
如果我通过取消注释行来使用 SSL 证书,我可以让它工作。我知道我的服务器不会请求、要求或验证客户端证书,因为以下 Go 代码可以完美运行
D0513 08:02:08.147319164 21092 security_handshaker.cc:181] Security handshake failed: {"created":"@1652446928.147311309","description":"Handshake failed","file":"src/core/lib/security/transport/security_handshaker.cc","file_line":377,"tsi_code":10,"tsi_error":"TSI_PROTOCOL_FAILURE"}
Run Code Online (Sandbox Code Playgroud) 大家好,我正在接触 gRPC 和协议缓冲区,并且发现了一篇文章,其中提到消息的二进制 protobuf 文件比 Json 对应文件小 5 倍,但在那篇文章中提到这种级别的压缩可以只有通过 gRPC 传输才能实现。这个特定的评论“通过 gRPC 传输时可能进行压缩”,我似乎无法理解,因为我理解协议缓冲区是一种序列化格式,可以与 gRPC 无关地工作,或者这种理解是否有缺陷?这意味着什么?这是文章和屏幕截图的链接。
https://www.datascienceblog.net/post/programming/essential-protobuf-guide-python/

我试图了解如何使用双向流处理 grpc api(使用 Python API)。
假设我有以下简单的服务器定义:
syntax = "proto3";
package simple;
service TestService {
rpc Translate(stream Msg) returns (stream Msg){}
}
message Msg
{
string msg = 1;
}
Run Code Online (Sandbox Code Playgroud)
假设将从客户端发送的消息异步发送(由于用户选择了一些 ui 元素)。
为客户端生成的 python 存根将包含一个方法Translate,该方法将接受生成器函数并返回一个迭代器。
我不清楚的是我将如何编写生成器函数来返回用户创建的消息。在等待消息时睡在线程上听起来不是最好的解决方案。
grpc 客户端何时创建和关闭连接?
我以以下方式开始代码:
channel = grpc.insecure_channel('localhost:8888')
stub = myservice_pb2_grpc.MyServiceStub(channel)
Run Code Online (Sandbox Code Playgroud)
声明 a 是否会channel在进程的整个生命周期内创建一个套接字?
因为即使我提供了无效的地址,insecure_channel()在发出第一个请求之前我也看不到任何错误。
或者,套接字仅在发出请求时创建并随后关闭?
我有 django REST API,我正在尝试将其转换为 gRPC。我遵循Django grpc 框架指南并创建了以下文件:
class Organization(models.Model):
Org_name = models.CharField(max_length=100, unique=True, primary_key=True, db_index=True)
Address = models.CharField(max_length=100)
Description = models.CharField(max_length=500)
Number_of_emp = models.IntegerField()
Run Code Online (Sandbox Code Playgroud)
package org;
import "google/protobuf/empty.proto";
service OrganizationController {
rpc List(OrganizationListRequest) returns (Organizations) {}
rpc Create(Organization) returns (Organization) {}
rpc Retrieve(OrganizationRetrieveRequest) returns (Organization) {}
rpc Update(Organization) returns (Organization) {}
rpc Destroy(Organization) returns (google.protobuf.Empty) {}
}
message Organization {
string Org_name = 1;
string Address = 2;
string Description = 3;
int32 Number_of_emp = 4; …Run Code Online (Sandbox Code Playgroud) grpc-python ×10
grpc ×9
python ×6
connection ×1
django ×1
grpc-go ×1
grpc-java ×1
gunicorn ×1
java ×1
performance ×1
protoc ×1
sockets ×1
ssl ×1
tornado ×1
ubuntu ×1