从服务调用和无服务器工作流入手

工作流非常适合于编排服务、功能或事件。它们提供开箱即用的特性,使您的应用程序具有弹性、可靠性和简单性。

但是目前,每个云供应商都有自己的工作流解决方案。AWS 有 Step 函数,Google 有 Google Workflow,微软有 Azure 持久功能,等等。当您需要在多个云供应商上迁移或托管应用程序时,缺乏定义工作流的通用方法就成为一个问题。它还限制了创建支持多个平台的工具和基础设施的潜力。这就是 Serverless Workflow 规范所要解决的问题。

在本文中,您将使用 Kogito 从头开始创建和运行一个 Serverless Workflow 应用程序。

什么是无服务器工作流?

Serverless Workflow 是一种开放源代码的、与供应商无关的规范,它使您能够定义声明性工作流模型,用于编排事件驱动的应用程序。该规范是由云计算本地计算基金会(CNCF)托管的一个项目。

Kogito 是什么?

Kogito 是一个开源运行时,它实现了 Serverless Workflow 规范,并使您能够在 Quarkus 之上运行工作流。除了 Serverless Workflow 规范之外,Kogito 还在云环境中提供对业务自动化的支持。

小知识

Kogito 的名字指的是“ Cogito”,在拉丁语中意为“我思故我在”名字中的“ k”表示对 Kubernetes 的敬意,这是这个工具的基础。

先决条件

  • JDK11 + 安装时配置了适当的 JAVA _ HOME
  • Apache Maven
  • Quarkus CLI

编辑您的工作流程:

  • 安装了红帽 Java 插件和红帽无服务器工作流编辑器的 VisualStudio 代码

我们要创造什么?

我们将创建一个 Serverless Workflow,它根据指定的国家和名称返回问候语。例如,如果我们将“ John”指定为名称,将“ Brazil”指定为国家,那么我们的工作流应该返回一个葡萄牙语的问候语,如“ Saudi ações do Serverless Workflow,John!”我们的工作流程将支持巴西和西班牙。如果指定了任何其他国家,则应返回英语问候语。

我们的工作流将根据指定的国家选择一种语言,并调用远程服务来根据指定的语言和名称检索问候语。

看看我们的工作流程应该是什么样子:

从服务调用和无服务器工作流入手

现在,让我们创建我们的项目

远程服务项目

这是我们的工作流将调用来检索问候语的服务。它包含一个具有单个端点的简单 Quarkus 应用程序。

由于创建 Quarkus 应用程序不是本文的重点,您可以从存储库下载该项目。

创建无服务器工作流项目

在终端窗口中运行以下命令以创建项目框架:

quarkus create app -x=kogito-quarkus-serverless-workflow,quarkus-container-image-jib,quarkus-resteasy-reactive-jackson,quarkus-smallrye-openapi com.acme:greeting-flow:1.0

Acme、 hello-flow 和1.0分别是项目的组 id、工件 id 和版本。

这个命令将在问候流目录中创建一个 MavenQuarkus 项目,其中包含所有必需的 Kogito 依赖项。

接下来,为了确保一切正常运行,尝试用以下方法编译项目:

quarkus build

如果构建成功完成,就可以创建第一个工作流了。

创建第一个工作流

在 src/main/resources 目录中创建一个名为 greeting.sw.json 的文件,其内容如下:

JSON

