Dapr的全称是 “Distributed Application Runtime”,即 “分布式应用运行时”
Dapr 是一个可移植的、事件驱动的运行时,可运行在云平台或边缘计算中。支持多种编程语言和开发框架。
Dapr支持多语言,并提供两种通信协议:Http、Grpc
官方文档:
官方文档:从两万米高空看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实战
以官方文档为基础实战(入门)
开发人员习惯于 Web + 数据库应用架构(例如经典 3 层设计),但对天然支持分布式的微服务应用架构却感觉陌生。 成为分布式系统专家很难,并且你也不需要这么做。 开发人员希望专注于业务逻辑,同时希望平台为其提供可伸缩的、弹性的、可维护的和云原生架构的其他功能。
这就是Dapr所要解决的。 Dapr 将构建微服务应用的 最佳实践 设计成开放、独立和模块化的方式,让你能够使用任意的开发语言和框架构建可移植的应用程序。 每个构建块都是完全独立的,您可以采用其中一个、多个或全部来构建你的应用。
此外,Dapr 是和平台无关的,这意味着您可以在本地、Kubernetes 集群或者其它集成 Dapr 的托管环境中运行应用程序。 这使得您能够在云平台和边缘计算中运行微服务应用。
使用 Dapr,您可以使用任何语言、框架轻松构建微服务应用,运行在任何地方。
Dapr 的核心是帮助降低分布式微服务应用程序固有的复杂性。 它基于构建基块 API 的概念而构建。 Dapr 构建基块公开常见的分布式应用程序功能,例如状态管理、服务到服务调用和发布/子消息传送。 Dapr 组件位于构建基块下面,并为每项功能提供具体实现。 应用程序通过配置文件绑定到各种组件。
- 服务调用
- 状态管理
- 发布订阅
- 资源绑定
- Actors
- 可观测性
- Secrets
- Dapr面板:dapr dashboard -p 9999 打开面板,并设置端口为 9999
Dapr中,每个服务,每个运行的服务都会运行一个Sidecar,而Dapr的服务间通信,服务与各中间件的通信都通过Sidecar来通信,而我们的代码里只需要调用Dapr提供访问Sidecar的API,即可完成服务间通信,状态存储,服务监控等功能,完美地解决了传统架构中的代码侵入性问题。
字面意思就是服务之间的调用,但是微服务调用中需要注意:反向代理、链路跟踪、服务的负载均衡、服务请求的熔断降级,这些都需要各种组件的支持。
Dapr完美的解决了这些问题,而又不需要这么多组件配置,
在Dapr中增加了“Sidecar”的概念,每个服务都有一个Sidecar,所有的服务请求都通过Sidecar接收请求,Sidecar解决了以上服务的问题。
因为调用流经 sidecar,Dapr 可以注入一些有用的横切行为:
使用.net core 直接服务注册 DaprClient, 通过DaprClient 调用发送请求。也可以创建出HttpClient发送请求。
http://localhost:
通过DaprClient创建httpClient发送请求
var httpClient = DaprClient.CreateInvokeHttpClient();
await httpClient.PostAsJsonAsync("http://orderservice/submit", order);
通过DaprClient发送请求
var catalogItems = await daprClient.InvokeMethodAsync<IEnumerable
服务 Acatalog/items通过调用Service A Sidecar上的服务调用 API 来调用Service B 中的端点。 Sidecar 使用一个可插拔的名称解析组件来解析 Service B 的地址。在自托管模式下,Dapr 使用mDNS来查找它。在 Kubernetes 模式下运行时,由 Kubernetes DNS 服务确定地址。
Service A Sidecar将请求转发给Service B Sidecar。
Service B sidecar catalog/items向 Service B API 发出实际请求。
Service B 执行请求并将响应返回给它的 sidecar。
Service B Sidecar将响应转发回Service A Sidecar。
Service A Sidecar将响应返回给Service A。
举例:用户登录后存储token信息,现保存到redis中每次请求携带redis中的token,就是有状态的。
Dapr状态管理,简化了第三方组件对代码的入侵。
Dapr 状态管理解决了这些难题。 它简化了跟踪状态,而无需依赖关系或第三方存储 SDK 上的学习曲线。
服务之间状态共享
例子:(此示例使用的统一的配置文件,如果需要单独使用配置文件,每个服务单独的配置文件中使用如下配置也是共享的,当name:keyPrefix为 null时则是全部服务的状态共享,不建议配置为null)
xxxxxxxxxx
apiVersion dapr.io/v1alpha1
kind Component
metadata
name statestore
spec
type state.redis
version v1
metadata
name redisHost
value 127.0.0.16379
name redisPassword
value""
name actorStateStore
value"true"
name keyPrefix
value"name"
auth
secretStore vault-secret-store
是一种众所周知且广泛使用的消息传递模式。架构师通常在分布式应用程序中采用它。但是,实现它的管道可能很复杂。不同的消息传递产品之间通常存在细微的功能差异。Dapr 提供了一个构建块,可以显着简化发布/订阅功能的实现。
在使用发布订阅时,消息插件有很多,原有的使用消息插件时,与项目的耦合性是很强的,当项目升级或需要更换消息插件时改动很大,Dapr的发布订阅,提供了开箱即用的消息抽象实现,仅需在dapr的 pubsub.yaml 中配置使用的消息中间件,设置参数消息参数,提高了灵活性,降低了代码的耦合性。
就是将原有的比如数据库连接字符串,redis连接字符串,等等,放入统一的配置文件中,由dapr的secrets去统一管理读取,
Nuget插件:Dapr.Extensions.Configuration
简单说就是个回调
处理外部事件或调用外部接口的功能就是绑定,绑定可以提供以下好处:
Dapr提供了很多支持的绑定,请见绑定。绑定分为输入绑定与输出绑定,输入绑定是监听外部事件,触发业务逻辑。输出绑定是调用外部资源。
绑定可能与前面介绍的发布订阅类似。 尽管它们很相似,但也有不同之处。 发布/订阅侧重于 Dapr services 之间的异步通信。 资源绑定具有更大的范围。 它侧重于软件平台之间的系统互操作性。 在不同的应用程序、数据存储和微服务应用程序之外的服务之间交换信息。
Dapr 资源绑定需要通过yaml文件定义绑定组件。 此 YAML 文件描述要与其绑定的资源类型。 配置后,你的服务可以接收来自资源的事件或触发事件。
Dapr资源绑定使你的服务能够与外部的资源进行集成业务操作。 来自外部系统的事件可能会触发服务中传递上下文信息的操作。 然后,你的服务可以通过在另一个外部系统中触发事件,传入上下文有效负载信息来扩展操作。 你的服务在没有耦合或感知外部资源的情况下进行通信。 管道封装在预定义的Dapr组件中。 可以在运行时轻松地交换要使用的Dapr组件,而无需更改代码
简单一句话:就是降低耦合性,提高灵活性,随时更换组件。
Dapr 使用 Zipkin 协议进行分布式跟踪和指标收集。 由于 Zipkin 协议无处不在,许多后端被开箱即用,例如 Stackdriver、 Zipkin、 New Relic 等。 与 OpenTelemetry 收藏器组合,Dapr 可以导出跟踪到许多其他后端,包括但不局限于 Azure Monitor Datadog, Instanca, Jaeger, and SignalFX
Dapr 将 HTTP/GRPC Middleware 添加到 Dapr sidecar。 Middleware 拦截所有 Dapr 和应用程序流量,并自动注入关联ID以跟踪分布式事务。 此设计有如下优点:
组件官方地址:
因使用dapr后所有请求都是先经过sidecar中,所以限流中间件也在配置中引用。
apiVersion dapr.io/v1alpha1
kind Component
metadata
name ratelimit
spec
type middleware.http.ratelimit
version v1
metadata
name maxRequestsPerSecond
value1
在config.yaml中引用组件
xxxxxxxxxx
apiVersion dapr.io/v1alpha1
kind Configuration
metadata
name daprConfig
spec
tracing
samplingRate"1"
zipkin
endpointAddress http //localhost 9411/api/v2/spans
httpPipeline
handlers
name ratelimit
type middleware.http.ratelimit
dapr熔断配置文档:
https://docs.dapr.io/reference/components-reference/supported-middleware/middleware-sentinel/
apiVersion dapr.io/v1alpha1
kind Component
metadata
name sentinel
spec
type middleware.http.sentinel
version v1
metadata
name appName
value"nodeapp"
name logDir
value"/var/tmp"
name flowRules
value -
"resource""POST:/v1.0/invoke/nodeapp/method/neworder"
"threshold"10
"tokenCalculateStrategy"0
"controlBehavior" 0
在config.yaml中引用组件
apiVersion dapr.io/v1alpha1
kind Configuration
metadata
name daprConfig
spec
httpPipeline
handlers
name sentinel
type middleware.http.sentinel
服务注册发现支持三种配置
dapr自带的健康检查地址:localhost:3500/v1.0/healthz
下面为引用consul的健康检查配置
config.yaml
apiVersion dapr.io/v1alpha1
kind Configuration
metadata
name daprConfig
spec
nameResolution
component"consul"
configuration
client
address"localhost:8500"
selfRegistertrue
checks
name"Dapr Health Status"
checkID"daprHealth:${APP_ID}"
interval"15s"
http"http://${HOST_ADDRESS}:${DAPR_HTTP_PORT}/v1.0/healthz"
name"Service Health Status"
checkID"serviceHealth:${APP_ID}"
interval"15s"
http"http://${HOST_ADDRESS}:${APP_PORT}/api/health/GetHeartbeat"