# 1. 当应用需要为其他应用提供某些功能或数据时,可以通过哪些方式实现

在许多需求当中,我们会遇见多个系统(应用)之间有依赖的问题。比如说应用 1 的功能是创建客户,其他应用 2 需要在客户创建完成后,对客户进行某些操作(比如通过微信通知到客户经理,有新的客户录入到系统了)。

在传统架构模式下,要实现此功能,大多有以下两种方式:

  1. 应用 1 提供查询客户的接口,供应用 2 进行调用。应用 2 只能定时地查询数据,识别哪些是新增的。这种方式一般叫数据拉取(pull)。
  2. 应用 2 提供接收新客户的接口,供应用 1 进行调用。当有一个新客户时,应用 1 会去调用应用 2 的接口,进行数据推送(push)。

上面两个方案对比来看,可以发现方案 1 在实时性方面相对较差,但对应用 1 来说没有耦合;而方案 2 虽然实时性高,但对应用 1 来说产生耦合。尤其是在有多个应用都需要监听新客户的时候,则对应用 1 是一个维护上的负担。

在 Engage 平台上,还有第三种方案可供选择——通过插件(Addon)的方式来实现解耦、依赖反转。应用 1 声明一个插槽,表示在新客户创建时,会调用所有注册到这个插槽下的插件,通知它们新客户的数据。应用 2 提供一个接受新客户信息的插件,通过平台的配置、发布以告知应用 1。具体流程如下:

  1. 应用 1 声明一个插槽,该插槽表明,一个插件需要提供一个接口地址。在调用该接口时,会提供什么样的新客户的信息。
  2. 应用 2 开发一个接收新客户数据的接口。
  3. 应用 2 配置一个插件,然后发布。
  4. 应用 1 在新客户创建时,通过平台查询到所有注册到新客户插槽的插件。遍历这些插件,将新客户信息发送给这些插件里指定的接口。这样应用 2 的接受新客户数据的接口就会被调用了。
  5. 应用 3、4、5 都可以以同样的方式注册插件或解除注册,而无需应用 1 进行代码层面的修改。