其他
低代码、中台化:爱奇艺号微服务工作流实践
背景
单个服务逻辑简单,职责清晰,但从整体上来讲,业务的复杂度是没有消失的,那业务的复杂度去哪里了?没错!就是服务间的直接或间接调用。业务逻辑如果很复杂,服务之间调用链路将变得很长,梳理服务之间的调用关系就成了很复杂的事情,代码同样会变得难以维护,新同学的业务学习成本依旧很高。 微服务带来了额外的复杂度,服务发现,一致性,分布式事务等问题在单体应用的时代是不存在的。即便随着微服务的发展,这些功能封装的那么完整,服务中也会出现大量的模板引用,模板代码,增加了开发的成本,为了解决这个问题,服务网格出现了,服务网格将大量公用的复杂度封装在边车中,使开发人员专注于编写业务代码。那么在现有的解决方案中能否更近一步,使开发人员尽量的少些代码呢?
Knative简介
Build 负责项目的CICD,已迁移到Tekton中,在此不做过多介绍 Serving 负责severless应用和方法的部署 Eventing 负责事件的发布订阅以及基于发布订阅产生的衍生产品
Service,Service是应用的抽象,负责整个应用的生命周期以及其他模块的创建管理,例如Route,Configuration等 Route,Route负责流量的管理,可以控制流量到Revision的路由规则 Configuration,Configuration维护了应用的最新状态。代码和配置之间充分解耦,每次修改配置,都会创建一个新的Revision Revision,Revision是每次代码和配置进行修改的快照,是不可变的。 Serving组件间关系图如下:
Event Consumer,事件消费者,事件消费者通常实现了Addressable或者Callable接口,以接受消费事件,并将结果返回 Event Source,事件源,顾名思义事件的生产方,现有的事件源包括K8S Apiserver,Github,Kafka,Websocket等等,非常丰富 CloudEvent,事件数据的规范,Knative采用此标准进行事件的传输 Broker 事件代理,可以接受一系列事件,并将事件转发给符合Trigger过滤条件的订阅者,从而实现事件Filter功能 Trigger 过滤器,定义的事件的过滤规则和订阅者,配合Broker使用 Event Registry EventType的集合 Event Channel 事件持久层 Event Subscription 事件订阅,通常是时间消费者订阅事件
Sequence,提供了一种顺序执行的工作流资源 Parallel,提供了方法分支列表的工作流资源
应用实践
Knative Eventing并没有提供UI能力,开发人员需要手动编写Yaml文件才能完成工作流的定义,开发不够便捷 Yaml的编写复杂,需要涉及到broker,Trigger,Parallel,Sequence等组件,学习成本较高 Sequence,Parallel工作流组件逻辑较为简单,并不能完成相对复杂的业务逻辑 缺少业务服务,工作流统一部署方案,部署成本较高
Workflow-Dashbord 工作流页面前端工程,负责工作流列表展示,拖拽等功能 Workflow-Api 工作流页面对应后端,负责工作流Yaml生成,应用到K8S等功能 Workflow-Operator 监听K8S Workflow资源,解析Workflow Yaml并创建更新Knative Eventing等组件,从而编排工作流 Workflow-Syncer 监听K8S Workflow资源,更新Workflow状态
总结与展望
支持更为复杂的工作流节点。Knative Eventing提供的Sequence,Parallel显然还是太简单,要支持复杂的业务逻辑必须要丰富工作流选择控制节点,例如选择,循环等。 工作流监控。当前的工作流监控只针对业务服务,并没有从工作流的角度出发进行监控管理。我们需要对工作流的每次执行进行详细记录,每个节点执行情况,每次执行的结果都要做到可查可追踪。 支持多语言。当前的Workflow业务服务受限于KO的打包部署方式,只支持go语言。后续需要支持java,python等多语言打包部署。 支持同步调用。当前Workflow是异步模型,同步的场景如果需要提供接口服务是不支持的。同步场景在平时开发中也是很常见,后续需要Workflow需要支持同步模型。