conductor workflow

用于开发创建、管理和执行工作流以及运行工作器的 Go 应用程序的 SDK。

Conductor是领先的开源编排平台,允许开发人员构建高度可扩展的分布式应用程序。

要了解有关 Conductor 的更多信息,请查看我们的开发人员指南,并给它一个 ⭐ 以使其出名!

GitHub 星星

内容

安装

  1. 初始化你的模块。例如:
mkdir hello_world
cd hello_world
go mod init hello_world
 
  1. 获取 SDK:
go get github.com/conductor-sdk/conductor-go
 

你好世界

在此 repo 中,您将在examples/hello_world下找到一个基本的“Hello World” 。

让我们通过 3 个步骤来分析该应用程序。

笔记

您将需要一个正在运行的 Conductor 服务器。

有关如何运行 Conductor 的详细信息,请参阅我们的指南

这些示例期望服务器监听http://localhost:8080

步骤 1:通过代码创建工作流

“问候”工作流程将通过代码创建并在 Conductor 中注册。

检查examples/hello_world/src/workflow.goCreateWorkflow中的函数

func CreateWorkflow(executor *executor.WorkflowExecutor) *workflow.ConductorWorkflow {
	wf := workflow.NewConductorWorkflow(executor).
		Name("greetings").
		Version(1).
		Description("Greetings workflow - Greets a user by their name").
		TimeoutPolicy(workflow.TimeOutWorkflow, 600)

	greet := workflow.NewSimpleTask("greet", "greet_ref").
		Input("person_to_be_greated", "${workflow.input.name}")

	wf.Add(greet)

	wf.OutputParameters(map[string]interface{}{
		"greetings": greet.OutputRef("hello"),
	})

	return wf
}
 

在上面的代码中,我们首先通过调用workflow.NewConductorWorkflow(..)设置其属性Name和 来创建一个工作流VersionDescriptionTimeoutPolicy

然后我们创建一个具有引用名称的类型的简单任务并将其添加到工作流中。该任务使用键获取工作流输入作为输入"greet""greet_ref""name""person_to_be_greated"

笔记

"person_to_be_greated"太冗长了!为什么要这样命名?

这只是为了明确工作流输入不会自动传递。

由于 Input("person_to_be_greated", "${workflow.input.name}")工作流定义中的这种映射,工作人员将获得工作流输入的实际值。

类似的表达式"${workflow.input.name}"将在执行过程中被它们的值替换。

最后但同样重要的一点是,通过调用来设置工作流的输出wf.OutputParameters(..)

的值"greetings"将是"hello"执行任务的输出中的任何内容"greet",例如:如果任务输出是:

{
	"hello" : "Hello, John"
}
 

预期的工作流程输出将是:

{
	"greetings": "Hello, John"
}
 

Go 代码将转换为此 JSON 定义。注册工作流后,您可以在 Conductor 服务器中查看此内容。

{
  "schemaVersion": 2,
  "name": "greetings",
  "description": "Greetings workflow - Greets a user by their name",
  "version": 1,
  "tasks": [
    {
      "name": "greet",
      "taskReferenceName": "greet_ref",
      "type": "SIMPLE",
      "inputParameters": {
        "name": "${workflow.input.name}"
      }
    }
  ],
  "outputParameters": {
    "Greetings": "${greet_ref.output.greetings}"
  },
  "timeoutPolicy": "TIME_OUT_WF",
  "timeoutSeconds": 600
}
 

笔记

还可以使用 API 注册工作流。使用 JSON,您可以发出以下请求:

curl -X POST -H "Content-Type:application/json" \
http://localhost:8080/api/metadata/workflow -d @greetings_workflow.json
 

步骤 3中,您将看到如何创建 的实例executor.WorkflowExecutor

步骤 2:创建 worker

工作者是一个具有执行特定任务的功能。

在这个例子中,工人只是使用输入person_to_be_greated来打招呼,正如你在examples/hello_world/src/worker.go中看到的那样。

