15、Dapr在系统集成与生态中的应用

Dapr在系统集成与生态中的应用

1. 代码定制与系统集成概述

在进行系统开发时,无论选择何种路线,都应尽量减少代码定制的组件数量。例如在某些场景中,不同用户的旅行政策及执行方式可能不同,为解决这一问题,可引入单独的策略执行器 API,以隐藏用户间的差异,并为系统其他部分提供标准 API。

但使用此类设计时需注意,如果参与者仅封装状态,且 API 未正确分割,就会陷入“大泥球”反模式,即复杂代码对多个独立实体进行操作。理想情况下,参与者应尽可能自主,API 仅触发不同参与者实例的活动。

应用很少独立运行,常需与外部系统通信,下面介绍如何使用 Dapr 进行系统集成。

2. Dapr 系统集成模式

2.1 分布式工作流作为有限状态机

可将工作流建模为有限状态机(FSM),它有有限的可能状态列表,并根据输入和当前状态在状态间转换。例如,某个预订工作流可用状态机描述。

使用 Dapr 参与者可轻松建模此状态机,它能暴露必要方法触发相应转换。与之前系统的关键区别在于,参与者实例可决定是否允许特定转换。

FSM 在任何成功的状态转换后保存其状态,这意味着它可随时关闭并按需恢复。该设计要求状态操作具有事务性,且 FSM 仅在定义的状态间转换,避免使用可能导致混淆的中间状态。

2.2 同步模式

2.2.1 共享数据库

对于可访问同一数据库(如云托管数据库)的两个远程系统,共享数据库模式是同步大量数据的有效方式。实现时,可专门设置用于同步的数据库或表,而非强制系统共享相同的数据库架构,以增加系统独立演进的灵活性。

使用 Dapr 封装状态访问,只需将两个系统的同步状态存储配置为指向同一数据库位置。若要实现共享关系数据库,需编写自定义代码并使用 Dapr 向系统其他部分暴露同步 API。Dapr 的中间件机制可用于插入额外的数据处理功能,如规范化、批处理和压缩,以优化数据同步。

若无法直接共享数据库,可利用支持所选数据库平台的现有数据同步解决方案,但数据仅最终一致,需确保系统能处理临时不一致。若将共享数据库替换为消息骨干,该模式将转变为收件箱/发件箱模式。

2.2.2 收件箱/发件箱和邮件管理员

收件箱/发件箱是一种简单随意的同步机制。每个系统维护一个收件箱和可选的发件箱,需与其他系统同步时,向目标系统发送包含待同步数据或获取更新数据指令的消息。这不是严格的数据同步模式,允许系统相互通知更改,接收者可选择响应或丢弃通知。

直接消息传递存在不足,可使用发布/订阅模式。系统可同时通知多个系统,无需知道目标收件箱地址,但需过滤自己发送的消息。也可让每个系统发布到自己的“外发”主题,供接收系统订阅。

还可引入邮件管理员,它是集中的消息处理程序,可集中管理集成拓扑和同步策略,减轻单个系统的消息处理负担。

2.2.3 事件溯源

事件溯源模式将所有状态突变视为事件。例如管理银行账户时,不直接更新账户余额,而是将所有取款和存款记录为事件,通过回放事件获取账户余额,并可进行一些优化,如定期创建余额检查点。

该模式有诸多优点,如可返回系统的任何时间点、可将事件发送到不同环境进行诊断、使用仅追加操作避免数据库更新问题、可分离读写操作、可用于设置备份和恢复系统。

可通过将事件从一个系统发送到另一个系统并在另一个系统中回放来使用事件溯源模式进行同步。可使用 Dapr 的状态存储接口实现仅追加状态存储,Set 方法将更新事件追加到数据库,Read 方法根据应用需求维护检查点并从最后一个已知检查点读取和回放事件。

以下是不同同步模式的对比表格:
| 同步模式 | 优点 | 缺点 | 适用场景 |
| ---- | ---- | ---- | ---- |
| 共享数据库 | 高效同步大量数据,可利用 Dapr 中间件优化 | 可能引入紧密耦合,数据仅最终一致(非直接共享时) | 可访问同一数据库的远程系统 |
| 收件箱/发件箱 | 简单灵活,允许系统松散耦合 | 直接消息传递有管理开销,发布/订阅需过滤消息 | 系统间需要相互通知更改的场景 |
| 事件溯源 | 可返回任意时间点,便于诊断和备份恢复,避免数据库更新问题 | 实现较复杂 | 需要历史状态回溯和数据一致性保障的场景 |

