过去几年以来,越来越多的开发人员开始利用托管服务部署并运行自己构建出的可扩展云原生应用程序。这种趋势,也代表着新一波变革浪潮的来临。通过这种转变,微服务架构已经成为云原生应用程序的架构标准;根据估算,到2022年, 将有九成新型应用程序采用微服务架构 。微服务架构带来一系列切实可见的收益,包括规模伸缩能力、松散服务耦合以及独立部署等等。但这种方法成本很高,要求开发者了解并熟悉关于分布式系统的各类特性。
开发人员希望专注于业务逻辑,以高频度增量方式迁移遗留代码,同时依靠平台为应用程序提供必要的规模、弹性、可维护性、容错性以及其他云原生架构属性支持。但开发人员们发现,云与边缘位置之间的可移植性总面临着种种限制,并导致他们不得不把节约出来的精力浪费在其他分布式系统问题身上——包括状态管理、弹性方法调用以及事件处理等等。另外,大部分编程运行时所支持的语言数量有限且功能集存在严格约束,这使得微服务架构的构建工作变得极具挑战性。
为了确保所有开发人员都能够利用任意编程语言及框架轻松构建起可移植的微服务应用程序——包括编写新代码以及迁移现有代码——我们正式请出今天的主角:Dapr。
举例来说,在构建包含多项服务的电子商务应用程序时,大家可能希望使用有状态服务表示购物车功能,同时通过无状态服务实现付款与配送功能。编写这类应用程序往往需要使用多种语言、开发者框架以及基础设施平台,同时还必须与外部服务相集成。了解及管理如此复杂的技术栈需要占用大量时间与精力,导致开发人员无暇建立真正的商业价值。
为了确保所有开发人员都能够利用任意编程语言及框架轻松构建起可移植的微服务应用程序——包括编写新代码以及迁移现有代码——我们正式请出今天的主角:Dapr。
Dapr是一套开源可移植事件驱动型运行时,能够帮助开发人员轻松构建起能够运行在云端及边缘位置的高弹性、微服务、无状态/有状态应用程序。Dapr当中包含多种编程语言与开发者框架,同时显著简化了应用程序(例如示例中提到的电子商务应用)的构建流程。
Dapr由一系列可通过标准HTTP或gRPC API由任意编程语言调用的基础构建单元组成。这些构建单元为开发人员提供行之有效的行业最佳实践,且各个组件之间彼此独立,供您根据需求任意选用。此外,Dapr属于开源项目,因此欢迎技术社区为项目添加新的构建单元或者贡献新的组件。Dapr具有全面的平台中立性,大家可以在任意Kuberenetes以及与Dapr集成的其他托管环境当中实现应用程序的本地运行。如此一来,开发人员即可快速构建起无需变更代码即顺畅运行在云端及边缘位置上的微服务应用程序。
经由标准API调用Dapr构建单元,开发人员即可使用任意语言及框架构建应用程序:
在对微服务应用程序进行架构设计与构建时,需要使用多种功能。在Dapr的 首个开源alpha版本 当中,我们致力于提供一些最为常用的构建单元。
那么,我们要如何使用这些Dapr构建单元?举例来说,假设大家正在使用一款已经部署在Kubernetes集群中的微服务应用程序内的 Azure Functions运行时 ,且希望利用发布/订阅模式在不同服务之间传递消息,具体该怎样操作?目前,Azure Functions运行时尚不提供内置消息传递功能,但利用Dapr发布/订阅构建单元,大家完全可以经由http轻松实现这项新功能。领先一步,就这么简单!
此外,Dapr发布/订阅构建单元还提供一套可插拔组件模式,意味着大家可以动态选择不同的消息发送方式,且无需进行任何代码修改。举例来说,您可以根据喜好或需求随意选择Redis、Kafka或者Azure Service Bus作为Dapr发布/订阅组件。无论如何选择,您的代码都不会受到影响,消息收发机制本身可利用标准API在不同受支持基础设施之间直接移植。
为了同时实现可移植性以及与现有代码的轻松集成,Dapr通过http或gRPC提供标准API。与发布/订阅示例一样,以下节点代码所示为如何使用“ http://<myappaddres s>/dapr/subscribe”端点订阅名称为“A”和“B”的主题,同时在这些主题收到新消息时向您的应用程序发出通知。
作为比较,以下为使用UseStartup()处理程序从ASP.NET Core CreateWebHostBuilder()处调用的C#代码。
经由各个主题向已订阅服务发布事件,就像使用主题名称及载荷调用Dapr本地http发布API一样简单。以下节点代码示例即为如何利用Dapr发布API(本地端口3500)实现发布,当然大家也可以使用curl命令达成同样的效果:
根据以上示例,在服务中使用Dapr并不涉及编译时间依赖性,只需要直接利用消息正文构建URL即可。
Dapr将其API作为Sidecar架构以容器或者进程的形式公开,因此不需要在应用程序代码当中包含任何Dapr运行时代码。正因为如此,Dapr能够轻松与其他运行时相集成,同时通过应用程序逻辑分离显著提高了支持能力。
Dapr以side-car进程的形式运行:
在Kubernetes等容器托管环境内,Dapr以side-car容器的形式运行在应用程序容器所在的Pod当中。
Dapr以side-car容器的形式运行在Kubernetes Pod当中:
Dapr的CLI使得上手体验更轻松,同时支持在开发者自有设备、任意Kubernetes集群(包括minikube),以及IoT Edge、Service Fabric等现有或即将推出的基础设施平台之上运行。要开始您的Dapr之旅,只需要运行:
dapr init (本地部署) dapr init --kubernetes (Kubernetes部署)
为了让Dapr更广泛地支持更多不同语言,我们在项目中为Go、Java、JavaScript、.NET以及Python提供了对应的SDK。这些SDK通过类型化语言API(而非调用http/gRPC API)在Dapr构建单元当中开放各项功能,包括保存状态、发布事件或者创建actor等等。这意味着开发人员能够轻松利用自己熟悉的语言编写出无状态与有状态功能/actor组合。另外,由于这些SDK共享同一Dapr运行时,因此大家甚至能实现跨语言actor与功能支持!
此外,Dapr也能够被集成至任意开发者框架。例如,在Dapr .NET SDK当中,大家能够找到负责引入stateful路由控制器以响应其他服务事件发布/订阅操作的Dapr .NET SDK。如此一来, ASP .NET Core 在构建微服务Web应用程序方面的表现将得到大幅增强。
我们拥有众多合作伙伴(包括 Willow 、 Geek+ ),并共同努力在云端及边缘设备上构建解决方案。感兴趣的朋友请关注我们即将召开的 Ignite大会 。Dapr运行时以及SDK的此次初始发布版本只是个开始,我们的目标在于确保Dapr成为一套供应商中立性质的开放治理与协作平台。这是一段漫长的旅程,但我们将为之不懈努力。当然,我们也需要您的帮助与反馈。在这里,我们诚挚邀请大家编写新的资源整合绑定组件、提出关于新构建单元的建议或者为您所喜爱的语言(比如Cobol)创建SDK。期待您的参与!
大家可以通过 http://dapr.io 了解更多关于Dapr的细节信息,通过 https://github.com/dapr/dapr 获取代码与入门示例,并通过 gitter.im/Dapr 或者Twitter @daprdev 获取更多信息。
在这个微服务开发的新时代,每一位开发者都面对着前所未有的宝贵机遇。我们也期待看到在各位朋友的参与及支持之下,Dapr项目将走向何处、构建出怎样的成果以及呈现出怎样的发展势头。
原文链接: Announcing Dapr, an open source project to make it easier for every developer to build microservice applications