使用 Apache Camel 和 Quarkus 的微服务(一)

2023-10-07 20:20

本文主要是介绍使用 Apache Camel 和 Quarkus 的微服务(一),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【squids.cn】 全网zui低价RDS,免费的迁移工具DBMotion、数据库备份工具DBTwin、SQL开发工具等

​Apache Camel 绝非Java企业技术栈领域的新手。它由James Strachan在2007年创建,旨在实现著名的 "EIP 书"(由Gregor Hohpe和Bobby Woolf编写,Addison Wesley于2003年10月出版的企业集成模式)。在2010年初成为最受欢迎的Java集成框架之一后,Apache Camel正处于被历史所遗忘的边缘,原因是人们更青睐一种名为企业服务总线(ESB)的新架构模型,并视其为面向服务架构(SOA)的灵丹妙药。

然而,在SOA失败后,Apache Camel(与此同时,已被包括但不限于Progress Software和Red Hat的多家编辑采纳,并以商业名称如Mediation Router或Fuse进行分发)正在强势回归,并且为下一个集成的十年变得更为强大。这种复出也得益于Quarkus,这是一个新的超音速和次原子Java平台。

本文旨在提出一种非常便利的微服务实现方法,使用Apache Camel作为Java开发工具,Quarkus作为运行时,以及不同的Kubernetes(K8s)集群(从本地的Minikube到像EKS(Elastic Kubernetes Service)、OpenShift或Heroku这样的PaaS)作为基础设施。

项目概述

本项目旨在通过一个简化的货币转账应用程序来阐明相关观点,该程序包含四个微服务,具体如下:

aws-camelk-file: 该微服务轮询本地文件夹,一旦有XML文件传入,它就将其存储在一个新创建的AWS S3 bucket中,该bucket的名称以mys3开头,后接一个随机后缀。 

aws-camelk-s3: 该微服务监听首个找到的AWS S3 bucket,该bucket的名称以mys3开头。一旦有XML文件传入,它将对文件进行分割、标记化和流处理,然后将每个消息发送到名为myQueue的AWS SQS(简单队列服务)队列。 

aws-camelk-sqs: 该微服务订阅名为myQueue的AWS SQS队列上的消息,并对每个传入消息执行从XML到Java对象的解组操作,然后将其组织为JSON格式,再将其发送到下面的REST服务。 

aws-camelk-jaxrs: 该微服务提供了一个REST API,具有用于创建、读取、更新和删除货币转账订单的端点。它接收/生成JSON输入/输出数据。它使用一个服务,该服务展现了由aws-camelk-api模块定义的接口。可能存在此接口的多个实现,但为简单起见,在当前情况下,我们使用由aws-camelk-provider模块定义并命名为DefaultMoneyTransferProvider的实现,该实现仅在内存哈希图中处理货币转账订单请求。 

项目的源代码可以在此处找到。这是一个多模块的Maven项目,下面解释了各个模块。下面显示了最重要的Maven依赖项:

  <dependencyManagement>    <dependencies>      <dependency>        <groupId>io.quarkus.platform</groupId>        <artifactId>quarkus-bom</artifactId>        <version>${quarkus.platform.version}</version>        <type>pom</type>        <scope>import</scope>      </dependency>      <dependency>        <groupId>io.quarkus.platform</groupId>        <artifactId>quarkus-camel-bom</artifactId>        <version>${quarkus.platform.version}</version>        <type>pom</type>        <scope>import</scope>      </dependency>      <dependency>        <groupId>com.amazonaws</groupId>        <artifactId>aws-java-sdk-bom</artifactId>        <version>1.12.454</version>        <type>pom</type>        <scope>import</scope>      </dependency>    </dependencies>  </dependencyManagement>

模块 aws-camelk-model 

此模块定义了应用程序的域,该域由诸如MoneyTransfer、Bank、BankAddress等业务对象组成。集成应用的特点之一是其业务域是遗留的,通常是几十年前由忽略了您作为软件开发者当前正在使用的工具集的业务分析师和专家设计的。这种遗留以各种形式存在,如Excel表格以及CSV或XML文件。

因此,我们在这里考虑了一个典型的情景,根据该情景,我们的域模型被定义为XML语法,由一对XSD文件定义。这些XSD文件位于src/main/resources/xsd目录中,并由jaxb2-maven-plugin处理,以生成相关联的Java对象。下面的列表显示了插件的配置:

      <plugin><groupId>org.codehaus.mojo</groupId><artifactId>jaxb2-maven-plugin</artifactId><dependencies><dependency><groupId>org.jvnet.jaxb2_commons</groupId><artifactId>jaxb2-value-constructor</artifactId><version>3.0</version></dependency></dependencies><executions><execution><goals><goal>xjc</goal></goals></execution></executions><configuration><packageName>fr.simplex_software.quarkus.camel.integrations.jaxb</packageName><sources><source>${basedir}/src/main/resources/xsd</source></sources><arguments><argument>-Xvalue-constructor</argument></arguments><extension>true</extension></configuration></plugin>

