You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

gRPC与Protobuf:脚本发起通信场景下的客户端/服务器角色判定

确定gRPC角色:脚本做客户端,业务软件做服务器

首先明确结论:你的Python/Bash脚本应该作为gRPC客户端,而原来的业务软件需要作为gRPC服务器。这完全匹配你“脚本主动发起通信”的要求,也契合gRPC标准的请求/响应模式——只是你之前可能没把自己的业务场景和示例对应起来,下面详细拆解:

为什么这样设计?

你原来的流程是:业务软件在特定阶段主动调用脚本,并向脚本传递参数。现在要改成脚本主动发起通信来完成参数传递,本质上相当于脚本主动“请求”业务软件把需要的参数发给自己,这完全符合gRPC客户端发起请求、服务器返回响应的经典模式:

  • 脚本(客户端):主动建立连接,发起参数获取请求
  • 业务软件(服务器):监听端口,等待脚本的请求,收到后把交易状态、数值等参数打包成响应返回

具体实现步骤(以Python脚本为例)

1. 定义Protobuf消息和服务

先写一个.proto文件,比如script_params.proto:

syntax = "proto3";

package script_params;

// 脚本发起请求的消息(如果不需要额外标识,也可以留空)
message ParameterRequest {
  string script_id = 1; // 可选:标识是哪个脚本发起的请求
}

// 业务软件返回的参数消息
message ParameterResponse {
  string transaction_status = 1;
  double numeric_value = 2;
  // 可以根据实际需求添加更多字段
}

// 定义gRPC服务
service ScriptParameterService {
  rpc GetParameters(ParameterRequest) returns (ParameterResponse);
}

2. 生成Python gRPC代码

用protoc工具生成对应的Python代码:

python -m grpc_tools.protoc -I./ --python_out=./ --grpc_python_out=./ script_params.proto

这会生成script_params_pb2.py(消息类)和script_params_pb2_grpc.py(服务存根和骨架)。

3. 业务软件端实现gRPC服务器

在你的业务软件中(如果是Python开发的话),实现ScriptParameterService的服务逻辑,启动服务器:

import grpc
from concurrent import futures
from script_params_pb2 import ParameterResponse
from script_params_pb2_grpc import ScriptParameterServiceServicer, add_ScriptParameterServiceServicer_to_server

class ScriptParameterServicer(ScriptParameterServiceServicer):
    def GetParameters(self, request, context):
        # 这里替换成你业务软件中获取参数的逻辑
        transaction_status = "SUCCESS"
        numeric_value = 123.45
        return ParameterResponse(
            transaction_status=transaction_status,
            numeric_value=numeric_value
        )

def serve():
    server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
    add_ScriptParameterServiceServicer_to_server(ScriptParameterServicer(), server)
    server.add_insecure_port('[::]:50051')
    server.start()
    server.wait_for_termination()

if __name__ == '__main__':
    serve()

4. Python脚本作为客户端发起请求

在你的Python脚本中,编写客户端代码,主动连接服务器获取参数:

import grpc
from script_params_pb2 import ParameterRequest
from script_params_pb2_grpc import ScriptParameterServiceStub

def get_parameters():
    with grpc.insecure_channel('localhost:50051') as channel:
        stub = ScriptParameterServiceStub(channel)
        response = stub.GetParameters(ParameterRequest(script_id="my_trade_script"))
        print(f"获取到交易状态: {response.transaction_status}")
        print(f"获取到数值参数: {response.numeric_value}")
        # 这里可以继续执行脚本的原有逻辑,使用获取到的参数

if __name__ == '__main__':
    get_parameters()

5. Bash脚本的适配方案

如果是Bash脚本,你可以用grpcurl工具(一个命令行gRPC客户端)来发起请求:

# 先确保已经安装grpcurl
grpcurl -plaintext localhost:50051 script_params.ScriptParameterService/GetParameters <<EOF
{
  "script_id": "my_bash_script"
}
EOF

然后你可以把返回的JSON结果解析出来,在Bash脚本中使用。

总结

这个设计完全满足你的需求:

  • 脚本主动发起gRPC通信(作为客户端)
  • 完成交易状态、数值等参数的传递
  • 复用了gRPC标准的请求/响应模式,和你看到的示例逻辑一致,只是角色对应到了你的业务场景中

内容的提问来源于stack exchange,提问作者Mark

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 06:44:38