首页  >  文章  >  Java  >  宣布推出新的 Conductor Java 客户端 v4

宣布推出新的 Conductor Java 客户端 v4

Patricia Arquette
Patricia Arquette原创
2024-10-14 16:08:31225浏览

Announcing the New Conductor Java Client v4

作者:米格尔·普列托


今年早些时候,Python SDK 进行了重大改版。现在,其他 Conductor SDK 正在进行重大改造,我们很高兴地宣布 Java Client v4,具有显着的设计增强、性能改进和优化的依赖项。

在我们的 Java 客户端 v4 中,我们通过改进其设计减少了依赖足迹。我们添加了过滤器、事件和侦听器来消除直接依赖关系。这个设计决策是经过深思熟虑后做出的,旨在让客户端更易于使用、扩展和维护。

继续阅读以了解更多信息!


我们为什么要这样做?

我们已听取您的反馈,并正在努力改善开发者体验。 Orkes 和 Conductor OSS 社区正在管理两个独立的 Java 客户端/SDK 项目,这两个项目与我们行业中的许多项目一样,都积累了一些技术债务。我们认为现在是解决这笔债务的最佳时机。

我们想要立即解决的一些关键问题是:

  1. 一个 Conductor Java 客户端(统治它们)
    目标是将两个现有项目整合为一个统一的、更易于管理的解决方案,汲取每个项目中最强大的元素。这应该转化为更快的更新、更好的支持和更具凝聚力的开发体验。

  2. 依赖优化
    作为代码清理的一部分,我们删除了几个依赖项:

    • 对后端代码的依赖 - 之前的 OSS Java 客户端和 SDK 项目是 Conductor OSS 存储库的一部分,并且依赖于conductor-commons。虽然这使后端/客户端模型保持同步,但这也意味着一些与后端相关的代码和依赖项会泄漏给客户端。
    • 对已弃用工件的依赖。
    • 对你不需要的东西的依赖。

    通过删除硬编码的依赖项,用户和贡献者可以扩展客户端,而无需锁定到特定的库或工具。

  3. 更多模块化
    我们重组了项目以提高模块化程度,使客户端更加灵活且更易于定制。

    通过这种模块化方法,您可以通过事件、侦听器和过滤器集成您喜欢的监控、日志记录或发现工具。这不仅简化了定制,还使代码库更具可维护性和面向未来的能力,使开发人员能够根据需要构建和扩展自己的扩展。

  4. 代码清理/重构
    有了更干净的代码库,未来的开发应该更快、更不容易出错,也让社区贡献变得更容易。

  5. 更好的例子
    我们在项目中引入了一个专门用于示例的模块。虽然它仍在进行中,但无论您是入门还是寻找高级用例,该模块都将作为实际示例的中心资源。

家,甜蜜的家

官方 Conductor 客户端和 SDK 目前位于 https://github.com/conductor-sdk,但 OSS Java 客户端/SDK 除外,它是 Conductor OSS 存储库的一部分 https://github.com /orkes-io/orkes-conductor-client/tree/main.

展望未来,所有 Conductor 客户端和 SDK 最终都将存放在conductor-oss/conductor 存储库中的同一个conductor-clients 目录中。前往那里查找 Java 客户端/SDK v4 的源代码。

Java 客户端 v4 有哪些新增功能?

1.优化依赖

与它所取代的两个项目相比,Java Client v4 引入了更精简、更高效的依赖项集。

我们删除了所有未使用的、已弃用的和不必要的依赖项,显着减少了类路径污染。 这种优化不仅可以最大限度地降低库之间发生冲突的风险,而且还可以提高整体性能和可维护性。通过简化依赖关系树,v4 提供了一个更干净、更轻量的客户端,更易于使用并更顺利地集成到您的项目中。

2.新的TaskRunner

TaskRunner 已被重构。它取代了 TaskPollExecutor,因为两者共享相同的核心职责:管理工作人员用于轮询、执行和更新任务的线程池。

这样,我们就删除了对 Netflix Eureka 和 Spectator 的直接依赖,引入了事件驱动机制,并添加了 PollFilter——一个确定是否应该进行轮询的回调​​。此外,错误处理和并发管理也得到了改进。

如果您正在使用 Eureka 和 Spectator,无需担心 — 提供的事件和过滤器可与这些出色的工具和库无缝集成。

3. 使用事件、侦听器和过滤器的可扩展性

Java Client v4 通过事件、侦听器和过滤器引入了增强的可扩展性。这些可用于各种目的,包括指标跟踪、日志记录、审核以及根据特定条件触发自定义操作。

例如,您可以使用 Lambda 函数作为 PollFilter 来检查 Eureka 报告的实例状态。如果实例被标记为 UP(意味着 Eureka 认为它健康且可用),那么工作线程将继续轮询任务。

