微观-简单的微服务配置

microcosm的Python项目详细描述


简单的微服务配置

编写良好的微服务是小而单一的目的;任何非琐碎的生态系统都有 一组这样的服务,每个服务执行不同的功能。不可避免地,这些服务 将使用公共代码和结构;此库提供了一个简单的构造机制 这些共享组件并将它们连接到服务中。

Circle CI

术语

  • microservice是一个小型软件应用程序。它由几个较小的部分组成 很多软件都是可重用的。
  • component是这些(可能是可重用的)软件之一。
  • factory是用于创建组件的函数;它可能是对象的构造函数。
  • config dict是一个具有字符串值键的嵌套字典。它包含使用的数据 由工厂创建组件。
  • object graph是可以相互引用(非循环)的组件的集合。
  • binding是字符串值键。它用于标识对象图中的组件 以及为组件工厂保留的配置dict的子部分。

基本用法

  1. 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。违约 配置值(如果提供)在提供的绑定中预先填充;这些值可以是 从外部源加载的数据重写。

  2. 通过创建新的对象图和服务元数据将微服务连接在一起:

    from microcosm.api import create_object_graph
    
    graph = create_object_graph(
        name="myservice",
        debug=False,
        testing=False,
    )
    

    工厂可以通过graph.metadata访问服务元数据。这允许有几个 最佳实践:

    • 组件可以实现整个生态系统的约定(例如,对于日志或持久性)。 使用服务名称作为鉴别器。
    • 组件可以在开发(debug=True)和单元期间自定义其行为 测试(testing=True
  3. 引用object graph中的任何binding来访问相应的component

    print(graph.foo)
    

    组件被初始化lazily。在本例中,第一次访问graph.foo, 绑定工厂(create_foo())被自动调用。因为这家工厂 访问graph.bar,链中的下一个工厂(create_bar())也将被调用 如果还没有人叫它的话。

    不允许图形周期,尽管依赖组件可能缓存图形实例 在初始化完成后访问依赖组件。

  4. 或者,显式初始化微服务的组件:

    graph.use(
        "foo",
        "bar",
    )
    

    虽然通过访问graph.foograph.bar可以实现相同的效果,但是 构造的优点是预先初始化列出的组件并触发 尽早出现任何配置错误。

    也可以disable任何随后的延迟初始化,防止 后续操作中的意外初始化:

    graph.lock()
    

假设

这个库受到pinject项目的影响,但是 做了一些假设,以便进行大量简化:

  1. 微服务足够小,简单的字符串绑定就足够了。或者换一种说法, 相同绑定组件之间的冲突是不需要考虑的,不需要 对于显式作用域。

  2. 微服务使用进程,而不是线程来扩展。因此,线程同步是 没有进球。

  3. 对象图的模拟(和修补)很重要,需要很容易。单元测试 希望使用'unittest.mock库;临时替换组件应该很简单。

  4. 有些组件是修改其他组件而不是对象的函数 需要实例化的。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
使用毕加索在imageView上使用java包装内容   java加载消息未隐藏在Recyclerview 安卓中   java Azure Android CloudAppendBlob在尝试查看数据时导致错误409(冲突)   java Intellij Maven变量   java无法在某些通知后接收pushnotification   java如何防止两个按钮同时设置动画?   将Java映像适配到JFrame中   java Spring在使用多个数据源时遇到批处理问题,面临IllegalStateException:无法打开事务的JPA EntityManager:已存在值   安卓 kotlin协同程序可以像java定时器一样使用吗?   用Java程序查询iPhone联系人   实现多个接口的JavaSpringbean   java无法获取colorchooser以更改线条颜色   java如何使用SpringMVC4和HibernateValidator正确设置验证?   日志我如何使用和管理日志[Log4j]java?   java我应该在哪里声明代码中的字段以便编译?   java为什么我不能移动我的角色?   Java Point类move()与setLocation()的比较   检索自签名jar的证书时出现java问题