工作流非常适合于编排服务、功能或事件。它们提供开箱即用的特性,使您的应用程序具有弹性、可靠性和简单性。
但是目前,每个云供应商都有自己的工作流解决方案。AWS 有 Step 函数,Google 有 Google Workflow,微软有 Azure 持久功能,等等。当您需要在多个云供应商上迁移或托管应用程序时,缺乏定义工作流的通用方法就成为一个问题。它还限制了创建支持多个平台的工具和基础设施的潜力。这就是 Serverless Workflow 规范所要解决的问题。
在本文中,您将使用 Kogito 从头开始创建和运行一个 Serverless Workflow 应用程序。
Serverless Workflow 是一种开放源代码的、与供应商无关的规范,它使您能够定义声明性工作流模型,用于编排事件驱动的应用程序。该规范是由云计算本地计算基金会(CNCF)托管的一个项目。
Kogito 是一个开源运行时,它实现了 Serverless Workflow 规范,并使您能够在 Quarkus 之上运行工作流。除了 Serverless Workflow 规范之外,Kogito 还在云环境中提供对业务自动化的支持。
Kogito 的名字指的是“ Cogito”,在拉丁语中意为“我思故我在”名字中的“ k”表示对 Kubernetes 的敬意,这是这个工具的基础。
编辑您的工作流程:
我们将创建一个 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.0Acme、 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 应用程序。
在本文中,我们创建了一个应用程序,通过使用 Serverless Workflow 规范来编排服务调用。
您可以从这里下载本文中使用的源代码。它还包含一个 docker-compose 文件和一个启动脚本,因此您可以在一个命令中启动所有内容。
注意 | 要运行启动脚本和 Docker-compose 文件,您需要在计算机上安装 Docker。 |
要进一步了解 Serverless Workflow,您现在可以浏览以下资源:
| 留言与评论(共有 0 条评论) “” |