{br  "id": "greeting",br  "version": "1.0",br  "specVersion": "0.8",br  "name": "Greeting workflow",br  "description": "JSON based greeting workflow",br  "start": "ChooseOnCountry",br  "functions": [br    {br      "name": "getGreetingFunction",br      "operation": "international-greeting-service.yml#getGreeting"

您可以使用 Visual Studio Code 和 Red Hat Java Plugin 以及安装了 Red Hat Serverless Workflow Editor 扩展的 Visual Studio Code 来编辑和拥有工作流的图形表示,就像我们在前一节中看到的那样。

Note

In our workflow, we used several expressions, like "condition": "${ .country == \"United States\" }" and "output": "${ {greeting: .greeting} }". To know more about that, check out this article about Serverless Workflow Expressions.

在调用远程服务时,我们需要创建一个定义该服务的 OpenAPI 文档。注意,我们在工作流中为远程服务声明了一个函数。

JSON

{
  "id": "greeting",
  "version": "1.0",
  "specVersion": "0.8",
  "name": "Greeting workflow",
  "description": "JSON based greeting workflow",
  "start": "ChooseOnCountry",
  "functions": [
    {
      "name": "getGreetingFunction",
      "operation": "international-greeting-service.yml#getGreeting"
    }
  ],
  "states": [
    {
      "name": "ChooseOnCountry",
      "type": "switch",
      "dataConditions": [
        {
          "condition": "${ .country == \"United States\" }",
          "transition": "GreetInEnglish"
        },
        {
          "condition": "${ .country == \"Spain\" }",
          "transition": "GreetInSpanish"
        },
        {
          "condition": "${ .country == \"Brazil\" }",
          "transition": "GreetInPortuguese"
        }
      ],
      "defaultCondition": {
        "transition": "GreetInEnglish"
      }
    },
    {
      "name": "GreetInEnglish",
      "type": "inject",
      "data": {
        "language": "English"
      },
      "transition": "GetGreeting"
    },
    {
      "name": "GreetInSpanish",
      "type": "inject",
      "data": {
        "language": "Spanish"
      },
      "transition": "GetGreeting"
    },
    {
      "name": "GreetInPortuguese",
      "type": "inject",
      "data": {
        "language": "Portuguese"
      },
      "transition": "GetGreeting"
    },
    {
      "name": "GetGreeting",
      "type": "operation",
      "actions": [
        {
          "name": "getGreeting",
          "functionRef": {
            "refName": "getGreetingFunction",
            "arguments": {
                  "name": "${ .name }",
                  "language": "${ .language }"
              }
          }
        }
      ],
      "stateDataFilter": {
        "output": "${ {greeting: .greeting} }"
      },
      "end": true
    }
  ]
}

在该函数中,我们定义了要调用的操作。Operation 属性是对 OpenAPI 文档的引用,该文档定义了服务(international-hello-service)。Yml)和 operation Id (getGreting)。因此,创建一个名为 international-hello-service 的文件。在 src/main/resources 目录中的 yml,其内容如下:

YAML

br---bropenapi: 3.0.3brinfo:br  title: international-greeting-service APIbr  version: 1.0.0-SNAPSHOTbrservers:br  - url: http://localhost:8081/brpaths:br  /getGreeting:br    post:br      tags:

此时,您的 Serverless Workflow 应用程序已准备好启动和接收请求。

向您的服务发送请求

如果还没有启动远程服务,那么现在就需要启动。在国际问候服务目录的单独终端窗口中运行以下命令:

quarkus dev

您应该看到一个输出,其中包含如下消息:

INFO  [io.quarkus] (Quarkus Main Thread) international-greeting-service 1.0 on JVM (powered by Quarkus 2.9.0.Final) started in 1.552s. Listening on: http://localhost:8081

这意味着您的远程服务应用程序已准备好接收 http://localhost:8081请求。

您可以使用以下命令尝试:

curl -X POST -H 'Content-Type:application/json' -H 'Accept:application/json' -d '{"name": "Javier", "language": "Spanish"}' http://localhost:8081/getGreeting

如果您看到如下输出,那么您的远程服务正在正确地返回问候语。

{"greeting":"Saludos desde Serverless Workflow, Javier!"}

但是这只是我们的工作流程将要调用的远程服务。

在单独的终端窗口中,在 hello-flow 目录下,运行:

quarkus dev

如果你访问 http://localhost:8080/q/Swagger-UI/ ,你会在 Swagger UI 中看到问候资源端点。这些是您的问候工作流提供的端点。

从服务调用和无服务器工作流入手

您可以使用 SwaggerUI 与端点交互,或者使用 curl 命令调用端点,比如:

curl -X POST -H 'Content-Type:application/json' -H 'Accept:application/json' -d '{"workflowdata" : {"name": "Helber", "language": "Portuguese"}}' http://localhost:8080/greeting

上面的命令应该返回如下输出:

{"id":"2a96e492-ad61-4205-b112-c73606809c7e","workflowdata":{"greeting":"Saudações do Serverless Workflow, Helber!"}}

注意


您是否注意到,我们从工作流发送和接收的数据是一个名为 workflow data 的对象?这是 Kogito 特有的,而不是 Serverless Workflow 规范。


就是这样! 现在您已经在 Kogito 运行时中运行了一个 Serverless Workflow 应用程序。

Next Steps下一步

在本文中,我们创建了一个应用程序,通过使用 Serverless Workflow 规范来编排服务调用。

您可以从这里下载本文中使用的源代码。它还包含一个 docker-compose 文件和一个启动脚本,因此您可以在一个命令中启动所有内容。

注意

要运行启动脚本和 Docker-compose 文件,您需要在计算机上安装 Docker。


要进一步了解 Serverless Workflow,您现在可以浏览以下资源:


  • 无服务器工作流规范
  • Kogito 文件
  • Kogito 无服务器工作流示例



发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章