Dapr文档

 

一、什么是Dapr

1.什么是Dapr

Dapr的全称是 “Distributed Application Runtime”,即 “分布式应用运行时

Dapr 是一个可移植的、事件驱动的运行时,可运行在云平台或边缘计算中。支持多种编程语言和开发框架

Dapr支持多语言,并提供两种通信协议:Http、Grpc

 

2.优秀文档

官方文档:

https://docs.dapr.io/

官方文档:从两万米高空看Dapr

https://docs.microsoft.com/en-us/dotnet/architecture/dapr-for-net-developers/dapr-at-20000-feet

讲述dapr概念和ServiceMath

https://baijiahao.baidu.com/s?id=1716684155713957742&wfr=spider&for=pc

dapr实战

https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MjM5MTc4MDM1MQ==&action=getalbum&album_id=1800637212208742405&scene=173&from_msgid=2651734649&from_itemidx=2&count=3&nolastread=1#wechat_redirect

以官方文档为基础实战(入门)

https://www.cnblogs.com/chenyishi/category/2034531.html

3.Dapr的优缺点

开发人员习惯于 Web + 数据库应用架构(例如经典 3 层设计),但对天然支持分布式的微服务应用架构却感觉陌生。 成为分布式系统专家很难,并且你也不需要这么做。 开发人员希望专注于业务逻辑,同时希望平台为其提供可伸缩的、弹性的、可维护的和云原生架构的其他功能

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

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

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

Dapr 的核心是帮助降低分布式微服务应用程序固有的复杂性。 它基于构建基块 API 的概念而构建。 Dapr 构建基块公开常见的分布式应用程序功能,例如状态管理、服务到服务调用和发布/子消息传送。 Dapr 组件位于构建基块下面,并为每项功能提供具体实现。 应用程序通过配置文件绑定到各种组件。

  1. 服务调用
  2. 状态管理
  3. 发布订阅
  4. 资源绑定
  5. Actors
  6. 可观测性
  7. Secrets
  8. Dapr面板:dapr dashboard -p 9999 打开面板,并设置端口为 9999

Sidecar 概念

Dapr中,每个服务,每个运行的服务都会运行一个Sidecar,而Dapr的服务间通信,服务与各中间件的通信都通过Sidecar来通信,而我们的代码里只需要调用Dapr提供访问Sidecar的API,即可完成服务间通信,状态存储,服务监控等功能,完美地解决了传统架构中的代码侵入性问题。

二、服务调用-ServiceInvocation

1. 什么是服务调用

字面意思就是服务之间的调用,但是微服务调用中需要注意:反向代理、链路跟踪、服务的负载均衡、服务请求的熔断降级,这些都需要各种组件的支持。

2. Dapr的服务调用又有哪些优点与缺点

Dapr完美的解决了这些问题,而又不需要这么多组件配置,

在Dapr中增加了“Sidecar”的概念,每个服务都有一个Sidecar,所有的服务请求都通过Sidecar接收请求,Sidecar解决了以上服务的问题。

因为调用流经 sidecar,Dapr 可以注入一些有用的横切行为:

3. Dapr服务调用的工作原理

    1. 使用.net core 直接服务注册 DaprClient, 通过DaprClient 调用发送请求。也可以创建出HttpClient发送请求。

      http://localhost:/v1.0/invoke//method/

      • Dapr 正在侦听的 HTTP 端口。
      • 要调用的服务的应用程序 ID。
      • 要在远程服务上调用的方法的名称。

      通过DaprClient创建httpClient发送请求

      var httpClient = DaprClient.CreateInvokeHttpClient();

      await httpClient.PostAsJsonAsync("http://orderservice/submit", order);

      通过DaprClient发送请求

      var catalogItems = await daprClient.InvokeMethodAsync<IEnumerable>(HttpMethod.Get, "catalogservice", "items");

       

    2. 服务 Acatalog/items通过调用Service A Sidecar上的服务调用 API 来调用Service B 中的端点。 Sidecar 使用一个可插拔的名称解析组件来解析 Service B 的地址。在自托管模式下,Dapr 使用mDNS来查找它。在 Kubernetes 模式下运行时,由 Kubernetes DNS 服务确定地址。

    3. Service A Sidecar将请求转发给Service B Sidecar。

    4. Service B sidecar catalog/items向 Service B API 发出实际请求。

    5. Service B 执行请求并将响应返回给它的 sidecar。

    6. Service B Sidecar将响应转发回Service A Sidecar。

    7. Service A Sidecar将响应返回给Service A。

  1.  

三、Dapr状态管理-StateManagement

1. 什么状态管理

  1. 简单说就是服务请求是无状态的,当服务需要记录某些状态信息时,需要存储,Dapr简化了这些问题,

举例:用户登录后存储token信息,现保存到redis中每次请求携带redis中的token,就是有状态的。

