Dapr,一个可以让每一个开发人员更轻松地构建微服务应用程序的开源项目

使人惊讶的是,在过去几年中,愈来愈多的开发人员转向利用托管服务来部署和运行可扩展的云原生应用程序。经过这种转变,微服务架构已成为构建云原生应用程序的标准,而且能够预见,到2022年,将有90%的新应用程序采用微服务架构。微服务架构提供了使人信服的好处,包括可伸缩性,松散的服务耦合和独立部署,可是这种方法的成本很高,须要了解和熟练掌握分布式系统。git

开发人员但愿专一于业务逻辑,频繁且增量地迁移遗留代码,同时依靠平台为应用程序提供所需的规模,弹性,可维护性,以及云原生架构的其余属性。可是,开发人员发现,云和边缘之间的可移植性受到限制,而且他们最终解决了相同的分布式系统问题,例如状态管理,弹性方法调用和事件处理。另外,许多编程运行时一般具备狭窄的语言支持和严格控制的功能集,这使得构建微服务体系结构具备挑战性。github

为了使全部开发人员可以使用任何语言和框架轻松地构建便携式微服务应用程序,不管是编写新代码仍是迁移现有代码,咱们很高兴开源了Dapr。web

构建事件驱动,无状态和有状态的应用程序数据库

例如,在构建包含多个服务的电子商务应用程序时,您可能但愿使用有状态的actor来抽象购物车服务,并为支付和物流服务调用无状态函数。编写此应用程序可能须要使用多种语言,开发人员框架和基础架构平台,以及与外部服务集成。了解和管理如此复杂的技术堆栈会使开发人员没法专一到核心业务上。编程

micro-app1.png

Dapr:云和边缘计算的微服务构件架构

Dapr是一个开源,可移植的,事件驱动的运行时,使开发人员能够轻松构建在云和边缘上运行的弹性,微服务架构的无状态和有状态应用程序。 Dapr包含全部编程语言和开发人员框架,并简化了构建应用程序(例如电子商务示例)的过程。并发

Dapr包含了一些构建,这些构件经过标准HTTP或gRPC API访问,因此支持各类编程语言。这些构件为全部开发人员提供了行之有效的行业最佳实践,而且每一个构件都是独立的。您能够在应用程序中使用其中的一个或多个。此外,经过开源项目,咱们欢迎社区添加新的构建基块,并将新的组件贡献到现有的组件中。 Dapr彻底与平台无关,这意味着您能够在任何Kubernetes集群以及与Dapr集成的其余托管环境中本地运行应用程序。这使开发人员可以构建无需更改代码便可在云和边缘上运行的微服务应用程序。app

dapr.jpg

Dapr构件目前处于Alpha状态框架

架构和构建微服务应用程序时须要许多功能。在Dapr的第一个开源alpha版本中,咱们专一于提供一些最经常使用的构建块。curl

  • 服务调用 - 弹性的服务到服务调用使方法调用(包括重试)能够在支持的托管环境中运行的任何远程服务上进行。
  • 状态管理 - 经过对键/值对的状态管理,能够轻松地编写长期运行,高可用的有状态服务以及同一应用程序中的无状态服务。状态存储是可插拔的,而且能够包括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”的主题,而后在什么时候通知您的应用程序消息将发布到这些主题。

dapr-js.jpg

为了进行比较,这是使用从ASP.NET Core CreateWebHostBuilder()调用的UseStartup()处理程序以C#编写的相同代码。

dapr-net.jpg

向订阅了这些主题的服务发布事件就像使用主题名称和有效负载调用Dapr本地http publish API同样简单。下面的示例节点代码显示了如何使用Dapr发布API(在本地端口3500上),也可使用curl命令来完成此操做:
dapr-curl.jpg

如这些示例所示,在您的服务中使用Dapr不须要获取编译时间依赖性,仅需简单地使用消息主体编写URL便可。

Sidecar架构和支持的基础架构
Dapr将其API做为Sidecar体系结构(容器或进程)公开,不须要应用程序代码包含任何Dapr运行时代码。这使得与Dapr的集成易于与其余运行时集成,并提供了应用逻辑的分离,从而提升了可支持性。

Dapr running as a side-car process

在Kubernetes这样的容器托管环境中,Dapr能够做为边车容器运行,而应用程序容器位于同一容器中:

Dapr running as a side-car container in a Kubernetes pod

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

相关文章
相关标签/搜索