命令行界面¶
Nameko 提供了一个命令行界面,使托管和与服务交互变得尽可能简单。
运行服务¶
$ nameko run <module>[:<ServiceClass>]
发现并运行一个服务类。此命令将在前台启动服务,并运行直到进程终止。
可以使用 --config
选项覆盖默认设置
$ nameko run --config ./foobar.yaml <module>[:<ServiceClass>]
并提供一个简单的 YAML 配置文件:
# foobar.yaml
AMQP_URI: 'pyamqp://guest:guest@localhost'
WEB_SERVER_ADDRESS: '0.0.0.0:8000'
rpc_exchange: 'nameko-rpc'
max_workers: 10
parent_calls_tracked: 10
LOGGING:
version: 1
handlers:
console:
class: logging.StreamHandler
root:
level: DEBUG
handlers: [console]
LOGGING
条目将传递给 logging.config.dictConfig()
,并应符合该调用的模式。
配置值可以通过内置的 Config 依赖提供者读取。
环境变量替换¶
YAML 配置文件支持环境变量。您可以使用 bash 风格的语法: ${ENV_VAR}
。可选地,您可以提供默认值 ${ENV_VAR:default_value}
。默认值可以递归包含环境变量 ${ENV_VAR:default_${OTHER_ENV_VAR:value}}
(注意:此功能需要 regex 包)。
# foobar.yaml
AMQP_URI: pyamqp://${RABBITMQ_USER:guest}:${RABBITMQ_PASSWORD:password}@${RABBITMQ_HOST:localhost}
要运行您的服务并为其设置环境变量:
$ RABBITMQ_USER=user RABBITMQ_PASSWORD=password RABBITMQ_HOST=host nameko run --config ./foobar.yaml <module>[:<ServiceClass>]
如果您需要在 YAML 文件中引用值,则需要显式使用 !env_var
解析器:
# foobar.yaml
AMQP_URI: !env_var "pyamqp://${RABBITMQ_USER:guest}:${RABBITMQ_PASSWORD:password}@${RABBITMQ_HOST:localhost}"
如果您需要在 YAML 文件中将值用作原始字符串,而不希望它们转换为原生 Python 类型,则需要显式使用 !raw_env_var
解析器:
# foobar.yaml
ENV_THAT_IS_NEEDED_RAW: !raw_env_var "${ENV_THAT_IS_NEEDED_RAW:1234.5660}"
这将变成字符串值 1234.5660
,而不是浮点数。
您可以提供多个级别的默认值:
# foobar.yaml
AMQP_URI: ${AMQP_URI:pyamqp://${RABBITMQ_USER:guest}:${RABBITMQ_PASSWORD:password}@${RABBITMQ_HOST:localhost}}
此配置接受 AMQP_URI 作为环境变量,如果提供了,RABBITMQ_* 嵌套变量将不会被使用。
环境变量值被解释为 YAML,因此可以使用丰富的类型:
# foobar.yaml
...
THINGS: ${A_LIST_OF_THINGS}
$ A_LIST_OF_THINGS=[A,B,C] nameko run --config ./foobar.yaml <module>[:<ServiceClass>]
环境变量的解析器将配对所有括号。
# foobar.yaml
LANDING_URL_TEMPLATE: ${LANDING_URL_TEMPLATE:https://example.com/{path}}
因此,此配置的默认值将是 https://example.com/{path} 。
与运行中的服务交互¶
$ nameko shell
启动一个交互式 Python Shell,用于与远程 Nameko 服务进行交互。这是一个常规的交互式解释器,内置命名空间中增加了一个特殊模块 n
,提供了进行 RPC 调用和调度事件的能力。
向 "target_service" 进行 RPC 调用:
$ nameko shell
>>> n.rpc.target_service.target_method(...)
# RPC 响应
作为 "source_service" 调度事件:
$ nameko shell
>>> n.dispatch_event("source_service", "event_type", "event_payload")