下面是收件箱/发件箱模式的 mermaid 流程图:

graph LR
    A[系统 A] -->|消息| B[系统 B]
    B -->|消息| A
    A -->|发布到外发主题| PubSub
    B -->|订阅外发主题| PubSub
    PubSub -->|消息| A
    PubSub -->|消息| B

3. Dapr 在更大生态系统中的应用

3.1 Yeoman Dapr 生成器

Yeoman 是流行的脚手架工具,现在有 Yeoman Dapr 生成器,可帮助生成 C#、Go、JavaScript、Python 和 TypeScript 等语言的 Dapr 启用应用程序。生成的代码包含方法调用、发布/订阅和绑定的示例。

使用时,安装 Yeoman 和生成器后,在终端窗口输入 yo dapr ,并按照向导创建完整的 Dapr 应用程序。

3.2 Dapr 在 Visual Studio Code 中

Visual Studio Code 是世界上最流行的代码编辑器之一,Dapr 作为语言无关的运行时,很适合其生态系统。Visual Studio Code 团队发布了 Dapr 插件。

以下是使用 Visual Studio Code 扩展创建、运行和调试 Dapr 应用程序的步骤:
1. 安装 Visual Studio Code Dapr 插件。
2. 创建新文件夹。
3. 在 Visual Studio Code 中打开该文件夹。
4. 按 Ctrl-Shift-D 打开运行面板。
5. 点击“创建 launch.json 文件”链接,创建新的启动配置,选择 Node.js 作为目标环境。
6. 关闭生成的 launch.json 文件。
7. 按 Ctrl-Shift-P 打开命令面板。
8. 启动 Dapr: Scaffold Dapr Tasks 命令。
9. 选择默认的 Launch Program 配置。
10. 输入 nodeapp 作为 Dapr ID 并按 Enter 继续。
11. 将应用程序端口保留为默认的 3000 并按 Enter 继续。
12. 创建 Node.js 应用程序,可复用之前的 Node.js 问候服务。
13. 在 Visual Studio 终端中运行 npm install 安装必要的 Node.js 包。
14. 打开 app.js 文件,在 app.post 方法处设置断点。
15. 再次按 Ctrl-Shift-D
16. 在运行面板中,确保选择新生成的带有 Dapr 启动配置文件的 Launch Program ,然后选择“运行 -> 开始调试”菜单项。
17. 按 Ctrl-Shift-P 打开命令面板。
18. 启动 Dapr: Invoke (POST) Application Method 命令。
19. 选择 nodeapp 作为目标应用程序, greeting 作为目标方法,输入简单的 JSON 有效负载(如 {"a":"b"} ),按 Enter 发送请求。

3.3 Dapr 与 ASP.NET Core

Dapr.AspNetCore 是一个 NuGet 包,可将 Dapr 功能(如状态管理和绑定)轻松集成到 ASP.NET Core Web 应用程序中。

以下是使用 Dapr 使控制器具有状态的代码示例:

[HttpGet("{account}")]
public ActionResult<Account> Get([FromState(StoreName)]StateEntry<Account> 
  account)
{
    if (account.Value is null)
    {
        return this.NotFound();
    }
    return account.Value;
}

以下是将控制器方法绑定到消息主题的代码示例:

[Topic("deposit")]
[HttpPost("deposit")]
public async Task<ActionResult<Account>> Deposit(Transaction transaction, 
      [FromServices] DaprClient daprClient) {
    var state = await daprClient.GetStateEntryAsync<Account>(StoreName, 
          transaction.Id);
    state.Value ??= new Account() { Id = transaction.Id, };
    state.Value.Balance += transaction.Amount;
    await state.SaveAsync();
    return state.Value;
}

通过“Daprizing”ASP.NET Core 控制器,可使同一 API 表面由消息系统触发,如收件箱/发件箱模式可通过此注解语法轻松实现。

3.4 Dapr 在大型应用中的使用

