Dapr(Distributed Application Runtime)基础知识

分布式架构系统及其存在的问题

介绍Dapr之前我们先了解下分布式架构系统,如下图:

分布式存在的问题

  • 分布式服务如何相互发现并进行同步通信?
  • 如何实现异步消息传送?
  • 如何在事务中维护上下文信息?
  • 如何才能灵活应对故障?
  • 如何缩放以满足变动需求?
  • 如何监视和观察它们?

    除了以上的我们常见的问题,其实还有很多问题,人们将它归纳为了网络(Networking),生命周期(Lifecycle)、状态(State)、捆绑(Binding),如下图:

    这些都是我们分布式要解决的问题。

    为了应对开发人员面临的各种情况,Dapr 提供了一些功能,例如状态管理、服务到服务调用、发布/订阅以及与具有 I/O 绑定的外部系统集成,这些功能基于云服务的触发器和绑定。 反过来,这些功能利用 Dapr 的组件模型,这样你无需更改任何代码便可“交换”不同的基础状态存储等。 此组件模型使代码更具可移植性、更灵活,并允许试验最适合你的需求的代码。 开发人员无需学习和将服务 SDK 合并到代码中,也无需担心针对特定部署环境的身份验证、机密管理、重试或条件代码。

简而言之:Dapr将分布式能力进行封装下沉作为运行时以简化分布式应用开发的技术复杂度。

什么是分布式运行时

    运行时是程序运行依赖的执行环境。以.NET 程序运行时CLR为例,它为.NET应用程序提供了一个托管的代码执行环境负责应用程序在整个执行期间的内存管理、线程管理、安全管理、远程管理、即时编译等,那分布式应用运行时,就是提供分布式应用运行所依赖的的执行环境。

Dapr介绍

Distributed Application Runtime. An event-driven, portable runtime for building microservices on cloud and edge. 

 根据官网解释,Dapr是分布式应用运行时,一个事件驱动、可移植的运行时用于在云上和边缘计算上构建微服务。 

Dapr通过以HTTP/gRPC API这种与语言无关的方式暴露封装的分布式能力供应用调用,从而支持使用任意语言或框架进行开发集成。目前官方已经提供了Go,Node,Python,.NET,Java, C++,PHP,Rust,Javascript的Sdk,简化Dapr的集成。

熟悉Dapr的核心构建块(Building Block)

Service-to-service invocation(服务调用)

提到跨服务方法调用,大家应该会想到通过曝露API的方式。Dapr是这样的,但是又有所不同。比如,有两个服务服务A和服务B,服务A要去调用服务B的接口,B服务曝露它的POST接口地址是 http://192.168.1.1:8000/getinfo,正常情况服务A只要POST这个API访问就可以了,但在Dapr中,提供了不同的接口规范,它需要按照POST/GET/PUT/DELETE, http://localhost:<daprPort>/v1.0/invoke/<appId>/method/<method-name>的格式进行访问。那假设pythonapp需要访问nodeapp的方法,就需要POST一个请求到http://localhost:5200/v1.0/invoke/serverb/method/getinfo。这里为什么要定义这样一个规则呢?其实是为了实现对服务间网络通信的控制以完成诸如服务发现、流量控制、重试熔断、安全访问等,而这相关的网络控制功能就是集成在Dapr的Sidecar中,以对应用透明的方式集成进来的。

State management(状态管理)

在分布式架构中,如何保证服务的状态一致性,其实网上也有解决方案,比如通过共享缓存Redis,实现不同服务之间的状态共享等,但是要真正实现这样的方案就要考虑很多问题,比如数据一致性、状态存储方式及调用异常处理等,但是Dapr状态管理在这一块就很好的给我们解决了这些问题,

Dapr 以更友好的HTTP API的方式进行状态的存储和读取,同时支持通过ETags进行并发控制,并支持通过选项设置并发和一致性行为。

存储:POST http://localhost:<daprPort>/v1.0/state/<storename>

读取:GET http://localhost:<daprPort>/v1.0/state/<storename>/<key>

删除:DELETE http://localhost:<daprPort>/v1.0/state/<storename>/<key>

