3年前 (2021-09-03)  微服务 |   抢沙发  836 
文章评分 0 次,平均分 0.0
[收起] 文章目录

自从微软宣布Dapr以来已经有6个月了。Dapr或分布式应用程序运行时是一个开源项目,其目标是使开发人员能够编写微服务。这是一个很好的目标,在本博客中,我们将探讨这意味着什么。

自从Dapr发布以来,我听到越来越多关于它的消息。与每次发布一样,Dapr都会发布一些公告、Azure Friday剧集等。对我来说,Dapr似乎并不常见的是,即使在发布之后,它似乎仍能吸引人们。我一直在网络上看到人们在推特上谈论Dapr,最近有一集关于Dapr的Azure播客,让我确信我终于要看一看了,我今天就看了。

在本博客中,我们将介绍什么是Dapr,它与服务网格Service Mesh的区别,以及运行Dapr的快速演示。在这篇文章的最后,我列出了更多的资源。

什么是Dapr

Dapr是一种可移植的、事件驱动的运行时,使企业开发人员能够轻松构建在云和边缘上运行的弹性、微服务无状态和有状态的应用程序,并支持多种语言和开发人员框架。

Dapr与Service Mesh的区别

Dapr的一个主要功能是允许您使用外部组件(如消息传递基础结构或状态存储),而无需写入该外部组件的特定实现。您的应用程序将使用您想要执行的操作(例如从DB读取状态)调用Dapr,Dapr将根据您的配置(例如从CosmosDB读取状态)将此转换为该操作的实现。

让我们考虑这个例子:您需要读写事件到消息队列。Dapr允许您这样做,而无需实现特定于队列的SDK。队列实现由Dapr运行时处理,甚至允许您交换实现细节。从应用程序的角度来看,您只需使用需要执行的操作调用Dapr,Dapr将处理转换。

这也使得您可以编写一次应用程序,在多个云上运行它,并且在每个云上都有一个不同的Dapr配置文件用于特定的队列实现。实际上,您可以在Azure上使用事件中心,在GCP上使用Google发布/订阅。

Dapr中的当前功能(也称为构建块)

在当前版本中,Dapr有6种功能,称为构建块。当您构建应用程序时,您可以选择您决定使用其中的哪一个。

  • 服务调用:这允许您进行服务到服务调用,并让Dapr处理错误处理等。
  • 状态管理:状态管理允许您存储键/值对,以允许在Dapr中使用长时间运行的有状态服务。状态存储可以实现为Azure CosmosDB、Azure表、AWS DynamoDB等。
  • 发布/订阅消息:这允许您发布事件和订阅主题。您可以使用Azure事件中心、Azure服务子、RabbitMQ等。
  • 资源绑定:Dapr的事件驱动编程绑定。有大量的实验实现可用。
  • 分布式跟踪:Dapr使使用OpenTelemetry轻松设置分布式跟踪。分布式跟踪对于解决微服务体系结构中的问题至关重要,因为单个最终用户操作将触发执行多个微服务。
  • 参与者:Dapr获取了大量的服务结构参与者实现代码,并使其在服务结构之外可用。基于角色的编程是一种特定的编程风格,对于具有高并发性的场景非常有用。

在哪里运行Dapr?

Dapr利用sidecar应用程序模式来实现其逻辑。这意味着您可以在代码应用程序之外作为单独的进程运行Dapr。您可以在本地系统上作为进程运行Dapr,也可以在Kubernetes系统中作为侧车容器运行Dapr。

您可以使用HTTP或gRPC与此sidecar进程/容器进行接口。这意味着您不需要使用SDK与Dapr接口。该项目有SDK可供使用,使与Dapr的接口更容易。现在,在C++、GO、java、JavaScript、Python和.NET中都可以使用SDK。

Dapr与服务网格Service Mesh的区别

Dapr承诺做的一些事情听起来与服务网格(例如Istio/Linkedr)承诺做的事情类似。尽管看起来有一些相似之处,但Dapr的目标与服务网格的目标是不同的(在我的解释中)Dapr的目标是使与外部资源的交互更容易,而服务网格的目标是创建更可靠的网络。Dapr为应用程序添加了功能(例如,与状态存储交互),而服务网格只添加了基础设施功能。

它们看起来很相似,因为两者都使用了一种sidecar容器方法来实现它们的功能。然而,这只是一个类似的实现,而不是实际的功能相似性。在功能层面上,我认为Dapr和服务网格有两个重叠的领域:

分布式跟踪:Dapr和服务网格都允许您实现分布式跟踪。在我看来,这是一个明显的重叠领域。

