使用Dapr和Java改进微服务DevOps

Artur Souza, Paul Yuknewicz
微软Azure首席软件工程经理、首席集团产品经理
微软Azure

某些DevOps实践成为分布式云原生开发的必备条件。

其他的对于高代码质量的交付是至关重要的。

让我们来探索它们以及它们对项目成功的影响

视频记录

大家好,欢迎大家。感谢您参加今天的会议,今天,Artur和我将讨论如何使用一种名为Dapr的新技术以及Java来改进微服务和DevOps流程。我叫Paul Yuknewicz,是Azure团队的产品负责人之一。我的重点是开发平台和框架,我也是Dapr社区的成员。

我是Artur Souza,我是Dapr团队的工程经理,也是Dapr的维护者。

好了,我们开始吧,Artur和我在这个团队里工作了一段时间,在过去的几年里,我们一直在与许多开发人员和运营商合作,我们一直在了解需求和最大的挑战。我们经常听到的一件事是,团队需要非常高效地构建、部署和自动化构建微服务的过程。我们经常听到,阻碍他们的是有限的工具集和运行时间,以使用微服务构建这些更分布式的应用程序。即使存在运行时选择,我们也发现它们往往受到严格控制的特性集的限制,或者它们只支持一种特定的语言,而不是您与您的团队碰巧使用的语言。

我们听到的另一个非常常见的需求是,我们需要在我们的流程中针对许多不同的平台和许多不同的环境。例如,现在一个更现代的目标是Kubernetes,许多工作负载都试图以Kubernetes为目标,但我们也有许多工作负载运行在vm上,运行在云上,运行在Edge上,甚至混合在一起。因此,我们开始减轻在许多不同环境中运行的挑战,并确保更好的可移植性。

说了这么多,接下来是Dapr。Dapr的字面意思是分布式应用程序运行时,这就是首字母缩写的意思,而Dapr实际上就是为了更快地构建分布式应用程序,这就是我们选择Dapr的原因。具体来说,Dapr是一组api,这些api专注于构建可靠的微服务,并确保你的微服务是非常可移植的。仔细看看这个,我们在Dapr中看到的东西,首先,就像我们提到的,我们有一组api, api是针对最常见的场景的,所以无论是服务对服务的调用,如果我们构建了这个图,我们会看到。

还有一种非常常见的应用程序类型是Pub/Sub,其中我们有异步消息和一个代理,以及一些关于接收内容的保证。我们在Dapr和Dapr运行时中拥有的一个总体特性是弹性。这包括重试,弹性电话,还有熔断机制,回撤和不同的政策。这是我们将持续进行的投资,这样在我们建设Dapr项目的过程中,每一步都将有越来越强的弹性。

消息传递,正如我提到的异步,是非常重要的,所以无论是使用消息还是使用事件,都有许多内置的集成。正如我们在图中看到的,如果你最喜欢的是Kafka或RabbitMQ,或者使用某个公共云,我们真的支持许多这样的集成,而且它们会随着时间的推移而增长。正如我在挑战幻灯片中提到的,我们开始着手使Dapr便携化。

所以Dapr本身作为一个运行时是可移植的你可以在很多不同的环境中运行它,你可以在你的机器上本地运行它,只需要使用CLI,你可以在所有不同的环境中安装它从登台,预prod,一直到prod,你会有很多不同的环境。例如,你可以在不同的云环境中运行,你可以运行多云,你可以在Kubernetes中运行,你可以在没有Kubernetes的情况下运行,你可以在Edge上运行。

因此,真正在任何地方运行Dapr,从而能够在任何地方运行微服务,是一个非常重要的目标。不仅是应用程序和主机环境,还有你的倾向,对吧?我们谈到了你的事件经纪人。我们想要确保免费的开源存储和状态管理服务,嗯,Pub/Sub代理和秘密存储,你最喜欢的选择也能与Dapr非常好地工作,你根据一组标准api编写代码,我们可以通过配置动态绑定到你选择的软件。

