使用 Kogito 實現業務流程自動化
1.概述
Apache Kogito是一個用於建立雲端原生業務應用程式的開源平台。在本教程中,我們將了解如何使用它以及如何使用 Kogito 整合建置應用程式。
2.什麼是Kogito?
與以單體架構為基礎創建的傳統業務流程管理 (BPM) 工具不同,Kogito 採用微服務優先和 Kubernetes 原生方法。它允許開發人員將業務流程和規則建模、執行和監控為可獨立擴展的獨立服務。
Kogito 的架構深受領域特定語言 (DSL) 和行業標準的影響,例如 BPMN 2.0(業務流程模型和符號)和 DMN(決策模型和符號)。這些不僅僅是視覺表現——它們成為可執行模型,直接整合到應用程式中。
「Kogito」這個名字源自拉丁文「Cogito」(「我認為」),而「K」指的是 Kubernetes 以及 Kogito 所源自的「知識就是一切」(KIE)開源業務自動化專案。
3. Kogito背後的核心技術
Kogito 是兩個成熟項目的現代演變,它們也是 KIE 的一部分:
- jBPM – 用於建模和執行業務流程(使用
Business Process Model and Notation
/ BPMN) - Drools – 強大的規則引擎(用於使用
Drules Rule Language
/ DRL 或Decision Model and Notation
/ DMN 的決策邏輯)
Kogito 透過提供雲端原生打包、Quarkus 和 Spring Boot 支援、DevOps 就緒以及與 Prometheus、Grafana 和 OpenAPI 等工具的無縫整合來擴展和現代化這些技術。
4. 主要特點
4.1.雲端原生和 Kubernetes 優先
Kogito 應用程式設計為在 Kubernetes 上原生運作。這意味著自動可擴展性、容器化和彈性是內建的。開發人員可以獨立部署服務,並根據需求的變化擴展決策或工作流程邏輯。
4.2.事件驅動架構
Kogito 透過與 Apache Kafka 的整合支援事件驅動設計,從而實現服務之間的非同步通訊。這對於能夠近乎即時地響應業務事件的反應式、解耦系統至關重要。
4.3.模型驅動開發
Kogito 強調透過 BPMN 和 DMN 的視覺化工具和編輯器進行模型驅動開發。這些模型不僅僅是文件——它們被編譯成可執行服務。
4.4.以開發人員為中心的工具
Kogito 提供 VS Code 外掛程式、Kogito Tooling 等線上編輯器以及 Quarkus 和 Spring Boot 等框架的原生支持,幫助 Java 開發人員以最小的阻力建立自動化服務。
4.5. DevOps 就緒
由於自動程式碼產生、容器化部署和 GitOps 相容性等功能,Kogito 可以完美地融入 CI/CD 管道。它支援使用 OpenTelemetry 進行追蹤、使用 Prometheus 和 Grafana 進行監控以及與 Kubernetes 的活性和就緒探測相容的健康檢查。
5.用例
Kogito 在基於規則的決策和工作流程編排至關重要的領域表現出色。一些典型的用例包括:
- 貸款和保險索賠處理—自動化資格、批准和路由的複雜規則
- 客戶入職-透過合規性檢查和批准管理多步驟工作流程
- 供應鏈管理-根據與庫存、物流和供應商行為相關的規則觸發行動
- 醫療保健工作流程-處理病患旅程、文件和規則驅動的治療方案
6. 樣本
讓我們建立一個小範例來示範 Kogito 的工作原理。我們想要一個基於規則的信用決策服務,其規則如下:
- 貸款申請需要包含申請人的姓名和年齡以及收入和現有債務。
- 如果申請人未滿 18 歲,我們將因申請人未成年而拒絕其申請。
- 如果信用評分低於 700,我們會拒絕該申請,因為其信用不佳。
- 如果申請人現有的債務高於收入的50%,我們將以信用不良為由拒絕該申請。
- 否則,申請被批准。
例如,讓我們向服務發送一個應用程式清單:
{
"applications": [
{
"id": "1fe1aED7-ca61-Eeb4-78fA-55f5E568Aa8b",
"person": {
"name": "Mr Smith",
"age": 25
},
"conditions": {
"creditScore": 400,
"income": 30000,
"debt": 0
}
},
{
"id": "b2c0a268-aa6f-44b8-b644-f466cb35504c",
"person": {
"name": "Mrs Doe",
"age": 35
},
"conditions": {
"creditScore": 700,
"income": 70000,
"debt": 3000
}
}
]
}
讓我們檢查一下結果:
[
{
"id": "1fe1aed7-ca61-eeb4-78fa-55f5e568aa8b",
"decision": "rejected-not-creditworthy"
},
{
"id": "b2c0a268-aa6f-44b8-b644-f466cb35504c",
"decision": "approved"
}
]
6.1. Drools 規則
我們可以使用 Drools 及其規則語言(DSL)來實作該範例。規則文件可能如下所示:
package com.baeldung.kogito.rules
unit LoanApplicationUnit
import com.baeldung.kogito.rules.model.LoanApplication
import com.baeldung.kogito.rules.model.Person
import com.baeldung.kogito.rules.model.Conditions
import com.baeldung.kogito.rules.model.Decision
rule "only-adults"
salience 10
when
$application: /applications[
person.age < 18
]
then
modify($application){
setDecision(Decision.REJECTED_UNDERAGE)
}
end
rule "Good Credit Score And High Income"
when
$application: /applications[
person.age >= 18,
conditions.creditScore >= 700,
conditions.income > 2*conditions.debt
]
then
modify($application){
setDecision(Decision.APPROVED)
}
end
rule "Low Credit Score Or High Debt"
when
$application: /applications[
person.age >= 18,
(
conditions.creditScore < 700 ||
conditions.income <= 2*conditions.debt
)
]
then
modify($application){
setDecision(Decision.REJECTED_NOT_CREDITWORTHY)
}
end
query applications
$result: /applications
end
6.2.小義人
如果我們希望它作為具有 HTTP/REST 端點的微服務運行,我們只需創建一個 Quarkus 專案並將其添加到pom.xml
中:
<project>
<dependencyManagement>
<dependencies>
<!-- ... -->
<dependency>
<groupId>org.kie.kogito</groupId>
<artifactId>kogito-bom</artifactId>
<version>${kogito.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!-- ... -->
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-resteasy-jackson</artifactId>
</dependency>
<dependency>
<groupId>org.kie.kogito</groupId>
<artifactId>kogito-quarkus-rules</artifactId>
</dependency>
</dependencies>
<properties>
<kogito.version>2.44.0.Alpha</kogito.version>
</properties>
</project>
我們需要意識到:
- 給定的 Kogito 版本必須支援 Quarkus 3
- Kogito 僅支援 Quarkus RESTEasy 擴展,不支援 Quarkus REST 擴展
然後,將 Drools 規則檔案放在src/main/resources
下。 Kogito 會自動偵測到它,因此我們可以運行 Quarkus 應用程式並發送請求——例如透過 curl:
curl -X 'POST' \
'http://localhost:8080/applications' \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"applications": [
{
"id": "1fe1aED7-ca61-Eeb4-78fA-55f5E568Aa8b",
"person": {
"name": "Mr Smith",
"age": 25
},
"conditions": {
"creditScore": 400,
"income": 30000,
"debt": 0
}
},
{
"id": "b2c0a268-aa6f-44b8-b644-f466cb35504c",
"person": {
"name": "Mrs Doe",
"age": 35
},
"conditions": {
"creditScore": 700,
"income": 70000,
"debt": 3000
}
}
]
}'
我們可以看到,它無需任何 Quarkus 程式碼即可運行。我們可以利用現有的生態系統建構 Quarkus 微服務並將其部署到任何雲端環境中。
6.3.自訂 API
Kogito 是一種快速建立 REST 資源的方法,無需編寫任何程式碼。但是,我們自己編寫 API 程式碼可能是有意義的。這樣,我們可以定義自訂端點的 URL 和用於資料交換的 JSON 模式。
當發送請求時,我們可以看到回應主體包含來自請求主體的全部數據,並補充了信用決策。我們可能有想法添加 Jackson 或 JSON-B 註釋來定義唯讀和只寫屬性,但這對於 Drools 規則模型類別來說不是一個好主意,因為 Drools 引擎內部對它們進行 JSON 序列化和反序列化,所以這行不通。
因此,我們可以建立自訂 REST 資源和 DTO,使用映射器(例如,使用 MapStruct)將 DTO 對應到 Drools 規則模型,並呼叫使用 Drools 規則引擎的網域服務。這樣的領域服務可能看起來像:
import org.kie.kogito.incubation.application.AppRoot;
import org.kie.kogito.incubation.common.MapDataContext;
import org.kie.kogito.incubation.rules.RuleUnitIds;
import org.kie.kogito.incubation.rules.services.RuleUnitService;
// ...
@ApplicationScoped
public class LoanApplicationService {
@Inject
AppRoot appRoot;
@Inject
RuleUnitService ruleUnitService;
public Stream<LoanApplication> evaluate(LoanApplication... applications) {
var queryId = appRoot
.get(RuleUnitIds.class)
.get(LoanApplicationUnit.class)
.queries()
.get("applications");
var ctx = MapDataContext
.of(
Map.of("applications", applications)
);
return ruleUnitService
.evaluate(queryId, ctx)
.map(
result -> result
.as(MapDataContext.class)
.get("$result", LoanApplication.class)
);
}
}
我們可以看到,我們使用了仍處於孵化狀態的Kogito API 。但這個 API 允許我們將 Drools 規則引擎整合到任何 Quarkus 應用程式中。
7. 結論
在本文中,我們了解了 Kogito 作為創建雲端原生業務應用程式的自動化工具。該專案目前仍在進行大量開發,因此介面不斷變化。我們可以使用Kogito 範例庫中提供的範例作為指南。
與往常一樣,本文中提供的程式碼可在 GitHub 上找到。