GRPC错误:status=12

本文记录了一位实习生在使用grpc服务器时遇到的MethodNotFoundError问题,经过一天的排查发现端口冲突是关键。解决办法是确保不同服务占用不同的端口,避免资源冲突。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

记录实习的一个问题,公司使用的grpc服务器,有一个服务端有一个客户端,但是客户端需要执行好几次才可以执行成功,显示的问题是

status = StatusCode.UNIMPLEMENTED
        details = "Method not found!"

等等等
我一直查,最后是端口的问题,可是我也不知道就是这个简单的问题,这个问题搞了大概一天,但是结果是好的,解决了这个问题。

server.add_insecure_port('[::]:5000')

要记得端口两个任务不要使用同一个端口,容易导致蹦掉。

你遇到的错误是: ``` grpc._channel._InactiveRpcError: <_InactiveRpcError of RPC that terminated with: status = StatusCode.UNIMPLEMENTED details = "" ``` --- ### 🧾 错误解释 `StatusCode.UNIMPLEMENTED` 表示客户端调用了一个服务方法,但服务端没有实现该方法。也就是说,你在客户端调用了 `CmdInsertOrd()` 方法,但 gRPC 服务器并没有真正实现这个接口。 这通常发生在以下几种情况中: 1. **服务端未注册或未实现对应的服务方法** 2. **proto 文件在客户端和服务端不一致**(例如客户端有 `CmdInsertOrd`,但服务端没有生成对应的 handler) 3. **gRPC 接口名拼写错误或版本不一致** --- ### ✅ 示例代码(正确调用方式的前提) 假设你的 `.proto` 文件定义如下: ```protobuf // lemon_fut.proto syntax = "proto3"; package lemon_fut; service Anyue { rpc CmdInsertOrd(stream InsertOrdReq) returns (Response); // 客户端流式 } message InsertOrdReq { string strategyID = 1; string instrumentId = 2; double price = 3; int32 volume = 4; int32 direction = 5; int32 orderProperty = 6; int32 orderType = 7; string executorId = 8; int32 tif = 9; bool isSwap = 10; } message Response { string message = 1; } ``` 你需要确保服务端实现了这个 `CmdInsertOrd` 接口,否则会报 `UNIMPLEMENTED`。 --- ### ✅ Python 服务端参考实现(伪代码) ```python import grpc from concurrent import futures import lemon_fut_pb2_grpc import lemon_fut_pb2 class AnyueServicer(lemon_fut_pb2_grpc.AnyueServicer): def CmdInsertOrd(self, request_iterator, context): for request in request_iterator: print("Received order:", request.instrumentId) return lemon_fut_pb2.Response(message="Orders received") def serve(): server = grpc.server(futures.ThreadPoolExecutor(max_workers=10)) lemon_fut_pb2_grpc.add_AnyueServicer_to_server(AnyueServicer(), server) server.add_insecure_port('[::]:50051') server.start() print("Server running...") server.wait_for_termination() if __name__ == '__main__': serve() ``` --- ### ✅ 客户端改进后的调用代码 ```python def place_order(self, order: PlaceOrder): with grpc.insecure_channel('localhost:50051') as channel: # 替换为实际地址 stub = lemon_fut_pb2_grpc.AnyueStub(channel) def generate_requests(): yield lemon_fut_pb2.InsertOrdReq( strategyID=self.config.strategy_id, instrumentId=order.code, price=order.price, volume=order.size, direction=order.direction.value, orderProperty=-50, orderType=order.order_type.value, executorId=order.executor_id, tif=order.tif.value, isSwap=order.is_swap ) try: response = stub.CmdInsertOrd(generate_requests()) print("Server response:", response.message) except grpc.RpcError as e: print(f"gRPC error: {e.code()} - {e.details()}") ``` --- ### ✅ 如何验证是否服务端已实现? 你可以使用命令行工具如 `grpcurl` 来查看服务接口是否注册成功: ```bash grpcurl -plaintext localhost:50051 list ``` 你应该能看到类似输出: ``` lemon_fut.Anyue ``` 再查看具体方法: ```bash grpcurl -plaintext localhost:50051 describe lemon_fut.Anyue ``` 你应该看到 `CmdInsertOrd` 被列出。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值