使用 Azure 容器应用和 Dapr 部署微服务
本文介绍在 Azure 容器应用中运行具有 10 个微服务的订单管理系统的解决方案。 该解决方案还通过分布式应用程序运行时(Dapr)和事件驱动的缩放(KEDA)使用微服务最佳做法。
Dapr 和 Traefik 是各自公司的商标。 使用这些标志并不意味着认可。
体系结构
下载此体系结构的 PowerPoint 文件。
数据流
此解决方案介绍虚构的 Red Dog 订单管理系统及其支持的 Azure 基础结构。 该体系结构由托管 10 个 .NET Core 微服务应用程序的单个容器应用环境组成。 该解决方案使用 Dapr SDK 通过发布-订阅、状态和绑定构建基块与 Azure 资源集成。 这些服务还使用 KEDA 缩放规则,允许根据事件触发器和缩放到零方案进行缩放。
以下数据流对应于上图:
Traefik:用于将用户请求从 UI 路由到交互式仪表板的会计和 Makeline 服务的基本代理。
UI: 显示 Red Dog 订单管理系统的实时订单和聚合销售数据的仪表板。
虚拟客户:一个客户模拟程序,用于模拟客户通过订单服务下订单。
订单服务: 创建、读取、更新和删除 API 以放置和管理订单。
会计服务:处理、存储和聚合订单数据的服务。 它将客户订单转换为 UI 展示的有意义的销售指标。
收据服务:一个存档程序,用于生成和存储订单收据,以供审核和历史记录之用。
会员服务:一项通过根据订单支出跟踪客户奖励积分来管理会员计划的服务。
Makeline 服务: 一项服务,用于管理等待完成的当前订单队列。 它跟踪虚拟辅助角色服务对订单的处理和完成。
虚拟辅助角色:一种模拟客户订单完成情况的辅助角色模拟程序。
服务 | 流入量 | Dapr 组件 | KEDA 缩放规则 |
---|---|---|---|
Traefik | 外部 | 未启用 Dapr | HTTP |
用户界面 | 内部 | 未启用 Dapr | HTTP |
虚拟客户 | 无 | 服务到服务调用 | 空值 |
订单服务 | 内部 | 发布-订阅:Azure 服务总线 | HTTP |
会计服务 | 内部 | 发布-订阅:服务总线 | 服务总线主题长度,HTTP |
收据服务 | 内部 | 发布-订阅:服务总线 绑定:Azure Blob 存储 |
服务总线主题长度 |
会员服务 | 内部 | 发布-订阅:服务总线 状态:Azure Cosmos DB |
服务总线主题长度 |
Makeline 服务 | 内部 | 发布-订阅:服务总线 状态:Azure Redis 缓存 |
服务总线主题长度,HTTP |
虚拟辅助角色 | 无 | 服务到服务调用 绑定:Cron |
空值 |
注意
还可以在容器应用中实现 Bootstrap。 但是,此服务运行一次以执行数据库创建,然后在 Azure SQL 数据库中创建必要的对象后缩放为零。
组件
Application Insights 是一种可扩展的应用程序性能管理服务,可用于监视实时应用程序并自动检测性能异常。 在此体系结构中,将 Application Insights 与 Azure Monitor 配合使用来查看容器日志并从微服务收集指标。
Blob 存储 是一种基于云的解决方案,用于存储大量非结构化数据,例如文本或二进制文件。 在此体系结构中,收据服务通过 Dapr 输出绑定使用 Blob 存储来存储订单收据。
Azure Cache for Redis 是一种分布式内存中可缩放的 Redis 缓存。 在此体系结构中,它用作 Makeline 服务的 Dapr 状态存储组件,用于在正在处理的订单上存储数据。
Azure Cosmos DB 是 NoSQL 多模型托管数据库服务。 在此体系结构中,它用作用于存储客户的忠诚数据的 Dapr 状态存储组件。
Azure Monitor 是一个统一的平台,可用于从 Azure 基础结构环境收集、分析和处理客户内容数据。 在此体系结构中,将 Azure Monitor 与 Application Insights 配合使用来查看容器日志并从微服务收集指标。
服务总线 是一个完全托管的企业消息代理,其中包含队列和发布-订阅主题。 在此体系结构中,将服务总线用于 Dapr 发布-订阅组件实现。 多个服务使用此组件。 订单服务在总线上发布消息,而 Makeline、会计、会员和收据服务订阅这些消息。
容器应用 是一项完全托管的无服务器容器服务,用于大规模生成和部署新式应用。 在此体系结构中,你将在容器应用上托管所有 10 个微服务,并将其部署到单个容器应用环境中。 此环境充当系统周围的安全边界。
SQL 数据库 是专为云构建的智能、可缩放的关系数据库服务。 在此体系结构中,它充当会计服务的数据存储,该服务使用 Entity Framework Core 与数据库进行交互。 引导程序服务负责在数据库中设置 SQL 表。 然后,它会在建立与会计服务的连接之前运行一次。
Traefik 是一种领先的新式反向代理和负载均衡器,使部署微服务变得很容易。 在此体系结构中,使用 Traefik 的动态配置功能从 UI 执行基于路径的路由,这是一个 Vue.js 单页应用程序。 此配置还允许对后端服务的直接 API 调用进行测试。
备选方法
在此体系结构中,部署一个 Traefik 代理,为 Vue.js API 启用基于路径的路由。 有许多可用于此目的的备选开放源代码代理。 其他两个常见项目是 NGINX 和 HAProxy。
除 SQL 数据库外,所有 Azure 基础结构都使用 Dapr 组件实现互作性。 Dapr 的一个好处是,可通过更改容器应用部署配置来交换所有这些组件。 在此方案中,服务总线、Azure Cosmos DB、Azure Redis 缓存和 Blob 存储展示了一些超过 70 个可用的 Dapr 组件。 Dapr 文档中提供了备用发布-订阅代理、状态存储和输出绑定的列表。
方案详细信息
微服务是广泛采用的体系结构样式。 它们提供可伸缩性、敏捷性和独立部署等优势。 可以用容器作为部署微服务应用程序的机制,然后使用 Kubernetes 等容器业务流程协调程序来简化操作。 对于大型微服务体系结构,需要考虑许多因素。 通常,基础结构平台需要对容器业务流程协调程序等复杂技术有重大了解。
容器应用 是一项完全托管的无服务器容器服务,用于大规模运行新式应用程序。 它使你能够通过基础平台的抽象部署容器化应用。 使用此方法不需要管理复杂的基础结构。
此体系结构使用容器应用与 Dapr 的托管版本集成。 Dapr 是一个开源项目,可帮助开发人员克服分布式应用程序中固有的挑战,例如状态管理和服务调用。
容器应用还提供 KEDA 的托管版本。 KEDA 允许容器根据来自外部服务(例如服务总线和 Azure Redis 缓存)的传入事件自动缩放。
还可以在容器应用中启用 HTTPS 入口,而无需创建更多 Azure 网络资源。 可使用 Envoy 代理,该代理还支持流量拆分场景。
有关详细信息,请参阅 将容器应用与其他 Azure 容器选项进行比较。
本文介绍在容器应用中运行具有 10 个微服务的订单管理系统的解决方案。 该解决方案还通过 Dapr 和 KEDA 的事件驱动缩放来使用微服务最佳做法。
可能的用例
此解决方案适用于任何将无状态和有状态微服务用于分布式系统的组织。 该解决方案最适合消费性包装品和具有订购和履行系统的制造业。
以下解决方案具有类似的设计:
- Azure Kubernetes 服务 (AKS) 中的微服务体系结构
- Azure Functions 上的微服务体系结构
- 事件驱动的体系结构
注意事项
这些注意事项实施 Azure 架构良好的框架的支柱原则,即一套可用于改进工作负荷质量的指导原则。 有关详细信息,请参阅 Well-Architected Framework。
可靠性
可靠性有助于确保应用程序能够履行对客户的承诺。 有关详细信息,请参阅 可靠性的设计评审清单。
容器应用是基于 Kubernetes 基础构建的,它作为底层基础结构运行。 复原机制内置于 Kubernetes 中,用于监视和重启容器或 Pod(如果存在问题)。 复原机制包括一个内置负载均衡器,用于跨每个容器应用的多个副本分配流量。 此冗余允许系统保持运行状态,即使一个副本不可用也是如此。
安全
安全性提供针对故意攻击和滥用宝贵数据和系统的保证。 有关详细信息,请参阅可靠性设计审查检查表。
以下列表概述了此体系结构中省略的几个安全功能,以及其他建议和注意事项:
此体系结构不使用 专用终结点,通过从虚拟网络向其分配 IP 地址,允许与 Azure 服务建立更安全的专用连接。 使用专用终结点时,可以禁用公用网络访问。 此方法将流量保留在Microsoft主干上,并增强安全性和合规性。
应持续监视网络活动,以检测和防止滥用行为。 可以使用 Azure 防火墙 和路由表来实现此方法。 路由表允许首先通过防火墙传递虚拟网络的流量。 此过程是确保体系结构不容易受到数据外泄攻击的重要步骤。
使用 Web 应用程序防火墙(WAF)防范常见漏洞。 使用 Azure Front Door 或 Azure 应用程序网关在此体系结构中 实现 WAF 。
请考虑对容器应用使用内置身份验证和授权功能,称为 “轻松身份验证”。轻松身份验证简化了将标识提供者集成到 Web 应用的过程。 它可在 Web 应用外部处理身份验证,因此无需进行重大代码更改。
将托管标识用于工作负载标识。 使用托管标识,开关人员将无需管理身份验证凭据。 例如,基本体系结构通过连接字符串中的密码向 SQL Server 进行身份验证。 如果可能,请使用 Microsoft Entra ID 向 Azure SQL Server 进行身份验证。
成本优化
成本优化侧重于减少不必要的开支和提高运营效率的方法。 有关详细信息,请参阅 成本优化的设计评审清单。
使用 Azure 定价计算器估算此体系结构中的服务成本。
卓越运营
卓越运营涵盖了部署应用程序并使其在生产环境中保持运行的运营流程。 有关详细信息,请参阅设计卓越运营的审查清单。
可以使用 Azure Monitor 和 Application Insights 监视容器应用。 可以通过在门户中导航到每个容器应用中的 “日志 ”窗格,然后运行以下 Kusto 查询来查看容器日志。 此示例显示 Makeline 服务应用的日志。
ContainerAppConsoleLogs_CL |
where ContainerAppName_s contains "make-line-service" |
project TimeGenerated, _timestamp_d, ContainerGroupName_s, Log_s |
order by _timestamp_d asc
Application Insights 中的应用程序映射还显示服务如何实时通信。 然后,可将它们用于调试场景。 导航到 Application Insights 资源下的应用程序映射,查看类似于以下映射的内容。
有关详细信息,请参阅 在容器应用中监视应用。
性能效率
性能效率是指工作负荷能够高效地缩放以满足用户需求。 有关详细信息,请参阅 性能效率的设计评审清单。
此解决方案严重依赖于容器应用中的 KEDA 实现来实现事件驱动的缩放。 部署虚拟客户服务时,它会持续下订单。 此缩放会导致订单服务通过 HTTP KEDA 缩放程序纵向扩展。 当订单服务在服务总线上发布订单时,服务总线 KEDA 缩放程序会导致会计、收据、Makeline 和会员服务纵向扩展。 UI 和 Traefik 容器应用还会配置 HTTP KEDA 缩放程序,使应用随着更多用户访问仪表板而缩放。
如果虚拟客户未运行,此解决方案中的所有微服务将缩放为零,但虚拟辅助角色和 Makeline 服务除外。 虚拟辅助角色不会缩减,因为它会持续检查订单履行情况。 有关详细信息,请参阅 在容器应用中设置缩放规则。
作者
Microsoft维护本文。 以下参与者撰写了本文。
首席作者:
- Alice Gibbons | 云原生全球黑带
其他参与者:
- Lynn Orrell | 首席解决方案专家 (GBB)
- Kendall Roden | 高级计划经理
若要查看非公开的LinkedIn个人资料,请登录LinkedIn。