2. 什么是 Kogito?

Kogito 是一个开源平台,专为构建云原生业务应用而生。与传统单体架构的 BPM 工具不同,Kogito 采用微服务优先、Kubernetes 原生的设计理念。它允许开发者将业务流程和规则建模为独立服务,实现独立扩展和监控。

Kogito 的架构深受领域特定语言(DSL)和行业标准影响,包括:

  • BPMN 2.0(业务流程模型和符号)
  • DMN(决策模型和符号)

这些模型不仅是可视化表示,还能直接编译为可执行代码集成到应用中。名称 "Kogito" 源自拉丁语 "Cogito"(我思考),字母 "K" 则代表 Kubernetes 及其起源项目 KIE(Knowledge Is Everything)。

3. Kogito 的核心技术

Kogito 是 KIE 项目中两大成熟技术的现代化演进:

  • jBPM - 业务流程建模与执行(基于 BPMN)
  • Drools - 强大的规则引擎(支持 DRL 和 DMN)

Kogito 通过以下特性对这些技术进行了现代化升级: ✅ 云原生打包 ✅ Quarkus 和 Spring Boot 支持 ✅ DevOps 就绪能力 ✅ 与 Prometheus/Grafana/OpenAPI 无缝集成

4. 核心特性

4.1 云原生与 Kubernetes 优先

Kogito 应用专为 Kubernetes 原生运行设计,内置:

  • 自动伸缩
  • 容器化
  • 故障恢复能力

开发者可独立部署服务,根据需求动态扩展决策或工作流逻辑。

4.2 事件驱动架构

通过 Apache Kafka 集成支持事件驱动设计,实现:

  • 异步服务通信
  • 近实时业务事件响应
  • 解耦的响应式系统

4.3 模型驱动开发

提供可视化工具和编辑器(BPMN/DMN),关键优势:

  • 模型即代码(非纯文档)
  • 直接编译为可执行服务
  • 减少编码工作量

4.4 开发者友好工具链

  • VS Code 插件
  • Kogito Tooling 在线编辑器
  • Quarkus/Spring Boot 原生支持
  • 最小化 Java 开发摩擦

4.5 DevOps 就绪

完美融入 CI/CD 流程:

  • 自动代码生成
  • 容器化部署
  • GitOps 兼容性
  • OpenTelemetry 追踪
  • Prometheus/Grafana 监控
  • Kubernetes 探针兼容

5. 典型应用场景

Kogito 在规则驱动决策和工作流编排领域表现突出,典型场景包括:

场景 核心能力
贷款/保险理赔 复杂资格审批规则自动化
客户入职 多步骤合规审批流程管理
供应链管理 库存/物流/供应商规则触发
医疗工作流 患者诊疗流程与规则驱动协议

6. 实战示例

构建一个基于规则的信贷决策服务,业务规则如下:

  1. 申请需包含申请人姓名、年龄、收入和债务
  2. 年龄 < 18 直接拒绝(未成年)
  3. 信用分 < 700 拒绝(信用不足)
  4. 债务 > 收入 50% 拒绝(偿付能力不足)
  5. 其他情况批准

6.1 输入输出示例

请求体:

{
    "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.2 Drools 规则实现

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.3 Kogito 微服务集成

POM 依赖配置:

<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>

⚠️ 注意事项:

  1. Kogito 版本必须兼容 Quarkus 3
  2. 仅支持 RESTEasy 扩展(不支持 REST)

部署步骤:

  1. 将规则文件放入 src/main/resources
  2. 启动 Quarkus 应用
  3. 发送请求测试: ```bash 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 } } ] }'


### 6.4 自定义 API 实践
Kogito 虽能自动生成 REST 接口,但自定义场景需注意:
❌ **避免直接在模型类使用 Jackson/JSON-B 注解**  
(Drools 引擎内部会进行 JSON 序列化,注解会导致冲突)

推荐方案:
```java
@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(接口可能变动),但提供了与 Quarkus 应用的深度集成能力。

7. 总结

本文探讨了 Kogito 作为云原生业务自动化工具的核心能力:

  • 基于 BPMN/DMN 的模型驱动开发
  • Kubernetes 原生微服务架构
  • 事件驱动的规则引擎集成

当前状态:

  • 项目处于快速迭代期(接口可能变动)
  • 建议参考 Kogito 示例仓库 的最新实践

完整代码示例:GitHub


原始标题:Business Process Automation with Kogito | Baeldung