Dapr中如何保持并发一致性,举例如下:

  • concurrency用于指定并发选项:first-write-wins/last-write-wins(以第一次写入为准/以最后一次写入为准),默认以最后一次写入为准。
  • consistency用于指定一致性选项:strong/eventual(强一致性/最终一致性),默认为最终一致性。
curl -X POST http://localhost:3500/v1.0/state/<store-name> \
  -H "Content-Type: application/json" \
  -d '[
        {
           "key": "weapon",
           "value": "DeathStar",
           "etag": "xxxxx",
           "options": {
             "concurrency": "first-write",
             "consistency": "strong"
            }
        }
      ]'

 Publish and subscribe(消息发布及订阅)

发布/订阅是在分布式架构中比较常用的的消息传递方式架构,很好的解耦了服务之间的耦合依赖,Dapr在这块进行了集成,简化了应用程序的调用。

任何编程平台均可使用 Dapr 的 API 通过 HTTP 或 gRPC 调用方式调用基础组件。 

发布:POST http://localhost:<daprPort>/v1.0/publish/<pubsubname>/<topic>[?<metadata>]

curl -X POST http://localhost:3500/v1.0/publish/pubsub/newOrder \
  -H "Content-Type: application/json" \
  -d '{ "orderId": "1234", "productId": "5678", "amount": 2 }'

订阅可订阅主题:GET  

返回结果如下

[
  {
    "pubsubname": "pubsub",
    "topic": "newOrder",
    "route": "/orders"
  },
  {
    "pubsubname": "pubsub",
    "topic": "newProduct",
    "route": "/productCatalog/products"
  }
]

订阅:POST http://localhost:<appPort>/<path>

如:http://localhost:8000/orders

 Resource bindings and triggers (资源绑定及事件触发)

Dapr的Bindings与Azure Functions很类似,其是建立在事件驱动架构的基础之上的。通过建立触发器与资源的绑定,可以从任何外部源(例如数据库,队列,文件系统等)接收和发送事件,而无需借助消息队列,即可实现灵活的业务场景。Dapr的Bindings分为两种:

Input Bindings(输入绑定):当外部资源的事件发生时,借助输入绑定,你的应用即可通过特定的API:POST http://localhost:<appPort>/<name>收到外部资源的事件,用于处理特定逻辑。

Output Bindings(输出绑定):输出绑定允许你调用外部资源。比如,在订单处理场景中,在订单创建成功后,可以将订单信息通过Dapr的绑定API:POST/PUT http://localhost:<daprPort>/v1.0/bindings/<name>输出到Kafka特定队列上。


  Actors

一个应用/服务由多个Actor组成,每个Actor都是一个独立的运行单元,Actor会管理自己的运行方式和状态,Actor之间通过路由消息交互。 当某个Actor处于一段时间未使用,运行时会停用该Actor并从内存中删除它。 每个Actor状态都会持久保存,并在Actor重新激活时可用。而且同一时刻,每个Actor只能被单个线程执行,这样既有效避免了数据共享和并发问题,又确保了应用的伸缩性。

Actor模型大大简化了并发编程的复杂度,Dapr在Actor运行时中提供了许多功能,包括并发控制,状态管理,生命周期管理如Actor的激活/停用以及用于唤醒Actor的Timer(计时器)和Reminder(提醒)。这些功能同样也是通过API的方式予以提供。

调用Actor 方法:POST/GET/PUT/DELETE http://localhost:3500/v1.0/actors/<actorType>/<actorId>/method/<method>

创建 Timer:POST/PUT http://localhost:3500/v1.0/actors/<actorType>/<actorId>/timers/<name>

创建 Reminder:POST/PUT http://localhost:3500/v1.0/actors/<actorType>/<actorId>/reminders/<name>

 Observability(遥测)

Dapr记录指标,日志,链路以调试和监视Dapr和用户应用的运行状况。Dapr支持分布式跟踪,其使用W3C跟踪上下文标准和开放式遥测技术,可以轻松地诊断在生产环境中服务间的网络调用,并发送到不同的监视工具,如Prometheus。

 Secrets(安全)

Dapr 提供了Secret管理,不过不同于K8S中的Secret,其支持与公有云和本地的Secret存储集成,以供应用检索使用。

通过这些基础知识的学习,对Dapr也算有了初步认识,后面我会继续更新Dapr相关的知识,和大家一起学习!!!

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值