brewblox后端服务的脚手架
brewblox-service的Python项目详细描述
brewblox服务应用的脚手架
为了减少服务之间的代码重复,这里实现了通用功能。
有关如何基于brewblox-service
实现自己的服务的示例,请参见https://github.com/brewblox/brewblox-boilerplate。
brewblox-service
在技术上可以作为独立应用程序启动,但不会非常有用。
brewblox_service
这里定义了小型通用工具。
brewblox_logger
可用于创建特定于模块的记录器。它不是必需的,但使用日志的默认格式会更好一些。
示例:
frombrewblox_serviceimportbrewblox_loggerLOGGER=brewblox_logger(__name__)LOGGER.info('hello')
service.py
解析命令行参数,创建一个aiohttp
应用程序,并运行它。
最短的实现方式是:
app=service.create_app(default_name='my_service')service.furnish(app)service.run(app)
这将为您提供一个工作的web应用程序,但它只支持/_service/status
健康检查端点。
应用程序可以配置自己的功能,并添加新的命令行参数。
示例:
# Separately creating the parser allows adding arguments to the default setparser=service.create_parser(default_name='my_service')parser.add_argument('--my-arg')# Now create the appapp=service.create_app(parser=create_parser())# Add features for this servicedevice.setup(app)api.setup(app)# Furnish and runservice.furnish(app)service.run(app)
features.py
许多服务特性都是应用程序范围内的。它们的生命周期应该跨越多个请求,要么是因为它们不是请求驱动的,要么是因为它们管理异步I/O操作(比如监听AMQP消息)。
ServiceFeature
类为这种行为提供了一个抽象基类。实现类应该定义startup(app)
和shutdown(app)
函数,这些函数将在应用程序启动和关闭时自动调用。
在异步上下文中调用startup()
和shutdown()
,使它们成为__init__()
和__del__()
函数的异步对应项。
功能必须在创建应用程序之后,但在它开始运行之前构造。(service.create_app()
和service.run(app)
)
使用add()
和get()
函数可以轻松地集中声明功能,然后在任何引用aiohttp应用程序的函数中使用它。
events.py
这里处理与amqp事件总线的传入和传出通信。
EventListener
允许订阅eventbus消息。它将在收到回调时触发回调。可以随时(也可以在应用程序开始运行之前)设置订阅。
侦听器被设计为在无法访问EventBus时正常降级。不会引发任何错误,它将定期尝试重新连接并还原其订阅。
有关EventListener
的实际实现,请参见brewblox_history
EventPublisher
负责向eventbus发送新消息。每个应用程序一个发布服务器就足够了。
与EventListener
相反,发布服务器在尝试发布到无法访问的eventbus主机时将引发异常。
它将尝试为每个后续消息重新连接-不需要显式连接管理。