我已经编写了一个Python GRPC客户端,可以连接到许多GRPC高浪服务。我已经能够像这样完成这项工作:
from alphausblue.connection.conn import grpc_client_connection
from alphausblue.iam.v1.iam_pb2 import WhoAmIRequest
from alphausblue.iam.v1.iam_pb2_grpc import IamStub
async def main():
conn = grpc_client_connection(svc = "blue")
stub = IamStub(conn)
resp = await stub.WhoAmI(WhoAmIRequest())
print(resp)
其中服务名称为 。但是,如果我尝试连接到其他服务来请求如下数据:blue
from alphausblue.connection.conn import grpc_client_connection
from alphausblue.cost.v1.cost_pb2 import ListAccountsRequest
from alphausblue.cost.v1.cost_pb2_grpc import CostStub
async def main():
conn = grpc_client_connection(svc = "cost")
stub = CostStub(conn)
account = await stub.GetAccount(GetAccountRequest(vendor = 'aws', id = '731058950257'))
print(account)
我得到一个未实现的响应。如果该服务不存在,这将是有道理的,但它确实存在,并且我的Golang客户端可以很好地连接到它。此外,当我检查服务器的日志时,我可以清楚地看到请求已到达服务器。做了更多的研究,我在我的服务器上发现了这段代码:
type service struct {
UserInfo *blueinterceptors.UserData
cost.UnimplementedCostServer
}
func (s *service) GetAccount(ctx context.Context, in *cost.GetAccountRequest) (*api.Account, error) {
switch in.Vendor {
case "aws":
// Do stuff
default:
return status.Errorf(codes.Unimplemented, "not implemented")
}
}
这告诉我的是,正在调用函数,但正在反序列化的有效负载缺少该字段。但是,在调试时,我可以看到这行:vendor
src/核心/库/安全/传输/secure_endpoint.cc:296] 写 0000018E2C62FB80: 00 00 00 13 0a 03 61 77 73 12 0c 37 33 31 30 35 38 39 35 30 32 35 37 '......哇.731058950257'
因此,数据通过 GRPC 发送到服务器,但被反序列化为缺少字段的对象。那么,这是什么原因呢?
更新
我查看了Python和Golang客户端的定义,正如@blackgreen所建议的那样。GetAccountRequest
高浪客户端代码:
// Request message for the Cost.GetAccount rpc.
type GetAccountRequest struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
Vendor string `protobuf:"bytes,1,opt,name=vendor,proto3" json:"vendor,omitempty"`
Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"`
}
很明显,这里的字段顺序相同,因此我认为除非GRPC使用而不是.,否则这不是问题所在。indexnumber
千巷猫影
相关分类