跳至内容

使用 Knative 和 Kogito 编排事件

发布日期:2020-12-16,修订日期:2024-01-17

使用 Knative 和 Kogito 编排事件

作者:Ricardo Zanini,Red Hat 首席软件工程师,以及 Tihomir Surdilovic,Red Hat 软件开发工程师

Kogito 是一个用于开发云原生业务自动化应用程序的平台。它旨在针对云原生架构,并提供一系列功能,使架构师和开发人员能够轻松创建业务应用程序。

Kogito 实现 CNCF 无服务器工作流项目,该项目是用于定义编排事件驱动、无服务器应用程序的工作流模型的规范。它专注于定义一个供应商中立、平台独立且声明式的工作流模型,用于编排可跨多个云和容器平台使用的服务。迄今为止,无服务器工作流规范是 CNCF 沙盒项目。

作为无服务器工作流实现的一部分,Kogito 提供了一个 Kubernetes 运算符来使用 Knative 部署这些工作流。目标是使在云环境中部署和管理用户定义的工作流尽可能简单。Knative Eventing 在这种情况下发挥着非常重要的作用,因为它提供了事件驱动架构的基础设施。

Kogito 无服务器工作流

为了演示 Kogito 工作流实现如何在 Knative 的事件驱动架构上工作,我们将使用 患者入职示例。在此示例中,我们模拟了医院中用于入职新患者并将其分配给正确医生的工作流。

以下图像取自 规范示例页面,说明了此工作流

患者入职工作流表示 患者入职工作流表示

在收到包含患者信息的 CloudEvent 对象后,工作流开始。然后规范按顺序调用三个函数:(1)存储患者信息,(2)根据患者的症状将其分配给医生,以及(3)为该患者安排与分配医生的预约。

以下是基于此规范的患者入职工作流 YAML 示例

id: onboarding
version: '1.0'
name: Patient Onboarding Workflow
states:
- name: Onboard
  type: event
  start:
    kind: default
  onEvents:
  - eventRefs:
    - NewPatientEvent
    actionMode: sequential
    actions:
    - functionRef:
        refName: StoreNewPatient
    - functionRef:
        refName: AssignPatientToDoctor
    - functionRef:
        refName: SchedulePatientAppointment
  end:
    kind: default
events:
- name: NewPatientEvent
  type: new.patient.events
  source: "/hospital/entry"
functions:
- name: StoreNewPatient
  operation: classpath:openapi.json#storeNewPatient
- name: AssignPatientToDoctor
  resource: classpath:openapi.json#assignPatientToDoctor
- name: SchedulePatientAppointment
  resource: classpath:openapi.json#schedulePatientAppointment

以上工作流定义基于三个部分。第一部分是 states 数组,其中包含工作流控制流逻辑。在这种情况下,是一个 event,它接收新的患者云事件,并执行前面提到的三个函数。

工作流的第二部分是 events 数组,其中包含基于 CloudEvent 规范的事件定义。工作流中事件的定义方式与其使用 CloudEvent 格式表示的方式之间存在 1:1 映射关系。

第三部分,functions 数组,包含函数定义,这些定义向运行时提供有关如何执行所需服务的更多信息。

无服务器工作流规范基于标准,并利用 OpenAPI 规范来定义有关服务 REST 执行的详细信息。在此 gist 中,您可以看到以上示例中函数引用的 OpenAPI 文件。

您可以参考 无服务器工作流规范,以获取有关规范提供的所有语言结构的信息。

请注意,规范允许使用 JSON 和 YAML 工作流格式。此示例使用 YAML,但是 JSON 被认为是等效的,并且也可由运行时解析。

在编译期间,Kogito 运行时将解析此 YAML 文件,并生成表示此工作流定义的 Java 代码。生成的代码基于 Quarkus 框架。结果是一个可以在架构中的任何位置部署的 OpenAPI 标准 REST 服务。

Kogito 运行时工作流解析过程 Kogito 运行时解析流程

在此示例中,我们还向项目中添加了 Knative Kogito Eventing 插件,这意味着它可以通过 HTTP 在根路径上接受 CloudEvent 对象。例如

$ curl -X POST \
      -H "content-type: application/json"  \
      -H "ce-specversion: 1.0"  \
      -H "ce-source: /hospital/entry"  \
      -H "ce-type: new.patients.events"  \
      -H "ce-id: 12346"  \
      -d "{ \"name\": \"Mick\", \"dateOfBirth\": \"1983-08-15\", \"symptoms\":[\"seizures\"]}" \
https://#:8080

将此请求发送到服务时,将启动工作流的新实例,并执行规范中定义的所有操作。

此示例中包含更多内容。有关如何部署和构建它的完整说明,请参阅 Github 存储库上的示例页面。

Knative Eventing 集成

基于此生成的服务,您可以构建 镜像,以便使用 Kogito 运算符 在安装了 Knative Eventing 的 Kubernetes 集群上部署。运算符将创建所有必要的 Knative 资源来配置此服务并将其订阅到 Knative 代理

Knative 和 Kogito 集成 Knative Eventing 和 Kogito 运算符集成

Kogito 运算符创建了一个 Knative 触发器 资源,该资源将服务和代理链接在一起。在此示例中,它将过滤类型为 new.patients.events 的事件。这意味着每次此类型的事件进入代理时,它都会被重定向到 Kogito 服务。

相同的概念也适用于 工作流引擎生成的事件。在这种情况下,运算符将创建一个 Knative SinkBinding 资源,并将其绑定到 Knative 代理。每次服务生成事件时,表示它的 CloudEvent 都会发送到代理。下图说明了 Kogito 服务通过 SinkBinding 向 Knative 代理发出事件的实现细节。

Knative 和 Kogito 集成 Knative Eventing 和 Kogito 服务事件生产者

结论

无服务器工作流规范可以帮助我们定义可在许多平台和云提供商之间使用的复杂工作流。在这篇文章中,我们分享了如何在 Kogito 中使用此规范以及与 Knative 作为无服务器平台集成的可能性。

虽然规范实现是 Kogito 项目正在进行的工作,但我们的目标是拥有一个完全符合标准和规范的平台。

您可以在本地环境中尝试本文中演示的示例。如果您正在寻找更复杂的场景,请查看我们使用 Kogito 和 Knative Eventing 的Github 机器人示例

进一步阅读

要了解更多关于 Serverless Workflow 规范的信息,我们建议您阅读 Github 仓库中的规范文档,并加入社区!

要了解有关 Knative Eventing 以及该平台如何帮助您在 Kubernetes 上创建事件驱动架构的更多信息,请查看官方文档

关于作者

Ricardo Zanini 是一位软件工程师,目前正在 Kogito 社区项目中工作。他自 2000 年起就一直从事软件工程领域的工作。他是 CNCF Serverless Workflow 规范的维护者之一。

Tihomir Surdilovic 是 Red Hat 的软件开发人员,从事业务自动化工作。他自 2008 年起就参与业务自动化和开源项目。他也是 CNCF Serverless Workflow 规范的积极负责人之一。

我们使用分析和 Cookie 来了解网站流量。出于此目的,您的网站使用信息将与 Google 共享。了解更多。