此外,还可以注册一个监听器来处理 PollCompleted 事件。在这种情况下,侦听器记录事件详细信息并使用 Prometheus 跟踪轮询过程的持续时间,将任务类型附加为详细指标跟踪的标签。这种方法不仅增加了灵活性,还提高了对客户行为的可观察性和控制力。

var runnerConfigurer = new TaskRunnerConfigurer
        .Builder(taskClient, List.of(new HelloWorldWorker()))
        .withThreadCount(10)
        .withPollFilter((String taskType, String domain) -> {
            return eurekaClient.getInstanceRemoteStatus().equals(InstanceStatus.UP);
        })
        .withListener(PollCompleted.class, (e) -> {
            log.info("Poll Completed {}", e);
            var timer = prometheusRegistry.timer("poll_completed", "type", e.getTaskType());
            timer.record(e.getDuration());
        })
        .build();

runnerConfigurer.init();

客户端还有一些专门的接口,例如 MetricsCollector,它构建在这些事件和侦听器之上。我们将很快提供指标收集器的具体实现。

4. OkHttp3 v4 — 适量的功能 OOTB

OkHttp3 v4 是最流行且最受好评的 Java HTTP 客户端之一。通过升级,我们的 Java 客户端/SDK v4 现在支持开箱即用的 HTTP2 和 Gzip,使您能够更快地发出 HTTP 请求或数据传输。虽然还有其他优秀的选择,但选择 OkHTTP 是因为它的简单性、性能和可靠性。

随着 OkHttp 升级,我们还决定删除一个抽象层 Jersey。与 OkHttp 等简单的 HTTP 客户端相比,Jersey 功能更丰富,但也更重量级。如果您只想发出基本的 HTTP 请求,其中一些功能(例如依赖项注入、过滤器和异常映射器)可能有些过头了。

5. 轻松从 OSS 迁移到 Orkes

客户端促进了 OSS Conductor 和 Orkes Conductor 之间的无缝集成,使用户能够根据需求的变化灵活切换,同时首先保持对开源社区的支持。

Orkes 客户端模块只是通过 HeaderSupplier 添加身份验证来扩展 Conductor 客户端。

对于使用 Client v4 创建了 Worker 但想要尝试 Orkes Conductor 的 OSS 用户,他们只需将 orkes-conductor-client 依赖项添加到他们的项目中,并使用 OrkesAuthentication 作为标头供应商实例化客户端。切换回 OSS 就像删除标头供应商一样简单。

var client = ConductorClient.builder()
                .basePath(BASE_PATH)
                .addHeaderSupplier(new OrkesAuthentication(KEY, SECRET))
                .build();
return new TaskClient(client); // Use this TaskClient with TaskRunner to initialize workers

找出Conductor OSS和Orkes Conductor之间的6个区别。

6.改进的示例和文档

我们已经开始将示例整合到专用模块中,并进行了涵盖授权、管理工作流程和任务定义、调度工作流程等关键领域的改进。虽然该模块仍在开发中,但我们将不断添加和完善示例,以提供更好的指导并涵盖实际用例。

我们的目标是让开发人员能够有效地使用我们的客户端/SDK,并随着模块的发展探索最佳实践。

Java 客户端 v4 入门

以下是开始使用 Java 客户端 v4 的方法:

第 1 步:旋转导体

使用 Conductor OSS 或 Orkes Conductor:

  • Conductor OSS—从源代码运行它或使用 Docker。
  • Orkes Conductor—试用 Orkes Playground 或注册免费试用。

第 2 步:将conductor-client依赖项添加到您的项目中

对于基于 Gradle 的项目:

implementation 'org.conductoross:conductor-client:4.0.0'
implementation 'io.orkes:orkes-conductor-client:4.0.0' // required if using Orkes Conductor

对于基于 Maven 的项目:

<dependency>
    <groupId>org.conductoross</groupId>
    <artifactId>conductor-client</artifactId>
    <version>4.0.0</version>
</dependency>
<dependency>
    <groupId>io.orkes</groupId>
    <artifactId>orkes-conductor-client</artifactId>
    <version>4.0.0</version>
</dependency> <!-- Required if using Orkes Conductor –->

步骤3:创建ConductorClient实例

import com.netflix.conductor.client.http.ConductorClient;

// … boilerplate or other code omitted
var client = new ConductorClient("http://localhost:8080/api");

如果您使用 Orkes Conductor,您将需要创建一个应用程序并获取您的凭据。使用您的密钥 ID 和密码,创建一个 ConductorClient 实例:

import com.netflix.conductor.client.http.ConductorClient;
import io.orkes.conductor.client.http.OrkesAuthentication;

var client = ConductorClient.builder()
           .basePath("https://play.orkes.io/api")
           .addHeaderSupplier(new OrkesAuthentication(KEY, SECRET))
           .build();


import io.orkes.conductor.client.ApiClient;

