Nature

English|中文

Nature 是什么?

以领域驱动为依据,集数据定义、处理、存储、查询为一体的业务系统辅助开发平台。

Nature 使用下游"自然选择"上游的方式来替代传统的上游控制下游方式来构建系统,它将集中控制的一对多变为去中心化的一对一,从而将事务的复杂性大为降低,这可以大幅度精简业务模型,并满足业务快速迭代的需要,使得系统在不断自由选择中实现进化,这也是本项目名称的寓意所在。

Nature口号?

让数据主导技术团队而不是反过来。

现有业务系统的问题

系统复杂的一个重要原因在于技术团队主导数据,这会导致数据与技术的耦合!最直接的证据就是接口,接口是一种技术实现,但作为数据的入参和出参必须依附于接口才有意义。另一个证据就是,很多时候只有深入代码我们才能了解数据之间的关系变化。

技术是复杂多变的,当技术这一手段或工具”绑架“数据后,数据便变成了技术的奴仆,使业务的管理和调整变得困难且成本高昂。具体体现在:

Nature 要解决的核心问题

Nature 的解决之道

Nature 的实现类似于传统的数据库,也强调数据定义,以及数据间的关系。区别在于 Nature 以领域的组织数据定义,以数据关系来约束业务流程开发,并辅以各种增值能力来简化流程开发。

数据定义

Nature的数据定义(称之为 Meta)可看作是大众化的目标定义。之所以称之为目标定义,是因为系统的产物就是数据,数据就是我们的目标,朴素、本质,直观、简洁且可视化,所以 Nature 的数据定义定义了系统的目标;之所以称之为大众化的,是因为不需要很高的技术门槛。不同于数据库的数据定义:

数据间的关系

Nature 间的数据关系(称之为 Relation)可看作是大众化的行为准则。我们既然有了大众化的目标,就相应的应该有实现这些目标的大众化的行为准则。

所谓的大众化的,是说 Nature 数据关系的内涵简单,如下:

为什么叫行为准则呢?是说 Nature 的数据关系可对业务流程的开发进行强制约束。不同于数据库的关系,Nature 接管了所有的输入和输出,对系统的行为进行了强制控制。这种控制剥夺了传统系统对数据关系的隐式管理,替代了传统系统的分散的、晦涩的、定制的代码控制方式。其意义体现在:

执行器和数据实体

执行器(称之为 Executor)便是上面统一接口的具体体现。数据关系强调的是数据间存在因果关系,至于因果如何转化则需要借助于执行器来实现。Nature 为执行器提供给定的输入,执行器则必须产出 Nature 要求的输出。

如,订单和发票之间可以有一个 Relation。至于如何依据一笔订单生成一条发票数据,那便是 Executor 的工作,Executor由 Nature 在合适的时机进行调度。

上面的输入和输出都是数据实体(称之为 Instance)。数据定义用于表示某一类数据,而数据实体则表示该类数据下的某一个具体数据。每个数据实体只能属于一个数据定义。 

Nature 名字的内含

大自然这个客观世界由事物(数据)及事物间的相互作用(数据关系)构成,本系统也是基于这两点进行构建,因此取名 Nature。

自然的另外一层意思是自然选择,自然选择是生态系统的基本法则,法则没有去控制,无为而治,但却显现出了强大的无形控制。对于一个系统来讲,规模越大,控制的难度也成几何级增加,与其控制繁杂的具体事物,不如守住简单统一的规则。

Nature 的自然选择体现在数据关系的处理上:下游选择上游而不是上游控制下游。上游没有必要知道有多少个下游,也不用关心如何流转到下游,而下游只管提出哪个上游能满足我即可。不选择控制的原因在于:

Nature 遵从第一性原理:选择遵从内心的需要,不需要控制;这里的控制是对业务的控制而不是对技术的控制。

Nature 用一对一这种简单关系来诠释完整的业务模型,其复杂性是自然而然“涌现”出来的,不是我们刻意设计出来的;“涌现”一词借鉴于《失控》。

Nature 价值

基于上面的价值,Nature 还可以将价值进一步延申,如下:

业务特性

技术特性

快速开始

我们需要做下面的工作

启动 Nature

  1. 创建一个mysqlmariadbTidb 数据库,并执行 schema.sql
  2. 配置好.env 文件中的DATABASE_URL属性以指向您创建的数据库
  3. 启动 natrue.exe,retry.exe 和 manager.exe。

基于 Nature 开发

  1. Meta 数据表里定义多个业务对象,如:我们定义订单订单账两个业务对象

    sql INSERT INTO meta (full_key, description, version, states, fields, config) VALUES ('B', 'sale/order', 'order', 1, '', '', ''), ('B', 'finance/orderAccount', 'order account', 1, 'unpaid|partial|paid', '', '{"master":"B:sale/order:1"}');

  2. relation 数据表使定义关系将多个业务对象关联起来,并在 Relation 里设置 Executor 用于业务对象间的转换(相当于流式计算中的 map),如上面的订单订单账可以有这样的定义:

    sql INSERT INTO relation (from_meta, to_meta, settings) VALUES('B:sale/order:1', 'B:finance/orderAccount:1', '{"executor":{"protocol":"localRust","url":"nature_demo:order_receivable"},"target":{"states":{"add":["unpaid"]}}}');

  3. 写代码实现您上面定义的 Executor。如果是基于 Http 的请在完成后启动它,如果是基于类库的请将之放到 与 nature.exe 相同的目录下。如对于订单订单账来讲这个逻辑是:

进行业务处理

对 Nature 发起 http post 请求,如将订单数据提交数据到 Nature,Nature 会自动按顺序驱动 Executor 来完成所定义的任务。

Natrue 的详细资料

有关JavaScript:

js 在处理 i64 或 u64 时会有精度问题,为此 nature.exemanager.exe 提供了相应的 JS 结尾的接口,这些接口使用 String 来代替 u64 或者 i64。

深入了解Nature

现有开发模式的问题分析及解决方法

如果您想了解下 Nature 的自然观,时空观,数学意义和哲学意义请阅读:Nature 架构思想

如果您想在实际情况中了解如何应用 Nature 请阅读:示例及功能讲解一些业务情景的解决方法

如果您想了解 Nature 的技术特性以及这些特性是如何实现的请阅读:Nature 的技术特性

如果您想了解 Nature 与流式计算,消息系统,工作流等的区别请阅读:与其他框架的比较

其它说明

图形化管理界面

杂谈

请参考:服务治理咋这么难?我想得换个治法了

更新日志