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

如何从独立Python脚本中调用已运行的Nameko RPC微服务

问题描述

以下代码用于定义微服务:

from nameko.rpc import rpc


class GreetingService:
    name = "greeting_service"

    @rpc
    def hello(self, name):
        return "Hello, {}!".format(name)
    
class MultiplyService:
    name = "multiply_service"
    
    @rpc
    def multiple(self,a,b):
        return str(int(a) * int(b))
  • 服务已正常启动,运行状态:服务运行状态截图
  • 通过nameko shell可正常访问服务,验证截图:
    • nameko shell访问验证截图1
    • nameko shell访问验证截图2
  • 从独立Python脚本调用该微服务失败,异常截图:Python脚本调用异常截图
问题根因

缺失独立RPC客户端的必要初始化步骤:

  • nameko shell内置了消息代理连接、RPC代理初始化逻辑,不需要手动配置即可调用服务,但独立Python脚本没有这套默认逻辑
  • 直接导入服务类实例化调用属于本地进程内调用,不会和已经启动的微服务进程通过消息中间件通信,必然调用失败
  • 没有配置Nameko依赖的AMQP消息中间件(默认是RabbitMQ)连接信息,RPC客户端无法接入服务集群。
解决方案

使用Nameko提供的独立RPC代理ClusterRpcProxy初始化客户端,正确实现代码如下:

from nameko.standalone.rpc import ClusterRpcProxy

# 替换为你实际使用的RabbitMQ连接地址,本地默认部署使用下方配置即可
CONFIG = {
    "AMQP_URI": "amqp://guest:guest@localhost:5672//"
}

if __name__ == "__main__":
    # 建立RPC连接,通过代理访问远程服务
    with ClusterRpcProxy(CONFIG) as rpc:
        # 调用greeting_service的hello方法
        print(rpc.greeting_service.hello("Nameko"))
        # 调用multiply_service的multiple方法
        print(rpc.multiply_service.multiple(4, 6))

注意事项

  • 确保运行独立脚本的环境可以正常连通微服务使用的RabbitMQ实例,网络策略、账号密码配置正确
  • 如果不想硬编码AMQP连接地址,可以在运行脚本前配置环境变量NAMEKO_AMQP_URI,值为对应AMQP连接串,初始化ClusterRpcProxy时可以不传CONFIG参数
  • 不要在独立脚本中直接实例化你定义的GreetingService/MultiplyService类调用方法,这类调用不会走RPC通信链路。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 11:06:23