Dapr状态管理,简化了第三方组件对代码的入侵。

2. Dapr状态管理的优缺点

    • 应用程序可能需要不同类型的数据存储
    • 访问和更新数据可能需要不同的一致性级别。
    • 多个用户可以同时更新数据,这需要解决冲突
    • 服务必须重试 与数据存储交互 时发生的任何短期暂时性错误。

Dapr 状态管理解决了这些难题。 它简化了跟踪状态,而无需依赖关系或第三方存储 SDK 上的学习曲线。

3. 怎么使用Dapr状态管理

  1. Dapr支持组件配置,配置的组件 位置为C:\Users<username>.dapr\components statestore.yaml

服务之间状态共享

例子:(此示例使用的统一的配置文件,如果需要单独使用配置文件,每个服务单独的配置文件中使用如下配置也是共享的,当name:keyPrefix为 null时则是全部服务的状态共享,不建议配置为null)

 

四、Dapr发布订阅-Publish&Subscribe

1. 什么是发布订阅

是一种众所周知且广泛使用的消息传递模式。架构师通常在分布式应用程序中采用它。但是,实现它的管道可能很复杂。不同的消息传递产品之间通常存在细微的功能差异。Dapr 提供了一个构建块,可以显着简化发布/订阅功能的实现。

2. Dapr的发布订阅解决了什么

在使用发布订阅时,消息插件有很多,原有的使用消息插件时,与项目的耦合性是很强的,当项目升级或需要更换消息插件时改动很大,Dapr的发布订阅,提供了开箱即用的消息抽象实现,仅需在dapr的 pubsub.yaml 中配置使用的消息中间件,设置参数消息参数,提高了灵活性,降低了代码的耦合性。

 

五、Dapr秘钥管理-SecretsManagement

1. 什么是秘钥管理

就是将原有的比如数据库连接字符串,redis连接字符串,等等,放入统一的配置文件中,由dapr的secrets去统一管理读取,

2. net中读取秘钥配置

Nuget插件:Dapr.Extensions.Configuration

 

六、Dapr绑定-Bindings

1. 什么是绑定

简单说就是个回调

处理外部事件或调用外部接口的功能就是绑定,绑定可以提供以下好处:

Dapr提供了很多支持的绑定,请见绑定。绑定分为输入绑定输出绑定,输入绑定是监听外部事件,触发业务逻辑。输出绑定是调用外部资源。

绑定可能与前面介绍的发布订阅类似。 尽管它们很相似,但也有不同之处。 发布/订阅侧重于 Dapr services 之间的异步通信。 资源绑定具有更大的范围。 它侧重于软件平台之间的系统互操作性。 在不同的应用程序、数据存储和微服务应用程序之外的服务之间交换信息。

2. 绑定原理

Dapr 资源绑定需要通过yaml文件定义绑定组件。 此 YAML 文件描述要与其绑定的资源类型。 配置后,你的服务可以接收来自资源的事件或触发事件。

3. 绑定的作用

Dapr资源绑定使你的服务能够与外部的资源进行集成业务操作。 来自外部系统的事件可能会触发服务中传递上下文信息的操作。 然后,你的服务可以通过在另一个外部系统中触发事件,传入上下文有效负载信息来扩展操作。 你的服务在没有耦合或感知外部资源的情况下进行通信。 管道封装在预定义的Dapr组件中。 可以在运行时轻松地交换要使用的Dapr组件,而无需更改代码

简单一句话:就是降低耦合性,提高灵活性,随时更换组件。

 

七、Dapr可观测性-Observability

1. 什么是可观测性

Dapr 使用 Zipkin 协议进行分布式跟踪和指标收集。 由于 Zipkin 协议无处不在,许多后端被开箱即用,例如 Stackdriver、 Zipkin、 New Relic 等。 与 OpenTelemetry 收藏器组合,Dapr 可以导出跟踪到许多其他后端,包括但不局限于 Azure Monitor Datadog, Instanca, Jaeger, and SignalFX

2. 优点

Dapr 将 HTTP/GRPC Middleware 添加到 Dapr sidecar。 Middleware 拦截所有 Dapr 和应用程序流量,并自动注入关联ID以跟踪分布式事务。 此设计有如下优点:

八、Dapr演员-Actors

 

 

九、Dapr组件

组件官方地址:

https://docs.dapr.io/concepts/components-concept/

1. 限流

因使用dapr后所有请求都是先经过sidecar中,所以限流中间件也在配置中引用。

在config.yaml中引用组件

2. 熔断

dapr熔断配置文档:

https://docs.dapr.io/reference/components-reference/supported-middleware/middleware-sentinel/

在config.yaml中引用组件

3. 服务注册发现、健康检查

服务注册发现支持三种配置

dapr自带的健康检查地址:localhost:3500/v1.0/healthz

下面为引用consul的健康检查配置

config.yaml