温故知新,.Net Core遇见Dapr,为云原生而生的应用运行时

什么是云原生云原生技术有利于各组织在公有云、私有云和混合云等新型动态环境中,构建和运行可弹性扩展的应用。云原生的代表技术包括容器、服务网格、微服务、不可变基础设施和声明式API。这些技术能够构建容错性好...

什么是云原生

云原生技术有利于各组织在公有云、私有云和混合云等新型动态环境中,构建和运行可弹性扩展的应用。云原生的代表技术包括容器、服务网格、微服务、不可变基础设施和声明式API。

这些技术能够构建容错性好、易于管理和便于观察的松耦合系统。结合可靠的自动化手段,云原生技术使工程师能够轻松地对系统作出频繁和可预测的重大变更。

云原生计算基金会(CNCF)致力于培育和维护一个厂商中立的开源生态系统,来推广云原生技术。我们通过将最前沿的模式民主化,让这些创新为大众所用。

什么是Dapr

Dapr(Distributed Application Runtime)分布式应用运行时,是一个可移植的、事件驱动的运行时,它使任何开发人员能够轻松构建出弹性的、无状态和有状态的应用程序,并可运行在云平台或边缘计算中,它同时也支持多种编程语言和开发框架。

Any language, any framework, anywhere

如今,我们正经历着上云浪潮。开发人员对Web+数据库应用结构(例如经典3层设计)非常熟悉,并且使用得手,但对本身能支持分布式的微服务应用结构却感觉陌生。成为分布式系统专家很难,并且你也不需要这么做。开发人员希望专注于业务逻辑,同时希望平台为其提供可伸缩的、弹性的、可维护性和云原生架构的其他功能。

这就是Dapr所要解决的。Dapr将构建微服务应用的最佳实践设计成开放、独立和模块化的方式,让你能够选择的任意开发语言和框架构建可移植应用程序。每个构建块都是完全独立的,您可以采用其中一个或多个或全部来构建你的应用。

此外,Dapr是和平台无关的,这意味着您可以在本地、Kubernetes群集或者其它集成Dapr的托管环境中运行应用程序。这使得您能够在云平台和边缘计算中运行微服务应用。

使用Dapr,您可以使用任何语言、任何框架轻松构建微服务应用,并运行在任何地方。

Dapr托管方式

Dapr可以托管在多种环境中,包括用于本地开发的自托管,或部署到一组VM、Kubernetes和边缘环境(如AzureIoTEdge)。

自托管

在自托管模式下,Dapr作为单独的sidecar进程运行,服务代码可以通过HTTP或gRPC调用该进程。在自托管模式下,您还可以将Dapr部署到一组VM上。

Dapr可以配置为在开发人员本地计算机上以自托管模式运行。每个运行的服务都有一个Dapr运行时进程(或sidecar),配置为使用状态存储,pub/sub,绑定组件和其他构建块。

您可以使用DaprCLI在本地机器上运行启用了Dapr的应用程序。

Kubernetes托管

在容器托管环境(如Kubernetes)中,Dapr作为sidecar容器运行,和应用程序容器在同一个pod中。

Dapr可以配置为在任何Kubernetes集群上运行。在Kubernetes中,dapr-sidecar-injector和dapr-operator服务提供一流的集成,以将Dapr作为sidecar容器启动在与服务容器相同的pod中,并为在集群中部署的Dapr组件提供更新通知。

dapr-sentry服务是一个认证中心,它允许Daprsidecar实例之间的相互TLS进行安全数据加密。

Dapr与Istio、Linkerd或OSM等服务网格相比如何?

Dapr不是一个服务网格。虽然服务网侧重于细粒度网络控制,但Dapr专注于帮助开发人员构建分布式应用程序。Dapr和服务网都使用sidecar模式,并随应用程序一起运行,它们确实具有一些重叠的功能,但也提供独特的优势。

虽然Dapr和服务网格确实提供了一些重叠功能,但dapr不是服务网格,其中服务网格被定义为网络的服务网格。与专注于网络问题的服务网格不同,Dapr专注于提供构建基块,使开发人员更容易将应用程序构建为微服务。Dapr以开发人员为中心,而服务网格以基础设施为中心。

