谈服务编排可视化设计(6.25)

在5.22的时候自己增加谈过服务编排设计的内容。在这篇文章里面我们首先指出了服务编排是指服务和服务之间的连接,而非原来谈的ESB服务设计器中的单个服务设计。同时给出了常见的服务编排场景。

1.三个原子服务全部是查询服务,我们希望组装一个新服务,一次返回A,B,C三个服务查询结果

2.二个查询类的原子服务,最终需要返回两个数据集关联查询的结果集

3.对单个已有服务进行裁剪和丰富并形成一个新服务输出

4.对多个原子服务进行流程式的前后串接并形成服务提供

5.单一业务服务为主体服务,但是编排多个业务规则逻辑处理类服务

6.多个导入服务组装为一个导入服务合并导入并形成一个新服务

在这些场景里面可以看到,实际上服务编排最场景的就是服务串联,服务并联下的输入和输出合并,服务内容丰富和裁剪等常见场景。在一个理想的场景下,我们最希望实现的就是一个业务功能点的实现完全能够通过服务编排可视化设计方式来完成。

下面我们来分析和讨论下服务编排的可视化设计。

a. 定义一个新服务,需要提前考虑新服务输入和输出结构设计

要进行服务编排,实际上编排完成后是新产生一个新服务,那么新服务一定有输入和输出结构,那么就需要对新服务的输入和输出结构进行设计。一种方法是在服务编排的时候再对输入和输出结构进行定义,一种方法是提前对新服务的服务契约进行定义,服务契约定义好后就形成了标准的服务输入和输出结构。

对于定义的服务编排产生的新服务,拖拽到设计器后应该产生输入和输出两个独立节点,这个在我们做单服务的ESB服务设计器的时候思路是一致的。

b. 服务之间的连接,本质是服务输入和输出之间的连接和映射

要明白服务之间的连接本质是输入和输出之间的连接和映射。以 三个原子服务全部是查询服务,我们希望组装一个新服务,一次返回A,B,C三个服务查询结果 ,这个场景来举例说明。

我们需要拖拽A,B,C三个原子服务节点到设计器里面,然后将新服务的输入连线到A,B,C三个原子服务节点。在连接完成后,我们需要将新服务的输入和ABC三个服务的输入之间进行数据映射。

其次我们需要将ABC三个服务的输出连接到新服务的输出。对于新服务的输出,我们同样需要完成数据项之间的映射。但是这里的复杂性体现在ABC三个服务输出的三个结果集之间究竟是并行关系,还是父子层次关系,在进行数据映射和合并返回的时候,我们需要提前进行三个结果集的层次关系定义。这里面场景包括

1. 结果集并行结构返回多个

2. 结果集返回层一个层次结构的结果集返回

3. 对多个结果集类似Sql一样进行查询关联,返回一个结果集作为结果

以上三种则是我们场景的对服务查询结果进行处理,合并或关联的方式。

c. 对服务流程式的串联和顺序处理,重点需要解决跨多节点数据映射问题

这个前面已经讲过,即将A,B,C三个服务进行串联方式编排的时候,实际我们看到B结果的输入只能够是A节点的输出,但是服务C的输入确可以同时是A或B的输出。因此在编排完成后进行数据映射的时候,一定需要支持C节点的输入可以同时映射到A或B的输出数据项元素。

d. 对于规则计算节点的两种可能,简单规则节点和复杂规则节点

对于规则节点需要考虑两种可能性,一种是常见的简单规则节点,即进行简单的加减乘除运算得出一个规则,基于规则判断后能够走不同的分支对结果进行处理。另外一种可能即将输入送入到规则引擎进行处理,处理完成后返回一个结果,如果在不连接规则引擎的情况下,我们可以设计一个专门的WS服务节点,即该节点可以去调用外部服务并返回输出结果,并基于输出结果情况进行判断,基于判断走不同的分支。

注意这种规则WS服务节点仅仅是进行规则处理,而非整个服务编排的主体输入和输出。实际我们在进行服务编排设计的时候,最好不要将这类节点放在主体服务编排路径上面。