一起学Dapr云原生开发

  团队介绍

我们是光大科技智能云计算部智能化平台团队Devops项目组,专注于金融传统行业研发效能的提升和快速交付。通过自动化技术的应用,以及敏捷协同管理工具链的研发,助力金融传统行业Devops落地。团队拥有Devops领域经验丰富的研发工程师和专家,将不定期分享敏捷领域的原创文章,共同探索Devops落地最佳实践。

如今,软件不仅深刻改变了企业与市场的互动方式,也改变了企业创新与竞争的方式。因此,快速开发交付已经成为科技企业的必备能力,云原生开发是实现这种能力并取得优势的必经之路。

提到云原生,所有人想到的都是各种中间件、复杂服务间调用,难学会、难开发。我们需要一种工具,它以开发者为中心,让云原生开发变简单,甚至比非云原生还简单。

Dapr就是这样一款工具,它能够简化云原生应用开发,让开发者专注于核心逻辑,保持代码简单、可移植,构建出事件驱动的、弹性的分布式应用。无论在私有云、公有云还是在边缘设备上,Dapr都能帮助你应对构建微服务过程中的挑战,并保持代码对平台无感。

01

Dapr是什么?

官方定义

Dapr是一套可移植的、事件驱动的运行时环境,它能让开发者轻松构建运行于云端或边缘的弹性的无状态/有状态应用。Dapr拥抱语言多样性和开发框架多样性。

看完这个定义感觉还是有种云雾缭绕的感觉。为了更好理解,我们还是要从Dapr的基础概念切入。

02

构造块

在Dapr中,一个构造块就是一组基于HTTP或gRPC的API,开发者可以从代码中调用这些API。每个构造块会使用若干个Dapr组件。

(组件是要介绍的第2个概念,见下文)

一起学Dapr云原生开发

图1、构造块(来源于Dapr官网)

构造块用于解决构建弹性微服务应用中各种常见挑战,并将对应的最佳实践和模式代码化。Dapr内置了一组构造块(图2),为了更直观地理解构造块概念,接下来我们要走近这些内置构造块来看看。

一起学Dapr云原生开发

图2、Dapr内置的构造块(图片来源:Dapr官网)

构造块 作用
服务间调用
让应用通过公开的端点以http或gRPC消息的方式相互通信。

Dapr提供了一个端点,这个端点相当于内建了服务发现、分布式跟踪、错误处理的反向代理。

状态管理

应用状态是指一个应用希望保存下来的、在单个会话之外的任何数据。Dapr提供了一个基于K/V的状态API,并带有可插拔的持久化状态存储。

发布和订阅

发布订阅模式是一种松耦合的消息传递模式。在这种模式下,发送者(发布者)向订阅者所订阅的某个主题发布消息。Dapr为应用之间提供了发布/订阅模式。

资源绑定

一个绑定提供了一个到外部云端/私有服务或系统的双向连接。Dapr允许你通过Dapr绑定API调用外部服务,并允许你的应用被所连接的服务发送的事件进行触发。

操作者
(actor)

一个操作者是一个隔离的、独立的单线程执行的计算和状态单元。Dapr提供了一套基于虚拟Actor模式的actor实现,它提供了单线程编程模型,并且当actors不使用时会被垃圾回收。

可观察性

Dapr系统组件和运行时会分发数据指标、日志、跟踪,以便调试、运维和监控Dapr的系统服务、组件以及用户应用。

密文

Dapr提供了一个密文构造块API,并集成了Azure Key Vault和Kubernetes等密文存储来储存密文。服务代码可以调用密文API来从Dapr所支持的密文存储中检索密钥。

03

组件

Dapr采用了模块化的设计,所有能力会以组件为单元进行交付。在Dapr中,每个组件都具有一个接口定义,而所有组件都是可插拔的,你可以将一个组件切换成具有相同接口的另一组件。比如,可以将基于Kafka的发布订阅组件无缝地切换成基于Redis Stream的发布订阅组件,而这个切换过程无需修改应用代码。

一个构造块可以将各种组件进行任意组合使用,在上文介绍构造块时已经略有涉及。下面我们会进一步介绍这些组件。

组件 作用
状态仓库组件

状态仓库组件是用来存储键/值对的数据存储(比如数据、文件、内存),是状态管理构造块的一部分。

服务发现组件

服务调用构造块使用这个组件来集成到托管环境来提供服务到服务的发现。比如Kubernetes服务发现组件集成了Kubernetes DNS服务,自托管使用mDNS。

中间件组件

Dapr允许将自定义中间件被接入到请求处理管道中。中间件可以对请求进行额外的操作,比如进行鉴权、加密和在请求被路由到用户代码之前或返回给客户端之前进行消息转换。

发布/订阅代理组件

发布/订阅代理组件是消息代理,能够将消息从一个服务传递到另一个服务。该组件是发布订阅构造块的一部分。

绑定组件

外部资源能够连接到Dapr来触发某个服务或被某个服务调用。这个组件是绑定构造块的一部分。

密文存储组件

在Dapr中,一条密文是指你不想给别人看到的一条私密信息。密文存储用于储存服务可以检索并使用的密文。

04

配置

通过Dapr的设置,让你可以改变单个Dapr应用的行为或Dapr控制平面上所有系统服务的行为。Dapr采用了配置即代码的方式,所有的配置都可以通过一个YAML文件加以定义和部署。

下面这个配置文件设置了遥测记录的追踪功能。对于自托管的方式,你可以直接修改.dapr目录下的的默认配置文件config.yaml文件,或者用kubectl/helm将它应用到Kubernetes集群。