Dapr 是一种编程模型,而非应用程序模型,本身不提供描述多组件应用程序的方法。Dapr 边车可作为进程或 Docker 容器运行,可使用现有容器工具和清单格式描述工作负载和 Dapr 边车。

例如,可通过在 Kubernetes 部署 Pod 规范中添加 Dapr 注解来启用 Dapr 边车注入:

annotations:
  dapr.io/enabled: "true"
  dapr.io/id: "nodeapp"
  dapr.io/port: "3000"

还可在 Helm 图表、CNAB 包中描述 Dapr 边车,或使用 Knative 部署 Dapr 边车。

OAM 是一个开源项目,提供开发者友好的建模语言,允许开发者以平台无关的方式设计和描述应用程序。Dapr 与支持 Kubernetes Pod 注解或类似机制的 OAM 兼容控制平面配合良好。

以下是使用不同工具描述 Dapr 边车的对比表格:
| 工具 | 描述 Dapr 边车的方式 | 优点 |
| ---- | ---- | ---- |
| Kubernetes | 添加 Dapr 注解到 Pod 规范 | 广泛使用,便于集成到 Kubernetes 环境 |
| Helm 图表 | 在 Helm 图表中描述 | 可管理应用程序的部署和配置 |
| CNAB 包 | 打包 Dapr 边车 | 实现应用程序的跨平台分发 |
| Knative | 与应用程序一起部署 | 支持无服务器计算和事件驱动架构 |

下面是使用 Dapr 在 Kubernetes 中部署应用程序的 mermaid 流程图:

graph LR
    A[编写应用程序代码] --> B[创建 Docker 镜像]
    B --> C[编写 Kubernetes 部署文件]
    C --> D[添加 Dapr 注解]
    D --> E[部署到 Kubernetes]

4. 总结与展望

4.1 Dapr 应用总结

Dapr 在系统集成和生态应用中展现出了强大的功能和广泛的适用性。在系统集成方面,通过分布式工作流作为有限状态机、多种同步模式(共享数据库、收件箱/发件箱、事件溯源)等方式,能够有效地解决不同系统之间的数据同步和交互问题。在生态应用方面,与 Yeoman、Visual Studio Code、ASP.NET Core 等工具和框架的集成,为开发者提供了便捷的开发体验,降低了开发难度。

以下是对 Dapr 在不同场景应用的总结表格:
| 应用场景 | 实现方式 | 优势 |
| ---- | ---- | ---- |
| 系统集成 | 分布式工作流 FSM、共享数据库、收件箱/发件箱、事件溯源 | 灵活处理不同系统交互,保障数据同步和一致性 |
| 开发工具集成 | Yeoman 生成器、Visual Studio Code 插件 | 快速搭建 Dapr 应用,提高开发效率 |
| 框架集成 | Dapr.AspNetCore | 轻松将 Dapr 功能集成到现有框架,扩展应用功能 |

4.2 未来发展趋势

随着技术的不断发展,Dapr 有望在更多领域得到应用和拓展。例如,在无服务器计算、微服务架构的进一步发展中,Dapr 的轻量级、可扩展特性将使其成为更受欢迎的选择。同时,社区的不断发展也将为 Dapr 带来更多的最佳实践和工具,推动其在不同行业的应用。

4.3 开发者建议

对于开发者而言,建议深入学习 Dapr 的各种功能和模式,结合实际项目需求选择合适的集成方式。在使用过程中,充分利用社区资源,参考优秀的实践案例,不断提升自己的开发能力。同时,积极参与社区贡献,共同推动 Dapr 的发展。

下面是一个 Dapr 未来发展趋势的 mermaid 流程图:

graph LR
    A[Dapr 当前应用] --> B[无服务器计算拓展]
    A --> C[微服务架构深化]
    B --> D[更多应用场景出现]
    C --> D
    D --> E[社区贡献增加]
    E --> F[最佳实践和工具丰富]
    F --> G[不同行业广泛应用]

总之,Dapr 为开发者提供了一个强大而灵活的工具,在系统集成和生态应用中具有巨大的潜力。通过合理运用 Dapr 的各种功能和模式,开发者能够更高效地构建复杂的分布式应用系统。希望更多的开发者能够关注和使用 Dapr,共同探索其在不同领域的应用价值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值