在这里,我们运行xjc模式编译器工具,在目标包fr.simplex_software.quarkus.camel.integrations.jaxb中基于项目的src/main/resources/xsd目录中的XSD模式生成Java类。默认情况下,这些自动生成的Java对象具有JAXB(Java Architecture for XML Binding)注释,但没有构造函数,这使得它们有点难以使用,特别是对于必须通过setter实例化的具有许多属性的类。因此,在上面的列表中,我们将jaxb2-maven-plugin配置为依赖于jaxb3-value-constructor工件。通过这样做,我们要求xjc编译器为每个随后的JAXB处理类生成完整参数构造函数。

此模块的最终结果是一个JAR文件,其中包含我们的领域模型,形式为Java类层次结构,所有其他应用程序模块将其用作依赖项。这种方法比手动实现(再次,用Java)由XML语法已经定义的域对象的方法更为实用。

模块 aws-camelk-api 

此模块非常简单,因为它仅由一个接口组成。这个接口名为MoneyTransferFacade,是由资金转账服务公开的接口。此服务必须实现公开的接口。实际上,这样的服务可能有许多不同的实现,具体取决于资金转移的性质、银行、客户类型以及许多其他可能的条件。在我们的例子中,我们只考虑了该接口的简单实现,如下一节所示。

模块 aws-camelk-provider 

此模块为MoneyTransferFacade接口定义了服务提供商。在这里使用的SPI(Software Provider Interface,软件提供商接口)模式是非常强大的,它允许将服务接口与其实现解耦。

我们对MoneyTransferFacade接口的实现是DefaultMoneyTransferProvider类,它也非常简单,因为它只是在内存哈希映射中创建、读取、更新和删除资金转账订单。

模块 aws-camelk-jaxrs 

与仅仅是通用类库的前面几个模块不同,此模块和接下来的模块是Quarkus可运行服务。这意味着它们使用quarkus-maven-plugin来创建一个可执行的JAR。

如其名称所示,此模块公开了一个JAX-RS(Java API for RESTful Web Services)API来处理资金转账订单。Quarkus带有RESTeasy,这是Red Hat对JAX-RS规范的完全实现,这就是我们在这里使用的。

就MoneyTransferResource类而言,没有什么特别的要提及的,该类实现了REST API。它提供了创建、读取、更新和删除资金转账订单的端点,并且额外提供了两个端点,目的是检查应用程序的活动状态和准备状态。

模块 aws-camelk-file 

此模块是Camel管道中的第一个模块,由此模块将包含资金转账订单的XML文件从其初始登陆目录传送到REST API,该API代表服务提供商处理它们。它使用Camel Java DSL(Domain Specific Language,领域特定语言)来执行此操作,如下面的列表所示:

fromF("file://%s?include=.*.xml&delete=true&idempotent=true&bridgeErrorHandler=true", inBox).doTry().to("validator:xsd/money-transfers.xsd").setHeader(AWS2S3Constants.KEY, header(FileConstants.FILE_NAME)).to(aws2S3(s3Name + RANDOM).autoCreateBucket(true).useDefaultCredentialsProvider(true)).doCatch(ValidationException.class).log(LoggingLevel.ERROR, failureMsg + " ${exception.message}").doFinally().end();

该代码轮询一个输入目录,该目录被定义为一个外部属性,以检查任何XML文件(具有.xml扩展名的文件)的存在。一旦这样的文件落在给定的目录中,它将根据src/main/resources/xsd/money-transfers.xsd文件中定义的模式进行验证。如果验证有效,它将被存储在一个AWS S3存储桶中,其名称被计算为等于外部定义的常量,后跟一个随机后缀。所有内容都封装在一个try...catch结构中,以一致地处理异常情况。

在这里,为了定义外部属性,我们使用由Quarkus实现的Eclipse MP配置规范(以及其他规范),如下面的列表所示:

 private static final String RANDOM = new Random().ints('a', 'z').limit(5).collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append).toString();@ConfigProperty(name="inBox")String inBox;@ConfigProperty(name="s3Name")String s3Name;

后缀RANDOM代表类java.util.Random和属性生成inBox ,并s3Name从文件中注入src/resource/application.properties。使用由常量和随机后缀组成的S3存储桶名称的原因是AWS S3存储桶需要具有跨区域唯一的名称,因此,我们需要这样的随机后缀来保证唯一性。

模块aws-camelk-s3

该模块实现了一个 Camel 路由,每当文件到达专用 S3 存储桶时,AWS 基础设施就会触发该路由。这是代码:

    from(aws2S3(s3BucketName).useDefaultCredentialsProvider(true))      .split().tokenizeXML("moneyTransfer").streaming()      .to(aws2Sqs(queueName).autoCreateQueue(true).useDefaultCredentialsProvider(true));

一旦触发,Camel 路由会在对输入 XML 文件进行标记后按顺序对其进行拆分。这个想法是,输入文件可能包含多个汇款订单,并且这些订单将被单独处理。queueName因此,从此标记化和拆分过程发出的每个汇款订单都会发送到 AWS SQS 队列,该队列的名称由从文件注入的属性值指定application.properties。