一起学Dapr云原生开发

图3、Dapr配置文件用例

05

可观察性

构建应用时,理解系统行为是运营系统重要的组成部分——其中就包括观察应用的内部调用、衡量其表现,并当问题发生即刻知晓。这对任何系统来说都是有挑战的,而对于多个微服务组成的分布式系统更甚,一个流程会由多次调用组成,从一个微服务开始,然后传递到另一个。可观测性对生产环境至关重要,而对于开发环境理解瓶颈、提升性能和执行跨微服务的基本调试也很有用。

尽管一个应用相关的某些数据可以通过更底层的基础设施(比如内存消耗、CPU使用)进行收集,但其他有意义的信息必须从“应用感知”层面进行收集——可以展示一系列重要的跨微服务调用。这通常意味着开发者必须向应用中引入一些度量代码来实现这个目的。通常,度量代码只将跟踪和指标这些所收集到的数据发送给能够进行存储、可视化和分析这些信息的外部工具或服务,比如跟踪和指标。

这些代码并不是应用的核心逻辑,但开发人员不得不对其进行维护,经常还需要开发者理解监控工具的API、使用额外的SDK等,这会带来额外的负担。这些度量也会给应用的可移植性带来挑战,必须根据应用程序所部署的环境采用不同的度量。比如,不同的云厂商提供了不同的监控方案,而私有化部署可能需要私有化方案。

Dapr对应用的可观察性

如果用Dapr构造块进行服务间调用和发布/订阅消息,就可以利用Dapr提供的分布式跟踪。应用的内部服务通信都会流经Dapr的sidecar,所以sidecar处于能够让应用层度量减负的特殊位置上。

分布式跟踪

Dapr可以通过配置进行跟踪数据分发。由于Dapr使用了Zipkin等被广泛使用的协议,所以可以轻松与多种监控后台集成。

一起学Dapr云原生开发

图4、Dapr的分布式跟踪(图片来源:Dapr官网)

开发遥测采集器

Dapr可以配置使用OpenTelemetry Collector,而OpenTelemetry对外部监控工具提供了更多的兼容性。

一起学Dapr云原生开发

图5、Dapr和OpenTelemetry Collector配合使用(图片来源:Dapr官网)

跟踪上下文

Dapr的追踪上下文使用W3C Tracing标准规范,既能够自行生成和传递上下文头,又传递用户提供的上下文头。

Dapr自身的可观测性

和系统的其他部分一样,你需要能够对Dapr自身进行观察。Dapr允许你收集Dapr sidecar运行微服务时所分发的指标和日志,还允许你收集Dapr服务(比如启用了Dapr的Kubernetes集群中的控制平面服务)产生的指标和日志。

日志

Dapr会通过生成日志的方式为sidecar的运营提供能见度,帮助用户识别问题并进行调试。日志事件包括由Dapr系统服务所产生的警告、错误、信息、调试信息。

Dapr还可以配置成向采集器(比如Fluentd、Azure Monitor)发送日志,以便能够轻松进行日志搜索、分析并获得洞见。

指标

指标是运行过程中不断被采集和存储的一系列度量值或度量计数。Dapr指标提供了用于了解Dapr sidecar和系统服务的监控能力:

·Dapr sidecar和用户应用之间的指标展示了调用延迟、失败流量、请求错误率等

·Dapr系统服务指标展示了sidecar注入失败和系统服务健康情况,比如CPU利用率、actors放置数等

健康检查

Dapr sidecar为健康检查暴露了HTTP端点。通过该API,用户代码或宿主环境可以探测该Dapr sidecar,来判断它的状态、并识别sidecar存在的问题。

06

Dapr中的一些术语和定义

术语 定义

应用

一个运行着的服务/二进制可执行文件,通常是你(Dapr用户)创建并运行的。

构造块

Dapr提供给用户的一套API,用来帮助用户创建微服务和应用。

组件

各种底层能力类型的模块,既可以单独使用,可以被构造块结合其他一系列组件使用。

配置

一个YAML文件,声明了Dapr sidecar或Dapr控制平面的所有配置。你可以在其中配置控制平面的mTLS设置、或者配置一个应用实例的中间件设置。

Dapr

分布式应用运行时的缩写(Distributed Application Runtime)。

Dapr控制面板

Dapr安装在宿主平台(比如Kubernetes集群)上的一系列服务。它允许使用了Dapr的应用运行在该平台上,并享用Dapr的能力,比如actor放置、Dapr sidecar注入、证书下发和延期等。

自托管

你可以使用Dapr运行应用的Windows/macOS/Linux机器。Dapr提供了以“自托管”模式运行在机器上的能力。

服务

一个运行着的应用或二进制可执行文件。一般指你的应用或某个Dapr应用。

Sidecar

这是个程序,会陪伴着你的应用运行,不过它运行在一个单独的进程或容器中。

Dapr通过构造块和组件让开发者无需让代码适配不同的平台和基础设施,更专心地编写出可移植、聚焦业务逻辑的代码。

作者:   李淳

往期回顾

初识对象存储MinIO

Clickhouse实战之分布式集群方案

浅谈FTP协议

统一监控管理平台Prometheus驱动的实现

扫码关注我们


微信公众号     EBCloud

原创文章,作者:EBCloud,如若转载,请注明出处:https://www.sudun.com/ask/32935.html

(0)
EBCloud's avatarEBCloud
上一篇 2024年4月2日 下午3:29
下一篇 2024年4月2日 下午3:29

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注