当前位置: 首页 > 科技观察

超快微服务:当Microstream遇上Wildfly_0

时间:2023-03-23 11:50:01 科技观察

译者|朱刚点评|孙淑娟超快系列第二篇,你将学习一个新的数据库,可以让你的微服务运行在Java世界中快速扩展!第一部分可以在以下位置找到:Java中的超快微服务:当Microstream遇到OpenLiberty时,当我们谈论创建可扩展的应用程序时,微服务已成为流行语。但这就够了吗?答案是否定的,并且像任何软件架构决策一样,它需要权衡和一些挑战。对于我们Java开发者来说,Microstream和MicroProfile这两个工具的结合让我们的工作更加轻松。本文将介绍如何结合Microstream和Wildfly来创建稳定且极速的微服务应用程序。使用Wildfly的微服务作为迈向分布式系统的第一步,微服务对软件工程师提出了挑战。在Java世界中,有几种工具可以让我们的生活更轻松,尤其是MicroProfile。MicroProfile的目标是针对微服务架构优化企业Java。它基于JavaEE/JakartaEE标准和专用于微服务的API,例如RESTClient、Configuration、OpenAPI等。Wildfly是一个功能强大、模块化和轻量级的应用服务器,可帮助您构建令人惊叹的应用程序。Microstream的数据持久化速度当我们谈论微服务时,我们谈论的是分布式系统以及随之而来的挑战,这在持久层也是一样的。不幸的是,我们没有足够的文章来谈论它。当你有很多关于业务的不确定信息时,我们应该有一个模型,甚至是一个无模式的数据库。尽管如此,持久层还是有很多问题,主要是因为它很难改变。制作可伸缩应用程序的秘诀之一是无状态,但我们不能在持久层中使用它。首先,数据库旨在保存信息及其状态。使数据持久层更高效的解决方案之一是直接与Java实体集成为图形,这就是Microstream所做的。Microstream使用纯Java实现超快的内存数据处理。它提供微秒级查询时间、低延迟数据访问、巨大的数据吞吐量和工作负载。因此,它节省了大量的CPU功率、CO2排放量和数据中心成本。显示代码让我们将两者结合起来,制作一个超快的微服务。我们将选择一个简单的演示来展示两者如何结合在一起。在此示例中,我们将创建一个包含产品、名称和评级的简单CRUD,并将其导出为RESTAPI。第一步是创建MicroProfile骨架:它毫不费力且流畅,主要是因为我们可以使用可视化MicroProfile启动器。使用Java11和Wildfly设置Microprofile4.1版,如下图所示:我们拥有应用程序的骨架。下一步是添加Microstream并使两者协同工作。幸运的是,有一个库通过CDI扩展将两者集成在一起。因此,由于这个API,任何具有CDI和MicroProfileConfig的应用程序都可以工作。1.2.one.microstream3.microstream-integrations-cdi4.LAST_VERSION_HERE5.框架已设置,让我们从代码开始。模型是核心部分。这是一个很顺利的例子,我们将创建一个包含多个字段的产品实体。使用Microstream的主要建议是使用不可变实体。因此,我们将创建一个产品作为一个不可变的实体。1.publicclassProduct{2.privatefinallongid;3.私有最终字符串名称;4.privatefinal字符串描述;5.私人最终内部评级;6.7.@JsonbCreator8.publicProduct(9.@JsonbProperty("id")finallongid,10.@JsonbProperty("name")finalStringname,11.@JsonbProperty("description")finalStringdescription,12.@JsonbProperty("rating")finalintrating){13.//...14.}15.16.}JSON注释只告诉MicroProfile如何将实体序列化为JSON。下一步是定义产品集合,我们称之为库存。库存类是一组具有多种操作方法的产品。这个类是实体和Microstream引擎之间的链接。与Microstream的连接将使用存储注释。1.导入java.util.Collections;2.导入java.util.HashSet;3.导入java.util.Objects;4.导入java.util.Optional;5.导入java.util.Set;6.导入java.util.function.Predicate;7.8.importone.microstream.integrations.cdi.types.Storage;9.10.11.@Storage12.publicclassInventory{13.privatefinalSetproducts=newHashSet<>();14.15.publicvoidadd(finalProductproduct){16.Objects.requireNonNull(product,"productisrequired");17.this.products.add(产品);18.}19.20.publicSetgetProducts(){21.returnCollections.unmodifiableSet(this.products);22.}23.24.publicOptionalfindById(finallongid){25.returnthis.products.stream().filter(this.isIdEquals(id)).limit(1).findFirst();26.}27.28.publicvoiddeleteById(finallongid){29.this.products.removeIf(this.isIdEquals(id));30.31.}32.33.privatePredicateisIdEquals(finallongid){34.returnp->p.getId()==id;35.}36.37.@Override38.publicbooleanequals(Objecto){39.if(this==o)returntrue;40.if(o==null||getClass()!=o.getClass())返回false;41.库存inventory=(Inventory)o;42.返回对象。等于(产品,库存。产品);43.}44.45.@Override46.publicinthashCode(){47.返回对象。哈希(产品);48.}49.50.@Override51.publicStringtoString(){52.return"Inventory{"+53."products="+products+54.'}';55.}56.}集合准备就绪后,让我们创建存储库以使用我们的Inventory类,我们可以在CDI中使用Inject注释。我们需要将此操作提交给将更改此集合的每个操作。对于任何可以改变manifest的方法,都有Store注解自动帮我们处理。1.publicinterfaceProductRepository2.{3.CollectiongetAll();4.5.产品保存(Productitem);6.7.可选findById(longid);8.9.voiddeleteById(longid);10.}11.12.13.@ApplicationScoped14.publicclassProductRepositoryStorageimplementsProductRepository{15.privatestaticfinalLoggerLOGGER=Logger.getLogger(ProductRepositoryStorage.class.getName());16.17.@Inject18.privateInventory库存;19.20.@Override21.publicCollectiongetAll(){22.returnthis.inventory.getProducts();23.}24.25.@Override26.@Store27.publicProductsave(finalProductitem){28.this.inventory.add(item);29.退货;30.}31.32.@Override33.publicOptionalfindById(finallongid){34.LOGGER.info("通过id查找项目:"+id);35.返回this.inven故事.findById(id);36.}37.38.@Override39.@Store40.publicvoiddeleteById(finallongid){41.this.inventory.deleteById(id);42.}43.}最后一步是将此产品公开为RestAPI然后我们将使用JakartaEEAPI返回MicroProfile:JAX-RS。接下来,我们将使用MicroProfile创建OpenAPI文档。1.@RequestScoped2.@Path("products")3.@Consumes(MediaType.APPLICATION_JSON)4.@Produces(MediaType.APPLICATION_JSON)5.publicclassProductController6.{7.@Inject8.privateProductRepository存储库;9.10.//TODO不要担心分页11.@GET12.publicCollectiongetAll()13.{14.returnthis.repository.getAll();15.}16.17.@GET18.@Path("{id}")19.@Operation(summary="通过id查找产品",description="通过id查找产品")20.publicProductfindById(@PathParam("id")finallongid)21.{22.returnthis.repository.findById(id).orElseThrow(23.()->newWebApplicationException("Thereisnoproductwiththeid"+id,响应.Status.NOT_FOUND));24.}25.26.@POST27.publicResponseinsert(finalProductproduct)28.{29.returnResponse.status(Response.Status.CREATED).entity(this.repository.save(product)).build();30.}31.32.@DELETE33.@Path("{id}")34.publicResponsedelete(@PathParam("id")finallongid){35.this.repository.deleteById(id);36.returnResponse.status(Response.Status.NO_CONTENT).build();37.}38.39.}就是这样!我们可以测试正在运行的应用程序并查看结果1.mvncleanpackage2.java-jartarget/wildfly-example-bootable.jar3.4.curl--location--requestPOST'http://localhost:8080/products/'\5.--header'Content-Type:application/json'\6.--data-raw'{"id":1,"name":"banana","description":"afruit","rating":5}'7.8.curl--location--requestPOST'http://localhost:8080/products/'\9.--header'Content-Type:application/json'\10.--data-raw'{"id":2,"name":"watermelon","description":"watermelonsugarahh","rating":4}'我们终于实现了Wildfly和Microstream的集成。本教程展示了两者如何协同工作,并为您提供了一个解决持久性问题的新工具:Microstream。事实上,当您想要创建微服务以超快运行时,Microstream和Wildfly是很好的盟友。译者介绍朱刚,社区编辑,2021IT影响力专家博主,阿里云专家博主,2019CSDN博客之星Top20,2020腾讯云+社区优秀作者,11年一线开发经验,曾参与猎头服务网站架构设计、企业智能客服及大型电子政务系统开发,主导某大型央企内部防泄密及电子文档安全监控系统建设,目前在北京途家健康从事医疗软件研发。原标题:极速微服务:当Microstream遇见Wildfly,作者:OtavioSantana