模块aws-camelk-sqs

这是我们的 Camel 管道的最后一个模块。

    from(aws2Sqs(queueName).useDefaultCredentialsProvider(true))      .unmarshal(jaxbDataFormat)      .marshal().json(JsonLibrary.Jsonb)      .setHeader(Exchange.HTTP_METHOD, constant("POST"))      .to(http(uri));

此 Camel 路由订阅 AWS SQS 队列,其名称由属性指定queueName,并将收到的每条 XML 消息解组为 Java 对象。鉴于每个 XML 消息都包含一个汇款订单,它在相应的MoneyTransferJava 类实例中被解组。然后,一旦解组,每个MoneyTransferJava 类实例就会再次编组到 JSON 有效负载中。这是必需的,因为我们的 REST 接口使用 JSON 有效负载,并且与能够自动执行从 Java 对象到 JSON 的转换的标准 JAX-RS 客户端相反,http()这里使用的 Camel 组件不是。因此,我们需要手动完成。通过将交换的标头设置为 POST 常量,我们设置将发送到 REST API 的 HTTP 请求的类型。最后但并非最不重要的一点是,端点 URI 像往常一样从文件中作为外部定义的属性注入application.properties。

单元测试

在部署和运行微服务之前,我们需要对它们进行单元测试。该项目包括几乎所有模块的几个单元测试 - 从aws-camelk-model测试域模型,以及从/到 XML/Java 的各种转换,到aws-camelk-jaxrs,这是我们的终点微服务。运行单元测试很简单。只需执行:


$ cd aws-camelk
$ ./delete-all-buckets.sh  #Delete all the buckets named "mys3*" if any
$ ./purge-sqs-queue.sh  #Purge the SQS queue named myQueue if it exists and isn't empty
$ mvn clean package  #Clean-up, run unit tests and create JARs

完整的单元测试报告将由maven-surefile-plugin. 为了使单元测试按预期运行,需要一个 AWS 帐户,并且应在本地机器上安装和配置 AWS CLI。这意味着该文件除其他外还~/.aws/credentials包含您的aws_access_key_id和aws_secret_access_key properties及其关联值。

原因是单元测试使用AWS SDK(软件开发工具包)来处理S3存储桶和SQS队列,这使得它们不完全是单元测试,而是单元测试和集成测试的组合。

部署和运行

现在,要部署和运行我们的微服务,我们需要考虑许多不同的情景 - 从简单的本地独立执行到像OpenShift或EKS这样的PaaS部署,再到像Minikube这样的本地K8s集群。因此,为了避免在这里产生一些混淆,我们更倾向于为每种部署情景单独撰写一篇文章。

所以请关注下一篇文章。

作者:Nicolas Duminil

更多内容请关注公号【云原生数据库

squids.cn,云数据库RDS,迁移工具DBMotion,云备份DBTwin等数据库生态工具。

这篇关于使用 Apache Camel 和 Quarkus 的微服务(一)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/160214

相关文章

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

pdfmake生成pdf的使用

实际项目中有时会有根据填写的表单数据或者其他格式的数据,将数据自动填充到pdf文件中根据固定模板生成pdf文件的需求 文章目录 利用pdfmake生成pdf文件1.下载安装pdfmake第三方包2.封装生成pdf文件的共用配置3.生成pdf文件的文件模板内容4.调用方法生成pdf 利用pdfmake生成pdf文件 1.下载安装pdfmake第三方包 npm i pdfma

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【区块链 + 人才服务】可信教育区块链治理系统 | FISCO BCOS应用案例

伴随着区块链技术的不断完善,其在教育信息化中的应用也在持续发展。利用区块链数据共识、不可篡改的特性, 将与教育相关的数据要素在区块链上进行存证确权,在确保数据可信的前提下,促进教育的公平、透明、开放,为教育教学质量提升赋能,实现教育数据的安全共享、高等教育体系的智慧治理。 可信教育区块链治理系统的顶层治理架构由教育部、高校、企业、学生等多方角色共同参与建设、维护,支撑教育资源共享、教学质量评估、

git使用的说明总结

Git使用说明 下载安装(下载地址) macOS: Git - Downloading macOS Windows: Git - Downloading Windows Linux/Unix: Git (git-scm.com) 创建新仓库 本地创建新仓库:创建新文件夹,进入文件夹目录,执行指令 git init ,用以创建新的git 克隆仓库 执行指令用以创建一个本地仓库的

【北交大信息所AI-Max2】使用方法

BJTU信息所集群AI_MAX2使用方法 使用的前提是预约到相应的算力卡,拥有登录权限的账号密码,一般为导师组共用一个。 有浏览器、ssh工具就可以。 1.新建集群Terminal 浏览器登陆10.126.62.75 (如果是1集群把75改成66) 交互式开发 执行器选Terminal 密码随便设一个(需记住) 工作空间:私有数据、全部文件 加速器选GeForce_RTX_2080_Ti