func Greet(task *model.Task) (interface{}, error) {
	return map[string]interface{}{
		"hello": "Hello, " + fmt.Sprintf("%v", task.InputData["person_to_be_greated"]),
	}, nil
}
 

要了解有关 Worker 的更多信息,请参阅使用 Go SDK 编写 Worker

笔记

单个工作流可以拥有用不同语言编写并部署在任何地方的任务工作者,从而使您的工作流具有多语言性和分布式!

步骤 3:运行应用程序

该应用程序将启动 Greet 工作进程(执行“greet”类型的任务),并且它将注册在步骤 1中创建的工作流。

首先,让我们看一下examples/hello_world/main.go中的变量声明。

var (
	apiClient        = client.NewAPIClientFromEnv()
	taskRunner       = worker.NewTaskRunnerWithApiClient(apiClient)
	workflowExecutor = executor.NewWorkflowExecutor(apiClient)
)
 

首先我们创建一个APIClient实例。这是一个 REST 客户端。

我们需要为客户端提供正确的设置。在此示例中,client.NewAPIClientFromEnv()使用了 ,它通过从以下环境变量中读取设置来初始化新客户端:CONDUCTOR_SERVER_URLCONDUCTOR_AUTH_KEYCONDUCTOR_AUTH_SECRET

现在让我们看一下该main函数:

func main() {
	// Start the Greet Worker. This worker will process "greet" tasks.
	taskRunner.StartWorker("greet", hello_world.Greet, 1, time.Millisecond*100)

	// This is used to register the Workflow, it's a one-time process. You can comment from here
	wf := hello_world.CreateWorkflow(workflowExecutor)
	err := wf.Register(true)
	if err != nil {
		log.Error(err.Error())
		return
	}
	// Till Here after registering the workflow

	// Start the greetings workflow 
	id, err := workflowExecutor.StartWorkflow(
		&model.StartWorkflowRequest{
			Name:    "greetings",
			Version: 1,
			Input: map[string]string{
				"name": "Gopher",
			},
		},
	)

	if err != nil {
		log.Error(err.Error())
		return
	}

	log.Info("Started workflow with Id: ", id)

	// Get a channel to monitor the workflow execution -
	// Note: This is useful in case of short duration workflows that completes in few seconds.
	channel, _ := workflowExecutor.MonitorExecution(id)
	run := <-channel
	log.Info("Output of the workflow: ", run.Output)
}
 

使用taskRunnerapiClient轮询工作并完成任务。它还会根据提供的配置启动工作器并为我们处理并发和轮询间隔。

这一行简单代码taskRunner.StartWorker("greet", hello_world.Greet, 1, time.Millisecond*100)就足以让我们的 Greet 工作者启动并运行,并处理类型的任务"greet"

这为workflowExecutor我们提供了一个抽象概念,用于apiClient管理工作流。它在后台用于ConductorWorkflow注册工作流,还用于启动和监控执行。

使用本地 Conductor OSS 服务器运行示例:

export CONDUCTOR_SERVER_URL="http://localhost:8080/api"
cd examples
go run hello_world/main.go
 
export CONDUCTOR_SERVER_URL="https://developer.orkescloud.com/api"
export CONDUCTOR_AUTH_KEY="..."
export CONDUCTOR_AUTH_SECRET="..."
cd examples
go run hello_world/main.go
 

笔记

Orkes Conductor 需要身份验证。从服务器获取密钥和密码以设置这些变量。

上述命令应给出类似如下的输出

INFO[0000] Updated poll interval for task: greet, to: 100ms 
INFO[0000] Started 1 worker(s) for taskName greet, polling in interval of 100 ms 
INFO[0000] Started workflow with Id:14a9fcc5-3d74-11ef-83dc-acde48001122 
INFO[0000] Output of the workflow:map[Greetings:Hello, Gopher] 

posted on 2025-03-13 17:39  ExplorerMan  阅读(82)  评论(0)    收藏  举报

导航