在这里,当我们缩小时,我们可以看到它是如何工作的几个不同的层。我们的应用程序代码,是用我们最喜欢的一种语言编写的。今天我们真正要关注的是Java和Spring作为我们的堆栈,然而,重要的是要看到我们今天使用和喜爱的许多通用语言,无论是Go还是Note或Python或。net,甚至c++,作为原生语言,你可以用其中任何一种来编写应用程序代码,你可以从Dapr以restful方式调用api。如图中间所示,可以使用HTP或gRPC进行静态调用,因此我们支持两种最常见的API样式。你可以看到我们在Dapr盒子中启用的一系列场景,所以我们看到开发人员和运维人员最常见的开始,将是服务到服务调用,在最左边。在中间,发布和订阅用于编写异步消息和基于事件的应用程序,这也是非常常见的。

但随着微服务应用的发展和深入,你会增加一些东西,比如可观察性,你会有秘密。如果你有成千上万个带状态的对象,你可以使用像actor这样的东西,所以API集非常广泛,而且还会不断增长,就像我提到的,它是为了让你高效地进行公共测试。最后,如果我们停留在托管基础设施上,我只想指出Dapr可以在许多不同的主机上运行,比如Kubernetes,我认为这是一个重要的考虑因素,但我们也可以在所有或许多容器和PaaS服务上运行,无论是在AWS,谷歌,Azure,阿里云,你也可以在虚拟机上运行,你可以在Edge上运行。实际上,Dapr会给你灵活性,让你在不同的地方运行相同的应用程序,相同的代码,而不需要重新构建,这是Dapr的优点之一。

我们接下来要讲的是,实现这种可移植性的方法之一,就是通过组件模型。如果你仔细想想,Dapr有一组API,我提到的是宁静的,它们是一致的,所以每一个这些东西,不管是国家商店,状态管理,或发布/订阅,这是一个API,但是我们也有一系列的组件,就像一对多的关系,你可以回八API与您最喜爱的组件,和让我们酒吧/订阅的案例中,它可能是在我的本地机器上,它可以是复述,并在生产中,可以是RabbitMQ,因为这是我的团队的选择。只需使用一个可切换的YAML文件,我就可以有效地配置环境,并将挂载绑定到我最喜欢的组件,而无需更改应用程序代码,因此这是我们实现应用程序端到端可移植性的方法之一。今天我们有超过70个可用的组件,许多最流行的开源和云供应商都提供了组件,我们计划与社区合作,随着时间的推移不断发展。

现在,一个重要的技术基础,我知道Artur会花更多的时间给你们展示它的实际操作,就是侧车模型。现在,通常当你听到sidecar,我们会想到Docker和Docker容器作为sidecar。我要小心地指出,这里我们讨论的是过程。所以我的应用程序和二进制文件是作为一个进程开始的,假设我在JAR文件上运行Java,它也是作为一个进程开始的,但Dapr sidecar也是作为它自己的进程开始的,它成为一个非常重要的进程,它可以代表我们做事情,就像大使一样。它可以进行调用,它可以使调用更可靠,它可以与我们拥有的不同组件一起工作,基本上为我们的应用程序提供了额外的弹性和可移植性。作为开发人员,我只考虑进行restful调用。如果我要调用Dapr进程,假设在我的开发机器上,默认情况下,它会在本地主机上,在默认端口3500上。然后我就调用restful api。如果我想进行服务调用,我会调用invoke,然后我调用我想要的服务和动作。

如果我想做一些状态管理,同样的事情,我调用相同的端点,但这次我将调用状态API。我将根据第67项进行索引,这种方法一直在继续,对于发布/订阅,我可以这样做一个发布,我可以让另一个函数同时作为接收者和订阅者。你可以再次看到,sidecar进程位于app旁边它提供了一致的API,它是非常可移植的并且可以重新绑定到许多组件。只是为了强调,你可以在容器中使用它,但容器实际上根本不是必需的,我认为这是Dapr的优点之一。也就是说,我已经给了你们一个概述。我想把它交给我的同事Artur他有很多实际的东西要展示。