在大多数情况下,开发人员不需要意识到他们正在构建的应用程序将部署在包括服务网格在内的环境中,因为服务网格会拦截网络流量。服务网格主要由系统操作员管理和部署。但是,Dapr构建块API旨在供开发人员在其代码中明确使用。

Dapr与服务网格共享的一些常见功能包括:

  • 使用mTLS加密实现安全的服务到服务通信
  • 服务到服务指标集合
  • 服务到服务分布式跟踪
  • 通过重试获得可恢复能力

重要的是,Dapr通过以开发人员为中心的关注点提供服务发现和调用。这意味着,通过Dapr的服务调用API,开发人员在服务名称上调用一种方法,而服务网格则处理网络概念,如IP和DNS地址。但是,Dapr不为路由或流量拆分等流量行为提供功能。流量路由通常使用应用程序的入口代理处理,并且不必使用服务网格。此外,Dapr还为状态管理、发布/订阅、Actor等提供了其他应用级别的构建块。

Dapr和服务网之间的另一个区别是可观察性(跟踪和指标)。服务网格在网络级别运行,并跟踪服务之间的网络调用。Dapr通过服务调用来达到此操作,但Dapr也使用写入CloudEvents信封的跟踪Id在发布/订阅调用上提供可观察性(跟踪和指标)。这意味着Dapr的指标和跟踪比使用服务到服务调用和发布/订阅进行通信的应用程序的服务网格更为广泛。

下图捕获Dapr和服务网格提供的重叠功能和独特功能:

Dapr构建块

Building Block构建块是可以从您的代码中调用的HTTP或gRPCAPI,并且由一个或多个Dapr组件组成。

构建块解决了构建弹性微服务应用程序中的常见挑战,并编纂了最佳实践和模式。Dapr由一组构建块组成,并且具有可扩展性以添加新的构建块。

下图显示了构建块如何公开了可被代码调用的公共API,并使用组件来实现构建块的能力。

以下是Dapr提供的构建块类型:

每个构建块都是独立的,这意味着您可以采用其中一个或多个或全部来构建应用。在当前Dapr的初始版本中,提供了以下构建块:

构建块 描述
服务间调用 弹性的服务间调用能在远程服务上进行方法调用(包括检索),无论它们是否位于受支持的托管环境中的。
状态管理 对于存储键/值对的状态管理,长时间运行,高可用性,有状态服务可轻松写入应用程序中的无状态服务。状态存储是可插拔的,可以包括AzureCosmosDB,AzureSQLServer,PostgreSQL,AWSDynamoDB或Redis等。
发布订阅 发布活动并订阅主题
资源绑定 带触发器的资源绑定通过接收和发送事件到任何外部源(如数据库、队列、文件系统等)来进一步构建事件驱动架构,以实现扩展性和弹性。
Actors 一种用于有状态和无状态对象的模式,通过方法和状态的封装让并发变得简单。Dapr在其actor运行时提供了很多能力,包括并发,状态管理,用于actor激活/停用的生命周期管理,以及唤醒actor的计时器和提醒器。
可观测性 Dapr可以发出度量,日志和跟踪以调试和监控Dapr和用户应用程序。Dapr支持分布式跟踪,通过使用W3C跟踪上下文标准和OpenTelemetry发送到不同的监控工具,以方便诊断和服务于生产中的服务间调用。
秘密 Dapr提供秘密管理,并与公有云和本地秘密存储集成,以检索秘密,用于应用代码。

Dapr对应的DotNet Core SDK

  • Dapr SDK for .NET
  • dapr.io by Nuget

参考

  • https://dapr.io/
  • https://cloudevents.io/
  • 云原生社区 Dapr 特别兴趣小组
  • The Cloud Native Computing Foundation (CNCF)
  • CNCF Cloud Native Definition v1.0
  • 分布式应用程序运行时介绍
  • Dapr微服务应用开发系列0:概述
  • Software Architecture and Design InfoQ Trends Report—April 2020
  • 构建块

本文标题为:温故知新,.Net Core遇见Dapr,为云原生而生的应用运行时