>  기사  >  Java  >  새로운 Conductor Java Client v4 발표

새로운 Conductor Java Client 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 Client v4 발표의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.