共计 3078 个字符,预计需要花费 8 分钟才能阅读完成。
令人惊讶的是,在过去几年中,越来越多的开发人员转向利用托管服务来部署和运行可扩展的云原生应用程序。通过这种转变,微服务架构已成为构建云原生应用程序的标准,并且可以预见,到 2022 年,将有 90%的新应用程序采用微服务架构。微服务架构提供了令人信服的好处,包括可伸缩性,松散的服务耦合和独立部署,但是这种方法的成本很高,需要了解和熟练掌握分布式系统。
开发人员希望专注于业务逻辑,频繁且增量地迁移遗留代码,同时依靠平台为应用程序提供所需的规模,弹性,可维护性,以及云原生架构的其他属性。但是,开发人员发现,云和边缘之间的可移植性受到限制,并且他们最终解决了相同的分布式系统问题,例如状态管理,弹性方法调用和事件处理。另外,许多编程运行时通常具有狭窄的语言支持和严格控制的功能集,这使得构建微服务体系结构具有挑战性。
为了使所有开发人员能够使用任何语言和框架轻松地构建便携式微服务应用程序,无论是编写新代码还是迁移现有代码,我们很高兴开源了 Dapr。
构建事件驱动,无状态和有状态的应用程序
例如,在构建包含多个服务的电子商务应用程序时,您可能希望使用有状态的 actor 来抽象购物车服务,并为支付和物流服务调用无状态函数。编写此应用程序可能需要使用多种语言,开发人员框架和基础架构平台,以及与外部服务集成。了解和管理如此复杂的技术堆栈会使开发人员无法专注到核心业务上。
Dapr:云和边缘计算的微服务构件
Dapr 是一个开源,可移植的,事件驱动的运行时,使开发人员可以轻松构建在云和边缘上运行的弹性,微服务架构的无状态和有状态应用程序。Dapr 包含所有编程语言和开发人员框架,并简化了构建应用程序(例如电子商务示例)的过程。
Dapr 包含了一些构建,这些构件通过标准 HTTP 或 gRPC API 访问,所以支持各种编程语言。这些构件为所有开发人员提供了行之有效的行业最佳实践,并且每个构件都是独立的。您可以在应用程序中使用其中的一个或多个。此外,通过开源项目,我们欢迎社区添加新的构建基块,并将新的组件贡献到现有的组件中。Dapr 完全与平台无关,这意味着您可以在任何 Kubernetes 集群以及与 Dapr 集成的其他托管环境中本地运行应用程序。这使开发人员能够构建无需更改代码即可在云和边缘上运行的微服务应用程序。
Dapr 构件目前处于 Alpha 状态
架构和构建微服务应用程序时需要许多功能。在 Dapr 的第一个开源 alpha 版本中,我们专注于提供一些最常用的构建块。
- 服务调用 – 弹性的服务到服务调用使方法调用(包括重试)可以在支持的托管环境中运行的任何远程服务上进行。
- 状态管理 – 通过对键 / 值对的状态管理,可以轻松地编写长期运行,高可用的有状态服务以及同一应用程序中的无状态服务。状态存储是可插拔的,并且可以包括 Azure Cosmos 或 Redis,以及组件路线图上的其他内容(例如 AWS DynamoDB)。
- 在服务之间发布和订阅消息传递 – 采用事件驱动的体系结构解决服务之间发布事件和订阅主题,以简化水平可伸缩性并使它们能够应对故障。
- 事件驱动的资源绑定 – 资源绑定和触发器通过在事件驱动的体系结构上进一步构建规模,从而通过从任何外部资源(例如数据库,队列,文件系统,blob 存储,webhooks 等)接收事件或向其发送事件来实现规模和弹性。例如,可以触发代码通过 Azure EventHub 服务上的消息,然后将数据写入 Azure CosmosDB。
- 虚拟 atcor – 种无状态和有状态对象的模式,通过方法和状态封装使并发变得简单。Dapr 在其虚拟 actor 运行时中提供了许多功能,包括并发,状态,用于 actor 激活 / 停用的生命周期管理以及计时器和提醒以唤醒 actor。
- 服务间的分布式追踪 – 使用 W3C Trace Context 标准轻松诊断和观察生产中的服务间调用,并将事件推送到跟踪和监视系统。
用于可移植性和可扩展性的标准 API
那么,您如何使用这些 Dapr 构建块?例如,假设您正在已部署到 Kubernetes 群集中的微服务应用程序中使用 Azure Functions 运行时,并且您希望利用 pub / sub 模式在服务之间发送消息。如今,Azure Functions 运行时尚未内置此功能,但是通过在 http 上使用 Dapr pub / sub 构建块,可以轻松添加此新功能。您拥有新的开发人员力量!
此外,Dapr 发布 / 订阅构建块具有可插入的组件模型,这意味着您可以动态选择不同的实现方式来发送消息,而无需更改任何代码。例如,您可以根据自己的喜好选择 Redis,Kafka 或 Azure Service Bus 发布 / 订阅 Dapr 组件。而且在两种情况下,代码都保持不变,包括使用标准 API 在不同支持的基础架构之间可移植。
为了同时实现可移植性和与现有代码的轻松集成,Dapr 通过 http 或 gRPC 提供了标准 API。与 pub / sub 示例保持一致,下面的节点代码显示如何使用“http:// <myappaddress> / dapr / subscribe”端点订阅名为“A”和“B”的主题,然后在何时通知您的应用程序消息将发布到这些主题。
为了进行比较,这是使用从 ASP.NET Core CreateWebHostBuilder()调用的 UseStartup()处理程序以 C#编写的相同代码。
向订阅了这些主题的服务发布事件就像使用主题名称和有效负载调用 Dapr 本地 http publish API 一样简单。下面的示例节点代码显示了如何使用 Dapr 发布 API(在本地端口 3500 上),也可以使用 curl 命令来完成此操作:
如这些示例所示,在您的服务中使用 Dapr 不需要获取编译时间依赖性,仅需简单地使用消息主体编写 URL 即可。
Sidecar 架构和支持的基础架构
Dapr 将其 API 作为 Sidecar 体系结构(容器或进程)公开,不需要应用程序代码包含任何 Dapr 运行时代码。这使得与 Dapr 的集成易于与其他运行时集成,并提供了应用逻辑的分离,从而提高了可支持性。
在 Kubernetes 这样的容器托管环境中,Dapr 可以作为边车容器运行,而应用程序容器位于同一容器中:
Dapr 的 CLI 可以使入门变得容易,并包括支持在开发机器,任何 Kubernetes 集群(包括 minikube)以及其他基础设施平台(如 IoT Edge)和路线图上的 Service Fabric 上本地运行。开始使用 Dapr,如下:
dapr init (for local deployment)
dapr init --kubernetes (for Kubernetes deployment)
开发人员语言 SDK 和框架
为了使 Dapr 对于不同的语言更加自然,它还包括针对 Go,Java,JavaScript,.NET 和 Python 的语言特定的 SDK。这些 SDK 通过类型化的语言 API(而不是调用 http / gRPC API)公开了 Dapr 构建块中的功能,例如保存状态,发布事件或创建 actor。这使开发人员可以使用他们选择的语言编写无状态和有状态功能以及参与者的组合。并且由于这些 SDK 共享 Dapr 运行时,您甚至可以获得跨语言的 actor 和功能支持!
此外,Dapr 还可以与任何开发人员框架集成。例如,在 Dapr .NET SDK 中,您将找到 ASP.NET Core 集成,该集成带来了可响应其他服务的发布 / 订阅事件的状态路由控制器,从而使 ASP.NET Core 成为构建微服务 Web 应用程序的更好框架。
了解更多
您可以在 http://dapr.io 上阅读有关 Dapr…,并在 https://github.com/dapr/dapr…。