好的,保罗,谢谢你对Dapr的精彩介绍。现在我们来看一个Dapr在Java应用程序中工作的演示。我们将使用Twitter处理管道的例子,这个例子也可以实现不同的语言。今天我们将再次展示它的Java版本。那么,让我们通过一些组件,这样你就可以理解这个应用程序是如何工作的。

因此,我们有一个Twitter提供者应用程序,它通过Twitter绑定(这是一个已经在Dapr sidecar中实现的组件)从Dapr sidecar接收推文,并通过每个车辆接收推文。你将通过向结算处理器发出服务请求来处理它,以获得结算分数,查看推文是积极的、中性的还是消极的情绪,然后你将把推文保存到状态存储中,并以Redis为例将其发布到Pub/Sub。还有另一个组件叫tweet viewer它也有一个sidecar,它会渲染一个网站,它会订阅事件并使用web套接字在网站上显示它们。基本上就是这样,你订阅这些推文,获得情绪评分,并在网站上显示它们。

让我们运行这个例子。你需要秘密,所以我们在这个例子中会用到,因为我们在本地运行,我们会用到一个[听不清00:12:47]文件,所有的属性你都可以从你的推特开发账户中获得,网站上有如何获取的说明。出于安全考虑,我们要把它们藏在这里。我们还将使用Azure认知服务API来对文本进行情感分析。

现在我们要运行第一个组件,也就是情绪处理器。在本例中,我们还模拟了应用程序的编译,在本例中我们使用Maven。正如您所看到的,构建成功了,现在我们将运行Dapr来运行流程。如你所见,我指定了组件的路径,应用程序将要侦听的应用程序端口,还给出了ID,情绪处理器,这非常重要。

Artur,如果我看一下,我习惯做Java/JAR然后传入我的JAR来运行,看起来你只是在它前面加上了一个Dapr run和服务名称之类的前缀。我是这么想的吗?

是的,这是一个很好的观察。因此,您仍然可以使用Java JAR运行进程,但是Dapr run是有前缀的,因此它可以获得良好的Java环境变量,使DES2K能够开箱即用。

这很好。我想这也是边车的开始,对吧?

是的,这一切都是从侧车开始的。好问题。我将为下一个进程再次运行Dapr,它遵循相同的策略,但端口不同,如你所见。组件路径可以共享,它不需要每次运行都是唯一的,可以看到,你得到了一些tweet。你也得到了情感分析。

现在让我们运行实际的web UI,我们可以看到这些tweet和情绪分析一起显示,我们总是用Dapr运行,组件路径和应用程序端口,这个sidecar端口是由Dapr运行随机决定的,所以我不需要担心sidecar端口的冲突。好的,我们得到了显示,现在我们要在浏览器上显示它。正如你所看到的,这个图标,就像一张有红色、蓝色或灰色的脸。好了,向你展示每条推文的情感,当然,它会收到来自不同语言的推文。这就是在本地使用Dapr运行应用程序的方法。

让我们更深入地了解Java SDK是如何为Dapr工作的。所以如果你有一个Java应用程序,你可以在不同的层上与Dapr集成,你可以使用基本的SDK,它将允许你做一些事情,比如状态存储,发布/订阅,秘密,甚至在某种程度上绑定。现在,如果您想使用角色,您现在可以依赖于另一个工件,即Dapr。sdk actor,它也包括基本的sdk,通过这种方式,你也可以调用actor,或者你也可以通过内置actor运行时来服务actor。

如果您想将Dapr与Spring Boot一起使用,您甚至可以直接依赖于Dapr SDK Spring Boot工件,在那里您将自动拥有Dapr所需的控制器。例如,您可以通过主题注释处理Pub/Sub订阅,或者您可以让参与者运行时句柄也为您自动实现Spring Boot。如果你想使用Spring Boot,这是一个平滑的集成,如果你不使用Spring Boot,你只依赖于其他版本,但它可能需要对每个控制器进行一些手动实现。但是,我们以后还可以添加更多,但是现在我们主要关注Spring Boot应用程序。所以你依赖工件的方式和你依赖任何其他Maven依赖的方式是一样的,无论是在Maven中还是通过Gradle,都可以。SDK的最新版本是131。

如何使用状态存储呢,就像我们在这个例子中看到的。所以你Dapr客户机,在某种意义上,可以重用,你调用保存状态,通过状态存储名称,您传递的关键,在这种情况下它是行星,你传递的对象,在本例中是一个复杂的类型称为行星,就是自动序列化的SDK追逐,和国家商店,你会得到一个关键应用程序的想法作为前缀和关键项目的后缀,然后你可以作为一个序列化对象的价值。这适用于多个状态存储,您决定通过配置,您的代码不会更改。

get则相反,你先做。get状态,然后做同样的事情,传递状态存储名称,键,然后传递你正在读取的类类型,这样SDK就知道如何反序列化它回到你请求的对象,这和Java中任何序列化API的模式是一样的。我想把这个调出来,我们使用的是Project Reactor,这就是为什么在这个例子中,你会看到。block来使这个调用同步。因此,如果你想通过Product Reactor使用一个异步API,它已经内置在API中,不需要为它做任何适配器。

而Dapr客户端,你只需要使用构建器,这里你根本不需要传递任何参数,所以只有当你做任何不同的事情时,你可能需要指定不同的端口,但如果你使用的是Dapr采用的标准方式,你只需要调用构建器。构建完毕,就可以开始了。构建器将知道sidecar正在运行的端口是什么,因为Dapr运行注入了构建器知道如何解析的环境变量。

现在我们来看看Pub/Sub。在这个例子中,我们要发布一个事件和save state非常相似,pub up的名字,这是组件的名字,在这个例子中,是主题的名字,我们要发布的主题[听不清00:20:22]和要序列化成JSON的对象。然后在订阅者端,我们将使用Spring Boot示例,这里我们有一个addtopic注释,这是一个Dapr注释,它会告诉这个端点路径应该通过Pub/Sub接收来自order topic的事件我在这里传递的Pub/Sub名称。而要有事件发生,我也将事件接收为云事件。因此,Dapr使用云事件抽象,因此您可以为云事件提供注释和额外属性,包括跟踪。这就是为什么我们使用Pub/Sub进行跟踪,因为我们使用了云事件抽象。

那真的很酷,云事件,得到标准的界面。如果我想要得到,比如说,原始的潜在事件,我也可以这样做吗?

是的,如果你想获得原始事件,你可以。在这种情况下,你得到事件。数据并立即获得事件。

听起来不错。因为我认为我们会遇到很多问题,比如,“嘿,Dapr是否隐藏了太多的对象模型?”假设。

是的,如果你想的话,还有另一种方法来处理这个问题,那就是,假设你在Redis中订阅了一个主题,而发布者没有使用Dapr,也没有使用云事件抽象。在这种情况下,您可以配置您的订阅,说我正在订阅原始事件,然后双侧车将自动将其包装到应该与Dapr订阅兼容的云事件中。所以你甚至可以订阅那些没有使用Dapr的出版商的活动。所以这又回到了最初介绍的内容,你说你可以逐步采用,所以你不需要整个公司都采用Dapr。例如,对于Pub/Sub,你可以说,“好吧,我要用Dapr订阅,即使我的出版商(它正在审核)不使用Dapr。

太棒了。听起来它使我的API在这个过程中更加标准。

是的,是的,现在我们可以进入服务调用。服务调用,有两种方式。一种方法是您可以使用SDK中的调用服务API,这是针对HTTP的,然后您可以传递应用程序ID,签出或路径,完整路径,以及您正在传递的更新和您正在使用的HTTP方法。现在你可能会问,“那么使用它比标准HTP调用有什么优势呢?”我想说的是,这样做的好处是您的应用程序不必在服务的端点进行配置。如您所见,我不知道卡服务的主机是什么,我也不需要知道,Dapr的服务发现功能将为我处理这个问题。

现在,如果你想在没有SDK的情况下使用,你可以说,“哦,我已经在做了,它们应该被正确地调用到我的服务,我为什么要麻烦地选择Java SDK,只是为了进行HTP调用?”这是一个很好的参数,因此我们也为HTP调用和JRPC创建了一个代理解决方案,其中进行服务调用的现有代码不需要更改,除非更改端点中的额外报头。所以你以同样的方式传递端点,你传递给你的服务,但是你在Dapr运行时的端口中调用本地主机。在这个例子中,我们将使用标准的3500,但它是可配置的,你也可以从环境变量中得到这个,如果你想,然后你传递头文件,Dapr app ID。

[听不清00:24:24]所以接下来要做的是,那部分会表现得像HTP代理,Dapr会接收到请求,你会明白,“哦,这个请求实际上不是针对侧车的。”这个实际的请求现在必须通过ID card类型转发到另一个应用程序。它会进行翻译并代表你进行HB调用并将它转发给你,响应。因此,使用Dapr调用服务只需要在代码中做极少的更改,甚至不需要使用SDK。

只是补充一下,我们看到,我认为,许多开发人员开始使用这种方法,因为他们已经有了HTP,他们已经有了gRPC和原型代码,所以他们可以开始使用Dapr,通过添加头,就像你展示的,这是一个非常好的方法,对吗?然后,如果我想为全新的代码编写简洁的代码,我有另一种SDK方法。所以你有很好的选择。

是的,这是正确的。如果我们继续,那么我们如何做和使用Kubernetes一样的事情呢?我是否需要重写我的应用程序,使用Kubernetes?答案是否定的。您的应用程序使用相同的代码,相同的位。你可以在本地运行,也可以运行Kubernetes,我们会演示如何运行。同样的例子,但都是关于Kubernetes的。好了,我们去拿吊舱吧。所以Dapr安装在Dapr系统的命名空间中,可以看到仪表盘、操作员、放置位置、避难所和侧车。我们还在默认名称空间中安装了Redis,然后我们还有组件,绑定,加压和发布/订阅组件。 So if you can look at the binding, we’re going to see that we use the secret reference here. So again, no hardcoded secrets, it’s all part of the Kubernetes secret store.

如果你看处理器,抱歉,我在输入时犯了一个错误,你可以看到我们也使用了一个秘密存储。抱歉,这次只是部署而已。抱歉,是部署的问题。现在我们有了提供程序的部署,你可以注意到它们都有注释,Dapr注释。这会告诉Dapr sidecar注入器你需要注入一个sidecar,所以没有任何部署你必须声明Dapr sidecar,它会在你添加注释后自动注入,[听不清楚00:27:18]组件也使用Redis。

现在让我们看看查看器部署,同样的注释对于Dapr,我必须调用应用程序ID也被指定。在这里,我们还有一个服务,所以我们可以有一个入口。好的,我们要简单地应用所有这些ml,如果你看这些豆荚,我们现在已经创建了豆荚。现在看起来它有两个容器,看到了吗?尽管我们只应该为应用程序找到一个,但现在它有两个,因为sidecar注入器检测到注释并说:“好,让我现在将dapr sidecar注入到这个位置。”现在他们都跑了。

现在我们来看看对数。让我们从处理器开始。哦,我忘了,为了名字。好了,解析器已经启动。哦,我想我需要复制SOL,整个提供商URL,等一下,我来修正一下,klogs,提供商。哇,好吧,我们收到一条推特。有些是葡萄牙语,我能看出来。

让真实的Twitter进入演示总是令人兴奋的。

是的。好,现在我们要得到查看器的端点。我们在这个例子中使用minikube,所以让我们使用minikube IP。

但这可以在任何Kubernetes上运行,对吧?

是的,它也可以运行在任何具有公共IP的Kubernetes上。然后我们也开始收到推文。这就是Kubernetes的演示。

让我们深入了解每个组件,了解代码的外观。这里我们看到Twitter组件,Twitter的绑定组件。所以没有一个秘密是硬编码的。我们在这里使用了秘密引用,直接指向Kubernetes。如果你运行的是本地主机,你会从本地文件中获取。所以你不需要担心,“哦,秘密是从哪里来的。”这是另一种构型。您还有消息嗡嗡组件,在本例中我们使用Redis,在这里我们只是使用空密码的本地主机,但如果您想在生产中这样做,您可以用一个秘密的YAML替换这个YAML,并且您的代码没有更改。状态存储也是一样,我们有Redis使用本地主机,如果我们在秘密存储中,你可以有秘密存储,在这种情况下,从本地主机在相邻文件中定义它。当你在本地运行时,你不一定需要使用Redis秘密存储,当然,你会用到这个文件。

当你得到一个tweet,记得你收到绑定微博,我只是通过tweet对象,由弹簧自动反序列化为我,当我做Dapr客户取消服务,我将撤销情绪的情绪处理器路径,通过twitter对象,使用post和接收回情绪对象,然后我做一些反应堆通过这里,然后我翻译和响应,拯救国家,使用国家商店,通过tweet ID和分析推特,之后我发布了事件消息总线。

我想你可以看到这里,你有一个非常有趣的工作流,但代码看起来就像你想要的工作流,而不是你必须通过HTP,你的gRPC来做更多的机器,只是为了做连接,所以这很酷。

是的,是的,所以我们在这里使用,反应堆的功能,和Dapr侧车被注入。我可以看到,我现在要展示我是怎么做的。有一个Dapr配置,我有一个构建器我通过自动装配发送一个客户端?

对于Spring Boot应用程序,所有不同之处在于您需要为Dapr的io添加包路径。对于Spring引导,dapr自动加载dapr需要工作和接收所有回调调用的所有控制器,并为您处理主题注释。因此,所有这些好处只需添加扫描包列表即可实现。

现在让我们看看情绪处理器。还是那个秘密商店。在这种情况下,我们从控制器获得端点和订阅键,然后我们进行HP调用。我们接收到的信息是通过HTP,然后我们给Azure认知服务打惠普电话。然后我们得到响应,我们把情感对象返回给用户。如果你看一下这段代码,实际上没有什么是专门针对Dapr的。

这是你可以看到Dapr服务职业是如何工作的一种方式。您不需要重写接收端,所以它仍然是这样工作的,但在这种情况下,我们使用Dapr的秘密特性。记住,你需要端点秘密和订阅密钥秘密,所有这些都来自Dapr get secret API。因此,您不需要在环境变量中硬编码任何秘密。你只要让达珀帮你知道秘密。这就是这个应用程序采用Dapr的方式,用于秘密存储。

从运维角度来看,我们给开发者展示的是本地机器,但如果我有更多的环境,假设我在CI/CD管道中,我有staging, pre-prod,一直到prod,这是什么样子?

不同之处在于,秘密存储文件是不同的,或者如果你去Kubernetes,你会在Kubernetes上用不同的值存放秘密。因此,通过这种方式,应用程序可以使用不同的配置,而无需更改代码。因此所有的秘密存储组件都需要更改。

如果我使用保险库或钥匙库,我也可以使用它们吗?

是的,你也可以使用Vault。我使用Vault而不是Kubernetes的秘密。你也可以这样做。所有这些都在组件的YAML中处理。好问题。

现在我们来看推文查看器,推文查看器使用订阅功能,它有一个主题。所以我们有一个特殊的标记,这是Spring Boot的Dapr SDK的一部分,你要订阅推文,接收消息名称,Pub/Sub名称,去他的消息总线,和你在左边的YAML中看到的一样。在这个例子中,is将来自Redis或本地主机,但它也可以来自其他来源。如果您想在不同的环境中运行,替换组件YAML的相同策略也适用于这里。

我们也有一个web套接字,但我保持抽象,因为它不是特定于Dapr的逻辑,我们还接收……在这个例子中,我们有一种不同的方式来处理云事件。我们以字节的形式接收云事件,然后在代码中反序列化,这也是另一种方式。我们可以直接接收,已经解析过的,或者你可以调用我们提供的云事件对象的额外反序列化方法,抱歉,云事件类是我们在Dapr SDK中提供的。现在,同样重要的是要指出我们使用SLF4J,而不是Log4j,所以这只是一个很好的例子。

现在让我们使用RabbitMQ。所以如果你喜欢使用RabbitMQ,你只需要改变你的YAML就可以了。比如,在本地主机中,你使用Redis,而在测试环境中,你使用RabbitMQ,没问题。您只需要为不同的环境使用不同的YAML,这再次使DevOps的工作变得更容易,因为您不需要让开发人员在本地100%地模仿您的环境。

听起来,就像你提到的,sidecar承担了很多沉重的工作,所以即使有些东西需要修补,有些东西需要更新,听起来Dapr团队会处理这些问题,并不断更新sidecar。

这也是另一个很好的例子。RabbitMQ组件正在不断发展,所以在Dapr sidecar的下一个版本中,已经在Dapr中修复了RabbitMQ组件。这些都是免费的,所以你不需要担心我是否需要更新依赖?我是[听不清00:37:51]最新的吗?它准备好用于生产了吗?所有这些都由Dapr处理,你实际上可以看到哪些组件被认为是稳定的生产使用,哪些还不是,我们正在努力将越来越多的组件发展成稳定版本。另一件事是,当你使用sidecar模式时,你不需要在应用程序中管理依赖冲突。假设你引入了一个第三方库连接RabbitMQ,它使用了一个与你的依赖项冲突的版本。假设你的JSON序列化器,是一个冲突的版本。您不再需要担心依赖冲突,因为所有这些都被隔离在一个单独的进程中。

好的,让我们看看Zipkin。所以我们打开URL,本地主机9411,我们要去我们的查询,看看来自Dapr的事件。如果你看提供者,你可以看到发生tweet事件需要多少。在这种情况下,你可以看看情绪分析,花了多长时间。如果你做一个节目,你可以看到它花了大约1.5秒,大部分是关于情感处理器的电话。

如果你回头看,我们还可以看一下发布事件,你可以看到这里的提供者,在情感分析之后有效负载已经序列化了,发布事件大约花了1.3到1.4毫秒。之后,如你所见,有一个小的延迟,它是观察者在1.6毫秒接收到的,并在1.6毫秒内处理,所有这些都是由Dapr sidecar自动完成的。

现在,如果你想在这些事件上有一个很好的上下文,你当然可以,检测你的应用程序,让我们说使用开放遥测SDK,然后将所有这些跟踪事件包装在一个父跨度内,那个上下文必须来自于一个应用程序。但同样,Dapr会为你添加那些事件作为子事件,在这种情况下,Dapr会自动为你处理,对于发布/订阅,订阅者事件是发布者事件的子事件。

现在如果你想开始使用Dapr,看看我们的文档。您可以看到快速入门、入门指南、故障排除以及如何选择组件的示例。看看我们的GitHub页面,你可以通过查看你的问题来开始,或者我们也想在那里做一个好的第一期。如果你是Java开发人员,看看我们的Java SDK[听不清00:41:00],有很多机会为SDK做出贡献。你甚至可以发展成为一名维护者,如果你想做出承诺,你也可以在看aka的时候看看这个例子。我们的社区在Discord上非常活跃,所以请检查我们的Discord频道,我们也有一个社区存储库,在那里你可以找到社区调用的url和日程安排。因此,您也可以自由地加入我们的社区电话,这通常也是一个由维护者之一回答实时问题的好地方,当然,我们的推特帐户,推特帐户,daprdev。保罗,你还要补充什么吗?

不,我喜欢你的观点。我认为社区是最伟大的资产之一,我认为,对于Dapr来说,这是最大的功能之一,所以我喜欢加入你们,并记住很多Dapr实际上也是由社区构建的,所以到目前为止,这真的是一件很棒的事情。

是的,很多组件实际上来自社区,或者来自社区对合法和错误的要求,而且,社区在报告错误方面做得非常好,所以这是我们使事情稳定的一个非常关键的途径,他们实际上报告了错误,社区在这方面也做得非常出色。

哦,这也提醒了我,我认为事情进展顺利的一个证明,发展社区,是我们刚刚加入CNCF作为孵化器,所以这是非常令人兴奋的,希望在那之后我们会有下一个社区加入我们。

是的,这是真的。Dapr团队和社区都取得了巨大的成就。

是的。

好的,谢谢大家,还有…

谢谢你!

希望能再见到你。

要么快速释放,要么死亡