精华内容
下载资源
问答
  • 最近几篇文章,我会带大家一起设计一个流程编排框架,从项目的分析、设计、实现、重构、测试方面去了解整个编排框架,也会用到一些设计开发原则及设计模式,话不多说,我们先来看下编排框架的一个背景...

    最近几篇文章,我会带大家一起设计一个流程编排框架,从项目的分析、设计、实现、重构、测试方面去了解整个编排框架,也会用到一些设计开发原则及设计模式,话不多说,我们先来看下编排框架的一个背景。

    背景

    对于交易这样复杂的业务场景,随着时间增加、功能逐渐增多,代码越来越多,所以系统就会考虑使用微服务框架;但是使用微服务框架之后,原有的业务并没有发生变化,与传统架构相比,微服务架构下会更依赖通过各微服务之间的协调来实现业务流程,这种协作就是流程编排。编排设计到方法节点、服务调用、条件选择、串行、并行、子流程等;当然在这个过程中也需要考虑通讯层、分布式事务;需要有一个完善的编排框架来支撑。

    一般常见2种编排方式

    第一种:面向可执行的流程,通过一个可执行的流程来协同内部及外部的服务交互,通过流程来控制总体的目标、涉及的操作、服务调用顺序。首先要有一个流程控制服务,该服务接收请求,依照业务逻辑规则,依次调用各个微服务,并最终完成处理逻辑。流程控制服务时时刻刻都知道每一笔业务究竟进行到了什么地步,监控业务成了相对简单的事情。

    第二种:API网关,API网关可以看作一种简单的接口聚合/拆分的方式:每笔业务到来后先到达网关,网关调用各微服务,并最终聚合/拆分需反馈的结果。如果有开放接口文档还可以用编排定制产品,直接达到商用的效果。

    项目背景

    我们常规的项目是怎么做这种编排的呢?我们列举一个例子,A->B->C:这种场景是比较简单,对于开发人员来说就是新建一个类先执行A逻辑同步等待执行,在执行B逻辑同步等待结果在执行C;然后对所有结果进行处理返回;但是这个逻辑不可能是不变的,可能第二天又说在B->C加一个D逻辑,有需要在之前的业务代码里面做业务流程新增逻辑,而且需要负责的测试;当然后面可能还有更多的需求提供来,比如其它逻辑要应用这个编排,或者在执行B时需要加条件执行C和D,对于开发人员来说是迟早奔溃的事情。

    在这个例子中我们可以看到几个问题:

    • 流程扩展性不强,需要对流程做变更的时候需要在原有逻辑修改代码,对于流程的风险也是比较大的;

    • 流程可读性不行,简单流程逻辑我们还可以理解,但是节点多了之后,就是产生各种逻辑、各种设计模式,不管对于老员工或者新员工来说,都是一笔不小的负担;

    • 代码冗余,在项目里面有过多的我是看到的只是一堆代码类似,但是功能实现不一样的逻辑;某一段逻辑出现问题,需要改涉及到的所有流程,还有可能改漏的风险性;

    • 缺少开发规范,一万个人就有一万个哈姆雷特,只要能实现功能,只要能完成任务就行,根本考虑不到谁来接手的问题;

    • 缺少监控手段,不知道这个流程定义了几个节点,每个节点耗时,是那个节点出现的问题,对于运维来说也是大问题;

    针对上面的这些问题,我们有什么建议呢?我先来说说的我的;

    我们可以把被调用的服务或者是简单封装成一个个的基础组件,规范输入输出,把调用条件封装成一个个要素;通过文件或者是外部接口做服务编排;比如我定义一个test.flow.yml文件对我的基础组件就行编排,完全不用再代码里面去做业务逻辑实现。

    我们希望我们开发出来的东西有一定的影响能力,即使做不到在行业里面有影响力,起码也要做到在公司范围内有影响力。所以,从一开始,我们就不想把这个编排框架,做成只有我们项目可以,而是一个通用框架,可以集成到各个系统,甚至集成到微服务治理平台中。实际上,这也体现了业务开发中要具备的抽象意识、框架意识。我们要善于识别出通用的功能模块,将它抽象成通用的框架、组件、类库等。

    需求分析

    刚刚我们花了一些篇幅项目背景和背景需求,接下来,我们再对需求进行更加详细的分析和整理。

    功能性需求

    首先我们需要定义编排规则,但是没有可视化操作的界面的前提下,我们会把编排定义在yml、properties、xml中,我们先看一个demo示例:

    name: openAccount
    id: test
    desc: 条件执行
    input: com.service.flow.sample.common.model.TestInput
    output: com.service.flow.sample.common.model.TestOutput
    temp: com.service.flow.sample.common.model.TestTemp
    startNode: node1
    nodes:
      - node:
          id: node1
          name: methodInvoke
          component: com.service.flow.sample.common.component.TestComponent:test1
          desc: 单节点执行
          input: com.service.flow.sample.common.model.TestInput
          type: method
          next: node2
      - node:
          id: node2
          name: beanInvoke
          component: testComponent:test2
          desc: 单节点执行
          input: com.service.flow.sample.common.model.TestInput
          type: bean
          next: node3
      - node:
          id: node3
          name: conditionByAge
          component: temp.getAge>20:node4,temp.getAge<20:node5
          desc: 单节点执行
          input: com.service.flow.sample.common.model.TestInput
          type: condition
      - node:
          id: node4
          name: beanInvoke
          component: testComponent:test2
          desc: 单节点执行
          input: com.service.flow.sample.common.model.TestInput
          type: bean
      - node:
          id: node5
          name: beanInvoke
          component: testComponent:test2
          desc: 单节点执行
          input: com.service.flow.sample.common.model.TestInput
          type: bean
    • 我们需要定义一些元素请求参数、输出参数、执行ID、流程描述、临时变量、节点类型,执行条件;

    • 我们需要提供多种编排注册方式yml、json、xml、properties、text、接口;

    • 我们采用链表的形式执行所有的节点,减少内存开销;

    • 需要支持多种类型节点,方法节点、服务节点、条件节点、Bean节点、子流程节点等;

    • 我们需要对流程上下文做扩展;

    • 我们框架需要基于Spring做基层框架,并提供对应的starter,做可集成框架;

    非功能性需求

    易用性方面,我们希望提供流程提示,有能力的情况下提供可视化编排,我们将以Spring框架作为基础框架,我们还希望编排框架能否非常方便地集成到使用 Spring 框架的项目中。

    扩展性、灵活性方面,我们希望能够自己定义各种组件和元素模型,我们希望编排初始化的时候提供各种扩展接口,将不同类型的文本,转换成编排模型;

    性能方面:我们希望模型在项目启动的时候就初始化好,只初始化一次;节点执行的时候采用递归链表的形式,减少不必要的代码循环;

    容错性方面,不能因为编排框架而影响的本身的业务逻辑,即使不用这个框架也不至于框架大乱。

    功能需求其实没有多少,但将非功能性需求考虑进去之后,明显就复杂了很多。还是那句老话,写出能用的代码很简单,写出好用的代码很难。对于编排框架来说,非功能性需求是设计与实现的难点。怎么做到易用、灵活、可扩展、低延迟、高容错,才是开发的重点。

    展开全文
  • 上几篇文章主要讲了《实战项目:设计实现一个流程编排框架(分析)》《实战项目:设计实现一个流程编排框架(设计》《实战项目:设计实现一个流程编排框架(实现)》,我们今天主要讲一下基于分析、设...

    上几篇文章主要讲了《实战项目:设计实现一个流程编排框架(分析)》《实战项目:设计实现一个流程编排框架(设计》《实战项目:设计实现一个流程编排框架(实现)》,我们今天主要讲一下基于分析、设计、实现的框架怎么满足一些基本场景。

    方法节点

    流程

    流程执行三个方法节点,每个节点做+1操作,初始化count=0,最后输出结果count=3;

    文件定义

    name: addCount
    id: test1
    desc: 方法节点执行
    input: com.service.flow.sample.common.test1.Test1Input
    output: com.service.flow.sample.common.test1.Test1Output
    temp: com.service.flow.sample.common.test1.Test1Temp
    startNode: node1
    nodes:
      - node:
          id: node1
          name: methodNode1
          component: com.service.flow.sample.common.test1.Test1Component:count
          desc: 数量+1
          input: com.service.flow.sample.common.test1.Test1Input
          type: method
          next: node2
      - node:
          id: node2
          name: methodNode2
          component: com.service.flow.sample.common.test1.Test1Component:count
          desc: 数量+1
          input: com.service.flow.sample.common.test1.Test1Input
          type: method
          next: node3
      - node:
          id: node3
          name: methodNode3
          component: com.service.flow.sample.common.test1.Test1Component:count
          desc: 数量+1
          input: com.service.flow.sample.common.test1.Test1Input
          type: method
    
    

    执行结果

    2020-06-25 12:45:02.974  INFO 13808 --- [           main] com.service.flow.web.api.FlowHandler     : result:Test1Input{count=3}
    2020-06-25 12:45:02.976  INFO 13808 --- [           main] com.service.flow.web.api.FlowHandler     : record:Flow:test1->Node:methodNode1->Node:methodNode2->Node:methodNode3
    2020-06-25 12:45:02.976  INFO 13808 --- [           main] com.service.flow.web.api.FlowHandler     : totalTime:16ms

    Bean节点

    流程

    流程执行三个bean节点,每个节点做+1操作,初始化count=0,最后输出结果count=3;

    文件定义

    name: addCount
    id: test2
    desc: bean节点执行
    input: com.service.flow.sample.common.test2.Test2Input
    output: com.service.flow.sample.common.test2.Test2Output
    temp: com.service.flow.sample.common.test2.Test2Temp
    startNode: node1
    nodes:
      - node:
          id: node1
          name: beanNode1
          component: test2Component:count
          desc: 数量+1
          input: com.service.flow.sample.common.test2.Test2Input
          type: bean
          next: node2
      - node:
          id: node2
          name: beanNode2
          component: test2Component:count:count
          desc: 数量+1
          input: com.service.flow.sample.common.test2.Test2Input
          type: bean
          next: node3
      - node:
          id: node3
          name: beanNode3
          component: test2Component:count
          desc: 数量+1
          input: com.service.flow.sample.common.test2.Test2Input
          type: bean
    
    

    执行结果

    2020-06-25 12:45:32.976  INFO 11796 --- [           main] com.service.flow.web.api.FlowHandler     : result:Test1Input{count=3}
    2020-06-25 12:45:32.977  INFO 11796 --- [           main] com.service.flow.web.api.FlowHandler     : record:Flow:test2->Node:beanNode1->Node:beanNode2->Node:beanNode3
    2020-06-25 12:45:32.977  INFO 11796 --- [           main] com.service.flow.web.api.FlowHandler     : totalTime:14ms

    条件节点(循环节点)

    流程

    流程开始执行条件节点,初始化count=0;beanNode2每次做+1操作,当count>=5时,执行节点beanNode3,做+5操作,结果count=10;

    文件定义

    name: loop
    id: test3
    desc: 循环点执行
    input: com.service.flow.sample.common.test3.Test3Input
    output: com.service.flow.sample.common.test3.Test3Output
    temp: com.service.flow.sample.common.test3.Test3Temp
    startNode: node1
    nodes:
      - node:
          id: node1
          name: conditionNode1
          component: count<5:node2,count>=5:node3
          desc: 数量条件判断
          type: condition
      - node:
          id: node2
          name: methodNode2
          component: test3Component:count
          desc: 数量+1
          input: com.service.flow.sample.common.test3.Test3Input
          type: bean
          next: node1
      - node:
          id: node3
          name: methodNode3
          component: test3Component:count5
          desc: 数量+5
          input: com.service.flow.sample.common.test3.Test3Input
          type: bean
    
    

    执行结果

    2020-06-25 12:46:35.852  INFO 19920 --- [           main] com.service.flow.web.api.FlowHandler     : result:Test1Input{count=10}
    2020-06-25 12:46:35.854  INFO 19920 --- [           main] com.service.flow.web.api.FlowHandler     : record:Flow:test3->Node:conditionNode1->Node:methodNode2->Node:conditionNode1->Node:methodNode2->Node:conditionNode1->Node:methodNode2->Node:conditionNode1->Node:methodNode2->Node:conditionNode1->Node:methodNode2->Node:conditionNode1->Node:methodNode3
    2020-06-25 12:46:35.854  INFO 19920 --- [           main] com.service.flow.web.api.FlowHandler     : totalTime:63ms

    服务节点

    流程

    现在服务结果没有具体实现,空跑交易,需要交易框架自己扩展;

    文件定义

    name: service
    id: test4
    desc: 服务节点执行
    input: com.service.flow.sample.common.test3.Test3Input
    output: com.service.flow.sample.common.test3.Test3Output
    temp: com.service.flow.sample.common.test3.Test3Temp
    startNode: node1
    nodes:
      - node:
          id: node1
          name: serviceNode1
          component: /test:post:testApplication
          desc: 方法节点调用
          input: com.service.flow.sample.common.test3.Test3Input
          type: service
    
    

    执行结果

    2020-06-25 12:47:41.366  INFO 16272 --- [           main] com.service.flow.web.api.FlowHandler     : result:com.service.flow.model.BaseOutput@660591fb
    2020-06-25 12:47:41.366  INFO 16272 --- [           main] com.service.flow.web.api.FlowHandler     : record:Flow:test4->Node:serviceNode1
    2020-06-25 12:47:41.366  INFO 16272 --- [           main] com.service.flow.web.api.FlowHandler     : totalTime:14ms

    子流程节点

    流程

    定一个一个子节点调用第一个流程,最终结果count=3

    文件定义

    name: subflow
    id: test5
    desc: 子流程节点执行
    input: com.service.flow.sample.common.test3.Test3Input
    output: com.service.flow.sample.common.test3.Test3Output
    temp: com.service.flow.sample.common.test3.Test3Temp
    startNode: node1
    nodes:
      - node:
          id: node1
          name: subFlowNode1
          component: test3
          desc: 子流程节点
          input: com.service.flow.sample.common.test3.Test3Input
          type: subflow
    
    
    

    执行结果

    2020-06-25 12:54:36.163  INFO 17456 --- [           main] com.service.flow.web.api.FlowHandler     : result:Test1Input{count=3}
    2020-06-25 12:54:36.165  INFO 17456 --- [           main] com.service.flow.web.api.FlowHandler     : record:Flow:test1->Node:methodNode1->Node:methodNode2->Node:methodNode3
    2020-06-25 12:54:36.165  INFO 17456 --- [           main] com.service.flow.web.api.FlowHandler     : totalTime:7ms
    2020-06-25 12:54:36.165  INFO 17456 --- [           main] com.service.flow.web.api.FlowHandler     : result:Test1Input{count=3}
    2020-06-25 12:54:36.165  INFO 17456 --- [           main] com.service.flow.web.api.FlowHandler     : record:Flow:test5->Node:subFlowNode1
    2020-06-25 12:54:36.165  INFO 17456 --- [           main] com.service.flow.web.api.FlowHandler     : totalTime:20ms
    
    展开全文
  • 上几篇文章主要讲了《实战项目:设计实现一个流程编排框架(分析)》《实战项目:设计实现一个流程编排框架(设计》《实战项目:设计实现一个流程编排框架(实现)》,今天主要做一个快速入门手册。代...

    上几篇文章主要讲了《实战项目:设计实现一个流程编排框架(分析)》《实战项目:设计实现一个流程编排框架(设计》《实战项目:设计实现一个流程编排框架(实现)》,今天主要做一个快速入门手册。

    代码地址:https://github.com/itrickzhang/service-flow

    Service-flow

    微服务流程编排框架,支持方法节点、bean节点、条件节点(循环节点)、服务节点、子流程节点。

    快速入门

    依赖

    版本按实际情况给定

    <dependency>
        <groupId>com.service.flow</groupId>
        <artifactId>service-flow-spring-boot-starter</artifactId>
     </dependency>

    定义输出参数DTO

    需要继承BaseInput

    public class TestInput extends BaseInput

    定义输出参数DTO

    需要继承BaseOutPut

    public class TestOutput extends BaseOutput

    定义流程临时变量

    需要继承BaseTemp

    public class TestTemp extends BaseTemp

    定义组件

    @Component("testComponent")
    public class TestComponent {
    
         public TestOutput test1(TestInput test){
             TestOutput testOutput = new TestOutput();
             BeanUtils.copyProperties(test,testOutput);
             System.out.println("1111111111"+testOutput);
             return testOutput;
         }
    ......
    
    }

    流程定义

    新增流程文件

    在resources/flow下新建test.flow.yml

    name: openAccount
    id: test
    desc: 条件执行
    input: com.service.flow.sample.common.model.TestInput
    output: com.service.flow.sample.common.model.TestOutput
    temp: com.service.flow.sample.common.model.TestTemp
    startNode: node1
    nodes:
      - node:
          id: node1
          name: methodInvoke
          component: com.service.flow.sample.common.component.TestComponent:test1
          desc: 单节点执行
          input: com.service.flow.sample.common.model.TestInput
          type: method
          next: node2
      - node:
          id: node2
          name: beanInvoke
          component: testComponent:test2
          desc: 单节点执行
          input: com.service.flow.sample.common.model.TestInput
          type: bean
          next: node3
      - node:
          id: node3
          name: conditionByAge
          component: age>20:node4,age<20:node5
          desc: 条件节点执行
          type: condition
      - node:
          id: node4
          name: beanInvoke
          component: testComponent:test4
          desc: bean节点执行
          input: com.service.flow.sample.common.model.TestInput
          type: bean
      - node:
          id: node5
          name: beanInvoke
          component: testComponent:test5
          desc: bean节点执行
          input: com.service.flow.sample.common.model.TestInput
          type: bean
          next: node6
      - node:
          id: node6
          name: serviceInvoke
          component: /test:post:testApplication
          desc: 服务节点
          input: com.service.flow.sample.common.model.TestInput
          type: service
          next: node7
      - node:
          id: node7
          name: subFlow
          component: test2
          desc: 子流程节点
          input: com.service.flow.sample.common.model.TestInput
          type: subflow

    执行结果

    2020-06-22 22:43:30.607  INFO 7276 --- [           main] com.service.flow.web.api.FlowHandler     : result:Test{name='zhangsan', age=18}
    2020-06-22 22:43:30.607  INFO 7276 --- [           main] com.service.flow.web.api.FlowHandler     : record:Flow:test2->Node:node1
    2020-06-22 22:43:30.607  INFO 7276 --- [           main] com.service.flow.web.api.FlowHandler     : totalTime:0ms
    2020-06-22 22:43:30.607  INFO 7276 --- [           main] com.service.flow.web.api.FlowHandler     : result:Test{name='zhangsan', age=18}
    2020-06-22 22:43:30.607  INFO 7276 --- [           main] com.service.flow.web.api.FlowHandler     : record:Flow:test->Node:node1->Node:node2->Node:node3->Node:node5->Node:node6->Node:node7
    2020-06-22 22:43:30.607  INFO 7276 --- [           main] com.service.flow.web.api.FlowHandler     : totalTime:52ms
    
    展开全文
  • 上一篇文章我们讲了《实战项目:设计实现一个流程编排框架(分析)》主要对流程编排框架产生的背景,并做了需求分析,这其中包含功能性需求和非功能性需求,算是在正式开始设计之前做一个铺垫。前面提...

    上一篇文章我们讲了《实战项目:设计实现一个流程编排框架(分析)》主要对流程编排框架产生的背景,并做了需求分析,这其中包含功能性需求和非功能性需求,算是在正式开始设计之前做一个铺垫。

    前面提到,项目实战分为分析、设计、实现、测试几个部分讲解,其中分析环节跟面向对象分析很相似,都是做需求梳理。但是在时间项目中设计和实现就不是这么一回事了这里的“设计”指的是系统设计,主要是划分模块,对模块进行设计。

    我们主要分为模型定义、流程加载、流程解析、集成使用这四个模块,来说明编排框架的设计思路,今天讲解的重点是,如何通过合理的设计,实现一个易用,易扩展,灵活,延迟低,高容错等非功能需求的编排框架。

    模型定义

    框架需要定义出服务模型,包括请求参数、输出参数、临时变量,流程定义,节点定义,这几个元素。

    • 请求参数:流程需要定义一个输入参数的基类,在开发的过程中请求参数DTO需要继承这个DTO;

    • 输出参数:流程需要定义一个输出参数的基类,在开发的过程中响应参数DTO需要继承这个DTO;

    • 临时变量:用于在流程执行过程中做上下文管理,包括EL表达式解析变量和流程之间参数扭转;

    • 流程定义:需要定义流程标识ID用于标识流程,流程名称用于定义流程别名,请求参数用于定义流程统一输入DTO,输出参数用于定义流程统一响应DTO,临时变量用于上下文管理,流程描述用于描述整个流程的作用,流程节点用于所有节点以Map的形式保存;

    • 节点定义:需要定义节点ID用于标识节点,节点名称用于定义节点别名,请求参数用于定义流程统一输入DTO,输出参数用于定义流程统一响应DTO,节点描述用于描述整个流程的作用,节点类型用于不同的节点类型包括方法节点、bean节点、服务节点、条件节点等,下一个节点标识用过递归的形式执行节点,组件内容,具体指向执行的节点。

    这几个模型直接的关系是怎么样的?整个流程模型是一个包含关系,流程定义 = 请求参数+输出参数+临时变量+节点定义+自定义属性;节点定义 = 请求参数+输出参数+自定义属性;我们在日常开发的过程中需要定义请求参数和输出参数分别集成请求参数和输出参数的基类,通过配置文件加载流程定义,也就是说运行期阶段我们只会用到流程定义模型。定义如下:

    name: openAccount
    id: test
    desc: 条件执行
    input: com.service.flow.sample.common.model.TestInput
    output: com.service.flow.sample.common.model.TestOutput
    temp: com.service.flow.sample.common.model.TestTemp
    startNode: node1
    nodes:
      - node:
          id: node1
          name: methodInvoke
          component: com.service.flow.sample.common.component.TestComponent:test1
          desc: 单节点执行
          input: com.service.flow.sample.common.model.TestInput
          type: method
          next: node2
      - node:
          id: node2
          name: beanInvoke
          component: testComponent:test2
          desc: 单节点执行
          input: com.service.flow.sample.common.model.TestInput
          type: bean
          next: node3
      - node:
          id: node3
          name: conditionByAge
          component: age>20:node4,age<20:node5
          desc: 单节点执行
          type: condition
      - node:
          id: node4
          name: beanInvoke
          component: testComponent:test4
          desc: 单节点执行
          input: com.service.flow.sample.common.model.TestInput
          type: bean
      - node:
          id: node5
          name: beanInvoke
          component: testComponent:test5
          desc: 单节点执行
          input: com.service.flow.sample.common.model.TestInput
          type: bean

    流程加载

    首先我们要确定流程的几个来源有可能是定义的yml、properties、xml、json或者接口;那我我们设计就要支持流程模式可扩展,不管通过什么方式初始化模型,只要能够转换成流程定义,不管什么方式都是可以,完全用到可扩展的需求;

    当然我们也会提供默认的流程加载方式,我们这里以yml格式举例,首先我们需要定义一个yml流程文件,示例如下,新增一个test.flow.yml文件,为了考虑文件路径自定义,也需要把扫描包做成可配置的功能,模式是classpath:flow/*.flow.yml;

    平台首先需要定义定一个流程注册接口,所用加载流程模型用于实现流程注册,在通过平台的机制把流程模型加载到流程管理器,具体实现类我们需要对定义的yml流程就行解析,当然规范要严格按照yml的格式定义;在加载的过程中要有异常处理机制,比如定义的节点和参数不存在,重复定义流程;每一个模型的异常处理完全由平台统一管控。

    考虑到编写流程文件的便利性,需要提供一种机制需要把所有的DTO和基础组件在应用初始化的过程中加载到组件模型,在定义流程文件的时候不需要定义全路径,而且通过注册的bean映射到具体的实现组件,这样的编排文件就变的更加简单了。

    流程解析

    我们把节点分为方法节点、bean节点、服务节点、条件节点、循环节点、子流程节点,我们来讲一下主要的设计;

    第一步:拿到流程ID,在定义的流程上下文获取流程模型,如果获取不到对应的流程,则抛出对应的异常;

    第二步:处理主流程,处理主流程我们需要执行过程就行计时处理,通过解析请求参数和输出参数,上下文并实例化成对象;加载所有的流程节点,并开始查到第一个定义的流程节点;

    第三步:节点解析,根据定义的type类型,我们可以知道需要那种节点解析器去做处理;

    第四步:节点处理,方法节点很简单通过反射机制调用基础组件;bean节点比方法节点多了一次bean到类的映射,也是通过反射执行组件;条件节点通过EL表达式进行匹配,可配置多个条件,既满足if else场景,也需要满足when case场景;服务节点需要我们自定义实现sdk定义一个轻量级框架,不依赖任务容器,需要在starter模块实现等;

    第五步:流程节点执行完成之后会获取下一个节点,然后通过递归的形式调用,有多少节点就递归调用多少次,直到没有下一个节点标识;

    第六步:统计执行情况,包括耗时,响应参数;

    第七步:异常处理机制,全局可自定义异常处理机制,当流程发生异常时回滚操作;

    集成使用

    我们参考Spring框架,低侵入松耦合设计思想。编排框架也应该满足这个设计思想。因为框架是需要集成到应用中使用的,我们希望框架尽可能低侵入,与业务代码松耦合,替换、删除起来也更容易些。我们基于Spring框架做集成,并提供starter依赖组件。

    展开全文
  • 上两篇文章主要讲了《[实战项目:设计实现一个流程编排框架(分析)(https://mp.weixin.qq.com/s/veLQZJqYNKbYvuCi7Pf_nA)]》《实战项目:设计...
  • 轻量级流程编排框架liteFlow

    千次阅读 2021-01-23 19:43:52
    但今天我要介绍的,是一款轻量级的流程编排框架——Liteflow。 Liteflow主要致力于逻辑驱动的编排。可以满足于大部分的生产业务场景。和以上著名的开源流程引擎相比,虽然不如他们那么全面,但是胜在轻量,高性能和...
  • Knative 是 Google 在 2018 的 Google Cloud Next 大会上发布的一款基于 Kubernetes 的 Serverless 框架。Knative 一个很重要的目标就是制定云原生、跨平台的 Serverless 编排标准。Knative 是通过整合容器构建(或者...
  • 最近在做的工作比较需要一个支持任务编排工作流的框架或者平台,这里记录下实现上的一些思路。任务编排工作流任务编排是什么意思呢,顾名思义就是可以把 "任务" 这个原子单位按照...
  • asyncTool: 解决任意的多线程并行、串行、阻塞、依赖、回调的并行框架,可以任意组合各线程的执行顺序,带全链路执行结果回调。多线程编排一站式解决方案。来自于京东主App后台。
  • 设计模式之能力编排实现框架

    千次阅读 2021-03-24 18:04:19
    唠叨两句 大家好啊,已经一年多没写...了解能力编排框架带来的能力复用和业务隔离 颠覆传统开发习惯方法固定入参带来的方法扩展局限 前言 当我们做一个新项目开始的时候,我们总会想项目成型之后希望他能够有条不紊
  • 分布式任务编排调度框架设计

    千次阅读 2018-09-18 16:53:18
    Server层自身就像一个独立的任务编排调度引擎,可以独立对外提供服务,多个server模块之间可以依赖服务中心感知彼此的存在,在某个server挂掉的时候可以快速的把其中的任务转移到其他的server模块来执行。...
  • 分布式任务编排调度框架设计 点击打开链接
  • 如果大家仔细看了上一篇文章,可以看到该框架的难点和重点,主要有两点,分别是任务的顺序编排和任务结果的回调。 如何做任务顺序编排 依次来看一下各个基本场景 1 全串行 这种是最简单的,依次串行即可。 ...
  • 需要有一个完善的编排框架来支撑。 在本场 Chat 中,会讲到如下内容: 流程编排出现的背景; 流程编排功能分析; 流程编程功能设计; 流程编排代码实现; 流程编排常用场景; 流程编排扩展功能。 当前内容版权归...
  • 原创文章,欢迎转载。转载请注明:转载自IT人故事会,谢谢! 原文链接地址:『高级篇』docker之服务编排三大平台扬帆起航(21) ...docker是不类似传统的服务,它需要一款服务编排框架。 Mesos 最早...
  • java分组编排 重要要点 Ocado Technology使用Java成功开发需要高性能的应用程序。 离散事件模拟的使用使开发团队可以长时间分析性能,而无需等待结果。 确定性软件对于高效调试至关重要。 实时系统本质上是...
  • 然而,数量与规模不断增长的用户连续提出的需求,使上层服务提供商正在利用他们的资源与基础设施获得越来越大的利益,而使电信运营商们沦落为低价值的管道提供者。 与此同时,电信运营商迫切的需要改造他们的基础...
  • 在日常的工作中通常会组合几个系统的相关功能共同完成某个业务场景,这时候通常在一般的微服务中就需要使用分布式事务来解决,或者通过本文说的编排的方式来解决,本文算是这个系列的入门篇,主要是介绍下笔者在实际...
  • 传统垂直架构改造的核心就是要对应用进行服务化,服务化改造使用到的核心技术就是分布式服务框架。分布式服务框架演进应用从集中式走向分布式大规模系统架构的设计一般原则就是尽可能地拆分,以达到更好的独立扩展与...
  • java 服务编排 在这篇文章中,我们拥有一个全面的文章微服务针对Java开发:部署和协调。 1.简介 如今,越来越多的组织依靠云计算和托管服务产品来托管其服务。 这种策略有很多好处,但是您仍然必须为您的微服务...
  • 应用编排服务 AOS

    2019-12-31 18:26:20
    应用编排服务(Application Orchestration Service,简称AOS)为企业提供应用上云的自动化能力,支持编排华为云上的主流云服务,实现在华为云上一键式的应用创建及云服务资源开通,提供高效的一键式云上应用复制和...
  • 单体系统拆分成一堆微服务,服务治理和部署运维时会遇到很多挑战和问题,服务编排就是指如何把这些服务组织到一起,解决这些问题。 可以类比积木搭城堡。积木就是你的一大堆微服务、依赖的各个组件,城堡就是指整个...
  • conductor服务编排http任务安排

    千次阅读 2018-12-12 14:50:56
    # 编排 1.定义任务:http://localhost:8080/api/metadata/taskdefs [{  "name": "user_task",  "retryCount": 3,  "timeoutSeconds": 1200,  "input...
  • 编排涉及到RPC、分布式事务等,需要有完善的编排框架来支撑。3种常见的微服务编排方式: Orchestration面向可执行的流程:通过一个可执行的流程来协同内部及外部的服务交互,通过流程来控制总体的目标、
  • netty是一个经典的网络框架,提供了基于NIO、AIO的方式来完成少量线程支持海量用户请求连接的模型。netty里面充斥了大量的非阻塞回调模式,主要是靠Future/Promise异步模型来实现的。 Future是java.util.concurrent...
  • 为什么不进行点对点编排? 基本概念 工作流定义 任务定义 系统任务 工人任务 工作流任务的生命周期 元数据定义 任务定义 重试逻辑 超时政策 工作流定义 工作流程中的任务 连接输入和输出 $ {SOURCE.input / ...
  • 这是该项目的一个重要里程碑,引入了一个集成多个存储提供程序的框架。这将使这些存储团队在将解决方案集成到云原生环境中时更容易创建可靠且用户友好的体验。为CockroachDB和Minio添加了两个新的存储提供程序,社区...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 28,394
精华内容 11,357
关键字:

服务编排框架