var client = ApiClient.builder() // ApiClient extends ConductorClient
                 .basePath("https://play.orkes.io/api")
                .credentials(KEY, SECRET)
                .build();

第 4 步:创建工作流程

您可以使用此 JSON 在 Conductor 中创建工作流程:

{
  "name": "hello_workflow",
  "description": "Hello Workflow!",
  "version": 1,
  "tasks": [
    {
      "name": "hello_task",
      "taskReferenceName": "hello_task_ref",
      "type": "SIMPLE",
      "inputParameters": {}
    }
  ],
  "inputParameters": [],
  "outputParameters": {

  },
  "schemaVersion": 2,
  "restartable": true,
  "workflowStatusListenerEnabled": false,
  "ownerEmail": "example@orkes.io",
  "timeoutPolicy": "ALERT_ONLY",
  "timeoutSeconds": 0
}

或者使用我们的 SDK 模块以代码形式创建工作流程。为此,您需要将以下依赖项添加到您的项目中:

对于基于 Gradle 的项目:

implementation 'org.conductoross:java-sdk::4.0.0'

对于基于 Maven 的项目:

<dependency>
    <groupId>org.conductoross</groupId>
    <artifactId>java-sdk</artifactId>
    <version>4.0.0</version>
</dependency>

添加依赖后,可以执行以下代码来注册工作流:

import com.netflix.conductor.sdk.workflow.def.WorkflowBuilder;
import com.netflix.conductor.sdk.workflow.def.tasks.SimpleTask;
import com.netflix.conductor.sdk.workflow.executor.WorkflowExecutor;

// … boilerplate or other code omitted
var executor = new WorkflowExecutor("http://localhost:8080/api");
var workflow = new WorkflowBuilder<Void>(executor)
        .name("hello_workflow")
        .version(1)
        .description("Hello Workflow!")
        .ownerEmail("examples@orkes.io")
        .add(new SimpleTask("hello_task", "hello_task_ref"))
        .build();
workflow.registerWorkflow(true, true);
executor.shutdown();

第 5 步:启动工作流程

现在您已经注册了工作流程,您可以使用代码启动它:

import com.netflix.conductor.client.http.ConductorClient;
import com.netflix.conductor.client.http.WorkflowClient;
import com.netflix.conductor.common.metadata.workflow.StartWorkflowRequest;

var client = new ConductorClient("http://localhost:8080/api");
var workflowClient = new WorkflowClient(client);
var workflowId = workflowClient.startWorkflow(new StartWorkflowRequest()
        .withName("hello_workflow")
        .withVersion(1));

System.out.println("Started workflow " + workflowId);

Step 6: Run a worker

You need a worker polling for “hello_workflow” tasks and executing them to complete the workflow you started in Step 5.

For that, you can run this example:

import com.netflix.conductor.client.automator.TaskRunnerConfigurer;
import com.netflix.conductor.client.http.ConductorClient;
import com.netflix.conductor.client.http.TaskClient;
import com.netflix.conductor.client.worker.Worker;
import com.netflix.conductor.common.metadata.tasks.Task;
import com.netflix.conductor.common.metadata.tasks.TaskResult;

import java.util.List;

public class HelloWorker implements Worker {

    @Override
    public TaskResult execute(Task task) {
        var taskResult = new TaskResult(task);
        taskResult.setStatus(TaskResult.Status.COMPLETED);
        taskResult.getOutputData().put("message", "Hello World!");
        return taskResult;
    }

    @Override
    public String getTaskDefName() {
        return "hello_task";
    }

    public static void main(String[] args) {
        var client = new ConductorClient("http://localhost:8080/api");
        var taskClient = new TaskClient(client);
        var runnerConfigurer = new TaskRunnerConfigurer
                .Builder(taskClient, List.of(new HelloWorker()))
                .withThreadCount(10)
                .build();
        runnerConfigurer.init();
    }
}

These complete examples can be found here.

Note: If you want to run these code snippets in Orkes Conductor, remember to authenticate.

What’s next?: Roadmap

We aim for full parity between OSS server models and SDKs, so stay tuned for more changes to Conductor’s Java SDK and improved documentation. To stay up-to-date with our progress, check out the Conductor OSS Project Board. To request features or report bugs, create a ticket in our GitHub repository or contact us on Slack.

We’ll also soon tackle other supported languages: JavaScript, C#, Go, and Clojure. In the meantime, happy coding! Don’t forget to follow the Conductor OSS project and support us by giving a ⭐.


Orkes Cloud is a fully managed and hosted Conductor service that can scale seamlessly to meet your needs. When you use Conductor via Orkes Cloud, your engineers don’t need to worry about setting up, tuning, patching, and managing high-performance Conductor clusters. Try it out with our 14-day free trial for Orkes Cloud.

以上是宣布推出新的 Conductor Java 客户端 v4的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn