AsyncAPI代码生成:使用Spring云流的微服务

2020-06-03 04:58:48

代码生成不是简单的壮举。当涉及到生成有用的应用程序代码时,有很多复杂性。在这篇文章中,我将指导您使用Spring Cloud Stream和AsyncAPI代码生成器生成您自己的微服务。在定义和实现异步应用程序时,这些工具应该有助于简化工作。我在一段视频中解释了同样的想法,你可以在这里观看,所有的工件都可以在GitHub中找到。

在我们开始代码生成之前,让我们先从基础开始--什么是AsyncAPI?在过去的几年中,AsyncAPI已经成为定义异步、事件驱动的API的行业标准;您可以将其视为异步世界的OpenAPI。它是一项开放源码计划,它既提供了以机器可读格式描述和记录异步应用程序的规范,也提供了工具(如代码生成器)来简化负责实现这些应用程序的开发人员的工作。

我不打算详细介绍该规范,但是对于上下文,您应该知道它定义了有关异步API的元数据、可用于发送/接收消息的通道以及定义正在交换的消息的组件(如模式)。有关该规范的更多信息,您可以在此处阅读。

使用AsyncAPI进行代码生成的第一步是获取定义要开发的应用程序的AsyncAPI文档。根据规范,本文档表示为JSON对象,并且必须符合JSON标准。YAML是JSON的超集,也可以使用。获取此文档的方式主要有两种:手动创建文档或使用事件门户。

如果您在熟悉规范后决定手动创建文档,请不要担心-您不会从头开始。AsyncAPI计划提供了一个名为AsyncAPI Hub的方便的交互式工具来简化这一过程。在Hub的左侧,您可以熟悉规范并对真正的AsyncAPI文档进行更改,当您这样做时,屏幕右侧会更新以显示如何将文档解析为更易于阅读的格式。

第二种方式是使用事件门户。例如,Solace PubSub+event Portal允许架构师和开发人员使用GUI协作来设计事件驱动的架构。团队将定义系统中存在的应用程序,以及交换的事件和定义它们的架构。拥有一个组织良好的频道和事件目录以供重复使用,还可以在协作时节省您的时间和麻烦,而不是必须梳理不同位置的一堆文件。

一旦设计就绪,PubSub+event Portal允许开发人员选择他们负责开发的应用程序,并下载JSON或YAML格式的AsyncAPI文档。

既然我们已经有了描述应用程序的AsyncAPI文档,接下来就可以开发应用程序了。AsyncAPI代码生成器支持模板来为各种不同的语言和协议生成代码,但在本例中,我们将使用Spring Cloud Stream模板。需要注意的是,该模板生成了一个Maven项目。

Spring Cloud Stream框架提供了一种简单的方法来开始使用事件驱动的微服务,因为它提供了绑定器,允许开发人员在不必学习消息传递API的情况下创建他们的微服务。

当然,第一步是安装AsyncAPI生成器本身。如果您安装了NodeJS,这只需要一个简单的npm命令,如下所示。您可以在GitHub上的代码生成器中找到所需的版本。

一旦安装了生成器,就可以使用ag命令运行它。您至少必须指定要运行它的AsyncAPI文档和要使用的模板,如下所示。

在大多数情况下,您会希望利用正在使用的模板指定的参数和规范扩展。例如,我在本例中使用的Spring Cloud Stream模板允许我配置许多选项,包括我想要使用的Spring Cloud Stream绑定器-例如,Solace绑定器。

使用这些选项,我的ag命令可能如下所示,其中-o指定输出目录:

ag-o ExpenseIntegration-p绑定器=solace-p view=Provider-p致动器=TRUE-p artifactId=ExpenseIntegration-p groupId=acme.rideshare-p javaPackage=acme.rideshare.expend-p host=localhost:55555-p用户名=default-p密码=default-p msgVpn=default~/downloads/ExpenseIntegration.yaml@asyncapi/java-Spring-cloud。

此时,生成器已经创建了包含Maven项目的ExpenseIntegration目录。我们可以使用选择的IDE并导入Maven项目来添加业务逻辑。

如下图所示,一旦导入,项目看起来就像一个普通的Spring Boot Java项目,在前面定义的javaPackage下生成了类,并有一个用于配置的application ation.yml文件。javaPackage下生成的类包括从AsyncAPI文档中的模式定义的Plain Old Java Objects(POJO)和Application.java,后者包含实际的Spring Cloud函数,我们将在其中添加业务逻辑。

与上图中的RideReceipt一样,生成的POJO根据AsyncAPI文档中包含的模式定义数据模型。这些POJO包含变量,为每个属性定义了getter和setter,既允许开发人员快速编码而无需手动创建对象,也允许Spring Cloud Stream自动将消息直接转换为POJO。

然后是Application.java类,可以使用javaClass参数重命名。生成器将添加函数来处理在AsyncAPI文档中定义的通道上传递的消息,如模板中所述。

在下面的示例中,我们可以看到单个java.util.function.Consumer bean,因为我们的AsyncAPI文档将我们的应用程序描述为其有效负载由RideReceipt模式定义的消息的订阅者。注意这里声明//添加业务逻辑的注释;这是开发人员可以添加他们的业务逻辑的地方。

