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. 实战示例
构建一个基于规则的信贷决策服务,业务规则如下:
- 申请需包含申请人姓名、年龄、收入和债务
- 年龄 < 18 直接拒绝(未成年)
- 信用分 < 700 拒绝(信用不足)
- 债务 > 收入 50% 拒绝(偿付能力不足)
- 其他情况批准
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>
⚠️ 注意事项:
- Kogito 版本必须兼容 Quarkus 3
- 仅支持 RESTEasy 扩展(不支持 REST)
部署步骤:
- 将规则文件放入
src/main/resources
- 启动 Quarkus 应用
- 发送请求测试:
```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