服务到服务调用:我个人对此有点困惑,因为我看到Dapr中的服务到服务调用功能与服务网格如何将自己注入常规服务到服务到服务通信的通信路径之间有相似之处。Dapr的功能与Dapr提供的API on/invoke进行服务到服务调用的角度不同。但是,一旦在服务到服务调用中添加了重试逻辑等功能,我预计会与Istio流量策略等有更多重叠。

Dapr与Service Mesh的区别

Dapr和服务网格之间的重叠区域相当小。两者在应用程序中都有各自的功能,并且都可以协同工作。根据Dapr文档,Dapr可以与Istio或Linked一起工作。

运行Dapr演示

这个演示将创建一个节点和python应用程序,它们将相互通信并将状态持久化到状态存储中。我们将首先运行该示例,然后切换出Azure表的默认Redis状态存储。

为了开始演示,我们将首先安装Dapr CLI。在我的情况下,我将在我的WSL设置上运行这个。您还需要安装Docker才能运行此程序。

wget -q https://raw.githubusercontent.com/dapr/cli/master/install/install.sh -O - | /bin/bash

要在本地计算机上启动Dapr,可以运行:

sudo dapr init

Dapr与Service Mesh的区别

现在,我们可以克隆演示并在目录中导航:

git clone https://github.com/dapr/samples.git
cd samples/1.hello-world

我们将从节点应用程序开始。这将收到订单。有一个/neworder路径,它接受新订单并将其持久化。如果您查看这段代码,您将看到我们将对stateUrl(在本例中为Dapr)执行post操作,但不提供任何详细信息,如数据库、连接字符串等。

Dapr与Service Mesh的区别

使用下面的命令运行:

npm install
dapr run --app-id nodeapp --app-port 3000 --port 3500 node app.js

此演示应用程序使用Redis数据库作为状态存储。此数据库在您的计算机上作为容器运行。要查看此信息,请运行docker ps

Dapr与Service Mesh的区别

现在,我们可以使用以下方法根据此API创建:

dapr invoke --app-id nodeapp --method neworder --payload '{"data": { "orderId": "41" } }'

在这里,我们使用Dapr CLI发布消息。我们将消息发布到Dapr端点,而不是直接发布到NodeJS应用程序。运行此操作后,我们将在应用程序的日志中看到:

Dapr与Service Mesh的区别

我们还可以使用curl命令发布到Dapr(Dapr CLI代表我们这样做)。

curl -XPOST -d @sample.json -H "Content-Type:application/json" http://localhost:3500/v1.0/invoke/nodeapp/method/neworder

本例中还有一个Python应用程序,它每秒发布一条消息。要将此应用程序添加到已部署的应用程序中,我们可以运行:

pip3 install requests
dapr run --app-id pythonapp python3 app.py

这实际上是每秒一个请求:

Dapr与Service Mesh的区别

将Redis改为Azure Table

Github演示中没有包括这一点,但我想看看用Azure表替换Redis有多容易(我最初想尝试CosmosDB,但没有运行CosmosDB,所以我切换到了Tables)。

状态存储的配置发生在文件components/statestore.yaml中:

apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
  name: statestore
spec:
  type: state.redis
  metadata:
  - name: redisHost
    value: localhost:6379
  - name: redisPassword
    value: ""
  - name: actorStateStore
    value: "true"

让我们看看是否可以将此更改为Azure表。查看定义,我们需要帐户名、访问键和表名。

apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
  name: statestore
spec:
  type: state.azure.tablestorage
  metadata:
  - name: accountName
  value: nfwestus2
  - name: accountKey
  value: VE5JBoIm...d5MQ==
  - name: tableName
  value: daprtest

Dapr与Service Mesh的区别

此文件在目录中存在两次,一次在父目录中,一次在另一个子目录中。为了确保这一点,还要确保复制components子目录中的statestore.yaml

现在,让我们再次运行这两个应用程序。

dapr run --app-id nodeapp --app-port 3000 --port 3500 node app.js
dapr run --app-id pythonapp python3 app.py

Dapr与Service Mesh的区别

并且,我们可以在表存储中看到顺序:

Dapr与Service Mesh的区别

总结

Dapr看起来很有前途。我可以看出,使用它从开发人员那里抽象出实现细节是非常容易的。您不必关心消息传递基础设施或状态存储,只需根据公共抽象层编写应用程序和程序即可。

原文地址:https://blog.nillsf.com/index.php/2020/04/26/introduction-to-dapr/

 

除特别注明外,本站所有文章均为老K的Java博客原创,转载请注明出处来自https://javakk.com/2300.html

关于

发表评论

表情 格式

暂无评论

登录

忘记密码 ?

切换登录

注册