@SpringBootApplicationpublic class Application{Private Static Final Logger logger=LoggerFactory.getLogger(Application.class);public static void Main(String[]args){SpringApplication.run(Application.class);}@Bean public Consumer<;RideReceipt>;acmeRideshareBillingReceiptCreated001Consumer(){//在此添加业务逻辑。返回NULL;}}。

您可能会说:“Marc,那太好了,但是该函数实际上是如何绑定到消息传递通道的呢?”这就是application.yml文件发挥作用的地方。

生成的application.yml文件定义了在AsyncAPI文档中或从传递到生成器的参数中指定的几项内容。首先,它定义了它希望Spring Cloud Stream在spring.cloud.Stream.function.Definition下知道的函数列表。其次,它告诉Spring Cloud Stream在spring.cloud.stream s.bindings下将这些函数绑定到哪些通道。最后,它包含到消息传递系统的连接信息。连接信息由不同的参数指定,具体取决于您选择的绑定器,但在本例中,它是在solace.java下定义的。

Spring:Cloud:Stream:Function:Definition:acmeRideshareBillingReceiptCreated001消费者绑定:acmeRideshareBillingReceiptCreated001Consumer-in-0:Destination:acme/rideshare/billing/receipt/created/0.0.1solace:Java:Host:';localhost:55555';msgVpn:Default ClientUsername:Default ClientPassword:defaultLogging:Level:Root:Info org:Sprringframework:Info。

请注意,所有这些都是为开发人员完成的,因此他们不必跟踪需要设置哪些SCST参数、将函数映射到绑定等。他们只需添加他们的业务逻辑来代替项目并点击Run!在本例中,因为它是一个Spring Boot项目,所以您可以在IDE中“作为Spring Boot应用程序运行”,甚至可以使用MVN Spring-boot:run从命令行运行。

使用AsyncAPI Spring Cloud Stream模板#︎创建微服务的有用参数和规范扩展。

正如我提到的,当涉及到从微服务生成有用的应用程序代码时,有很多复杂性。由于这些复杂性,我想我应该介绍使用AsyncAPI Spring Cloud Stream模板的一些提示、技巧和难点。

在生成代码时,您应该考虑一些不同的参数和规范扩展。所有这些参数都可以在这里找到,但我将回顾一下我经常使用的几个参数:

绑定器参数允许您指定要使用的Spring Cloud Stream绑定器。目前,发电机支持卡夫卡、兔子和安慰。

可以在AsyncAPI文档中的INFO级别设置info.x-view规范扩展。此扩展允许您定义应该如何从应用程序的角度查看文档。默认情况下,AsyncAPI规范采用客户机视图,文档中定义的操作(发布/订阅)表示应用程序接受的内容(或如何与该应用程序通信)。但是,对于代码生成,您可能希望生成应用程序实际执行的操作。这就是设置视图参数的用武之地。如果将view设置为Provider的值,则文档中定义的操作将被视为应用程序实际执行的操作。注意,这个扩展也可以使用一些生成器模板上的view参数来设置,比如Java Spring Cloud Stream one。

可以在AsyncAPI文档中的发布或订阅操作上设置Operation.x-scs-function-name规范扩展,这不仅允许您命名生成的函数,还允许您将两个操作绑定在一起,以形成一个函数,该函数订阅一个频道,并在使用相同名称时发布到另一个频道。例如,如果您的AsyncAPI文档看起来像下面的图像,那么将生成一个名为“culatePercentage”的java.util.function.Function bean,它订阅输入通道并发布到输出通道。

频道:';输入';:订阅:x-scs-函数名称:计算百分比消息:$REF:';#/components/messages/CovidTracking_SingleStateCurrentDataUpdate';';输出';:发布:x-scs-函数名称:计算百分比消息:$REF:';#/components/messages/CovidTracking_SingleStateTestPercentagesUpdate';

可以在订阅操作上指定x-scs-destination规范扩展,允许您覆盖通常与频道匹配的默认目标值。当您使用Solace绑定器并且遵循发布到主题和从队列消费的Solace模式时,这很有用。在本例中,x-scs-estination值将被视为您的微服务将从中消费的队列的名称,并且AsyncAPI文档中的通道名称将被添加为该队列的主题订阅。

还可以在订阅操作上指定x-scs-group规范扩展,允许将组添加到生成的Spring Cloud Stream绑定中。这允许使用使用者组,并将在使用Solace绑定器时创建持久队列。

使用代码生成器使用Spring Cloud Stream创建事件驱动的微服务的提示#︎。

除了配置选项之外,在使用生成器通过Spring Cloud Stream创建事件驱动的微服务时,还有一些事情需要牢记。

确保生成的POJO具有您期望的生成变量的Java类型!例如,如果您的JSON模式将属性类型定义为数字或整数,则它们将分别映射到Java中的Double或Integer。如果您想要另一种类型,如Float或Long,则需要进行更改。同样重要的是要确保密切关注表示日期和/或时间的数据,因为在默认情况下,这些数据很可能最终只是由字符串表示。

AsyncAPI SCST代码生成器尚不支持动态主题。我们将在将来对它们进行增强,以支持动态主题,但现在您需要从AsyncAPI文档中的通道中删除主题的动态片段,然后将它们添加到代码中。

在创建不包含java.util.function.Supplier的Spring Cloud Stream微服务时,包括一个Web服务器,以便微服务继续运行并侦听要处理的消息。这可以通过包括-p Actuator=true参数来实现,以包括Spring Actuator功能,该功能本身需要一个Web服务器,并且还提供一些很酷的管理和监控功能。或者,您也可以在生成Spring-boot-starter-web starter之后将其添加到您的pom中。注这不是AsyncAPI生成器模板的问题,而是Solace Spring Cloud Stream绑定器的错误,它将与使用生成器的人相关。

我希望这篇文章对您有帮助,您可以在研究完上面描述的示例后,快速开始使用Spring Cloud Stream和AsyncAPI代码生成器生成您自己的事件驱动的微服务。

您可以立即开始使用Solace PubSub+活动门户,通过注册新的云帐户免费生成您的AsyncAPI文档!

如果您有更多的问题或想要分享您使用这些工具的经验,您可以在Solace社区论坛上让我们知道,或者考虑加入我们的行列,直接为AsyncAPI计划做出贡献。