微观-简单的微服务配置
microcosm的Python项目详细描述
简单的微服务配置
编写良好的微服务是小而单一的目的;任何非琐碎的生态系统都有 一组这样的服务,每个服务执行不同的功能。不可避免地,这些服务 将使用公共代码和结构;此库提供了一个简单的构造机制 这些共享组件并将它们连接到服务中。
术语
microservice
是一个小型软件应用程序。它由几个较小的部分组成 很多软件都是可重用的。component
是这些(可能是可重用的)软件之一。factory
是用于创建组件的函数;它可能是对象的构造函数。config dict
是一个具有字符串值键的嵌套字典。它包含使用的数据 由工厂创建组件。object graph
是可以相互引用(非循环)的组件的集合。binding
是字符串值键。它用于标识对象图中的组件 以及为组件工厂保留的配置dict的子部分。
基本用法
为
components
定义工厂函数,将它们附加到binding
,并提供 (可选)配置defaults
:from microcosm.api import defaults, binding @binding("foo") @defaults(baz="value") def create_foo(graph): return dict( # factories can reference other components bar=graph.bar, # factories can reference configuration baz=graph.config.foo.baz, ) @binding("bar") def create_bar(graph): return dict()
工厂函数可以访问
object graph
,并通过它访问config dict
。违约 配置值(如果提供)在提供的绑定中预先填充;这些值可以是 从外部源加载的数据重写。通过创建新的对象图和服务元数据将微服务连接在一起:
from microcosm.api import create_object_graph graph = create_object_graph( name="myservice", debug=False, testing=False, )
工厂可以通过
graph.metadata
访问服务元数据。这允许有几个 最佳实践:- 组件可以实现整个生态系统的约定(例如,对于日志或持久性)。 使用服务名称作为鉴别器。
- 组件可以在开发(
debug=True
)和单元期间自定义其行为 测试(testing=True
)
引用
object graph
中的任何binding
来访问相应的component
:print(graph.foo)
组件被初始化lazily。在本例中,第一次访问
graph.foo
, 绑定工厂(create_foo()
)被自动调用。因为这家工厂 访问graph.bar
,链中的下一个工厂(create_bar()
)也将被调用 如果还没有人叫它的话。不允许图形周期,尽管依赖组件可能缓存图形实例 在初始化完成后访问依赖组件。
或者,显式初始化微服务的组件:
graph.use( "foo", "bar", )
虽然通过访问
graph.foo
或graph.bar
可以实现相同的效果,但是 构造的优点是预先初始化列出的组件并触发 尽早出现任何配置错误。也可以disable任何随后的延迟初始化,防止 后续操作中的意外初始化:
graph.lock()
假设
这个库受到pinject项目的影响,但是 做了一些假设,以便进行大量简化:
微服务足够小,简单的字符串绑定就足够了。或者换一种说法, 相同绑定组件之间的冲突是不需要考虑的,不需要 对于显式作用域。
微服务使用进程,而不是线程来扩展。因此,线程同步是 没有进球。
对象图的模拟(和修补)很重要,需要很容易。单元测试 希望使用'unittest.mock库;临时替换组件应该很简单。
有些组件是修改其他组件而不是对象的函数 需要实例化的。