超快微服务:当Microstream遇上Wildfly

动手实践 MicroStream:Java 持久性的新方法 因此,像 AWS S3 这样的数据库、文件系统或云对象存储都可以像使用 MariaDB 一样使用,除了存储的配置方式。当我们在没有参数的情况下调用时,它会创建一个具有默认值的新 MicroStream 引擎,包括默认文件存储位置和持久性策略。你会注意到,如果你使用参数运行程序,它会保存字符串列表,如果你在没有参数的情况下运行它,它会从存储中提取它们并显示它们。然后,我们将根对象设置为我们的列表。现在,可以使用清单 8 中所示的相同命令运行应用程序,并将状态持久化到 MariaDB 的本地实例中。 阅读详情

当我们谈论创建可扩展的应用程序时,微服务已成为一个流行语。但这足够了吗?答案是否定的,与任何软件架构决策一样,它也有一个权衡和几个挑战。对于我们Java开发人员来说,这两种工具的组合使我们的工作更轻松:Microstream和MicroProfile。本文将介绍如何结合Microstream和 Wildfly 来创建一个性能稳定且速度极快的微服务应用程序。

使用 Wildfly 的微服务

作为面对分布式系统的第一步,微服务为软件工程师带来了挑战。在Java世界中,有几种工具可以使我们的生活更轻松,尤其是MicroProfile。

MicroProfile 的目标是针对微服务架构优化企业版Java。它基于Java EE / Jakarta EE标准以及专门用于微服务的API,例如REST Client、 Configuration、 Open API等。

Wildfly是一个功能强大,模块化和轻量级的应用程序服务器,可帮助你构建令人惊叹的应用程序。

使用Microstream实现数据持久化速度

当我们谈论微服务时,我们谈论的是分布式系统及其带来的挑战,这在持久性层中也是一样的。

不幸的是,我们没有足够的文章来谈论它。当你对业务有很多不确定的信息时,我们应该有一个模型,甚至是无模式数据库。尽管如此,持久性层仍然存在很多问题,主要是因为它难以更改。

制作可扩展应用程序的秘诀之一是无状态,但我们在持久性层中负担不起它。首先,数据库旨在保存信息及其状态。

使数据持久化层更高效的解决方案之一是直接与 Java 实体集成为图表,这就是Microstream所做的。

Microstream使用纯Java实现了超快速的内存数据处理。它提供微秒级查询时间、低延迟数据访问、巨大的数据吞吐量和工作负载。因此,它节省了大量的CPU功率,二氧化碳排放和数据中心的成本。

显示代码

让我们将两者结合起来,制作一个Ultra-Fast Microservices。我们将选择一个简单的演示来展示两者如何结合。在此示例中,我们将创建一个简单的 CRUD,其中包含产品、名称和评级,并将其导出为 REST API。

第一步是创建MicroProfile骨架:它毫不费力且流畅,主要是因为我们可以使用可视化MicroProfile启动器。将 Microprofile 版本 4.1 与 Java 11 和 Wildfly 一起设置,如下图所示:

我们已有了应用程序的骨架。下一步是添加Microstream并使两者协同工作。幸运的是,有一个库可以通过CDI扩展集成两者。因此,借助此API,任何具有CDI和MicroProfile Config的应用程序都可以工作。

1.<dependency>  
2.     <groupId>one.microstream</groupId>  
3.     <artifactId>microstream-integrations-cdi</artifactId>  
4.     <version>LAST_VERSION_HERE</version>  
5. </dependency>  

框架已设置,让我们从代码开始。模型是中心部分。它是一个平滑的示例,我们将创建一个包含几个字段的产品实体。使用Microstream的主要建议是使用不可变实体。因此,我们将创建一个产品作为不可变实体。

1.public class Product {  
2.    private final long id;  
3.    private final String name;  
4.    private final String description;  
5.    private final int rating;  
6.  
7.    @JsonbCreator  
8.    public Product(  
9.            @JsonbProperty("id") final long id,  
10.            @JsonbProperty("name") final String name,  
11.            @JsonbProperty("description") final String description,  
12.            @JsonbProperty("rating") final int rating){  
13.            //...  
14.            }  
15.  
16.} 

JSON注释只告知MicroProfile如何将实体序列化为JSON。下一步是定义产品集合,我们称之为库存。库存类是具有多种操作方法的一组产品。此类是实体与Microstream引擎之间的链接。与Microstream 的连接将使用Storage 注解。

1.import java.util.Collections;  
2.import java.util.HashSet;  
3.import java.util.Objects;  
4.import java.util.Optional;  
5.import java.util.Set;  
6.import java.util.function.Predicate;  
7.  
8.import one.microstream.integrations.cdi.types.Storage;  
9.  
10.  
11.@Storage  
12.public class Inventory {  
13.    private final Set<Product> products = new HashSet<>();  
14.  
15.    public void add(final Product product) {  
16.        Objects.requireNonNull(product, "product is required");  
17.        this.products.add(product);  
18.    }  
19.  
20.    public Set<Product> getProducts() {  
21.        return Collections.unmodifiableSet(this.products);  
22.    }  
23.  
24.    public Optional<Product> findById(final long id) {  
25.        return this.products.stream().filter(this.isIdEquals(id)).limit(1).findFirst();  
26.    }  
27.  
28.    public void deleteById(final long id) {  
29.        this.products.removeIf(this.isIdEquals(id));  
30.  
31.    }  
32.  
33.    private Predicate<Product> isIdEquals(final long id) {  
34.        return p -> p.getId() == id;  
35.    }  
36.  
37.  @Override  
38.  public boolean equals(Object o) {  
39.    if (this == o) return true;  
40.    if (o == null || getClass() != o.getClass()) return false;  
41.    Inventory inventory = (Inventory) o;  
42.    return Objects.equals(products, inventory.products);  
43.  }  
44.  
45.  @Override  
46.  public int hashCode() {  
47.    return Objects.hash(products);  
48.  }  
49.  
50.  @Override  
51.  public String toString() {  
52.    return "Inventory{" +  
53.        "products=" + products +  
54.        '}';  
55.  }  
56.}  

集合准备就绪后,让我们创建存储库。要使用我们的 Inventory 类,我们可以使用 CDI 中的 Inject 注释。我们需要将此操作提交到将要更改此集合的每个操作。对于任何可以更改清单的方法,都有Store注解为我们自动处理它。

1.public interface ProductRepository  
2.{  
3.  Collection<Product> getAll();  
4.    
5.  Product save(Product item);  
6.    
7.  Optional<Product> findById(long id);  
8.    
9.  void deleteById(long id);  
10.}  
11.  
12.  
13.@ApplicationScoped  
14.public class ProductRepositoryStorage implements ProductRepository {  
15.    private static final Logger LOGGER = Logger.getLogger(ProductRepositoryStorage.class.getName());  
16.  
17.    @Inject  
18.    private Inventory inventory;  
19.    
20.    @Override  
21.    public Collection<Product> getAll() {  
22.        return this.inventory.getProducts();  
23.    }  
24.  
25.    @Override  
26.    @Store  
27.    public Product save(final Product item) {  
28.        this.inventory.add(item);  
29.        return item;  
30.    }  
31.  
32.    @Override  
33.    public Optional<Product> findById(final long id) {  
34.        LOGGER.info("Finding the item by id: " + id);  
35.        return this.inventory.findById(id);  
36.    }  
37.  
38.    @Override  
39.    @Store  
40.    public void deleteById(final long id) {  
41.        this.inventory.deleteById(id);  
42.    }  
43.}  

最后一步是将此产品公开为 Rest API。然后,我们将使用Jakarta EE API返回MicroProfile:JAX-RS。接下来,我们将使用 MicroProfile 创建 Open API 文档。

1.@RequestScoped  
2.@Path("products")  
3.@Consumes(MediaType.APPLICATION_JSON)  
4.@Produces(MediaType.APPLICATION_JSON)  
5.public class ProductController  
6.{  
7.  @Inject  
8.  private ProductRepository repository;  
9.    
10.  // TODO don't worried about pagination  
11.  @GET  
12.   public Collection<Product> getAll()  
13.  {  
14.    return this.repository.getAll();  
15.  }  
16.    
17.  @GET  
18.  @Path("{id}")  
19.  @Operation(summary = "Find a product by id", description = "Find a product by id")  
20.   public Product findById(@PathParam("id") final long id)  
21.  {  
22.    return this.repository.findById(id).orElseThrow(  
23.      () -> new WebApplicationException("There is no product with the id " + id, Response.Status.NOT_FOUND));  
24.  }  
25.    
26.  @POST  
27.  public Response insert(final Product product)  
28.  {  
29.    return Response.status(Response.Status.CREATED).entity(this.repository.save(product)).build();  
30.  }  
31.    
32.  @DELETE  
33.  @Path("{id}")  
34.   public Response delete(@PathParam("id") final long id){  
35.    this.repository.deleteById(id);  
36.    return Response.status(Response.Status.NO_CONTENT).build();  
37.  }  
38.    
39.}  

就是这样!我们可以测试运行的应用程序并检查结果。

1.mvn clean package  
2.java -jar target/wildfly-example-bootable.jar  
3.  
4.curl --location --request POST 'http://localhost:8080/products/' \  
5.--header 'Content-Type: application/json' \  
6.--data-raw '{"id": 1, "name": "banana", "description": "a fruit", "rating": 5}'  
7.  
8.curl --location --request POST 'http://localhost:8080/products/' \  
9.--header 'Content-Type: application/json' \  
10.--data-raw '{"id": 2, "name": "watermelon", "description": "watermelon sugar ahh", "rating": 4}'  

我们最终在Wildfly和Microstream之间实现了集成。本教程展示了两者如何协同工作,并为你提供了一种应对持久性问题的新工具:Microstream。事实上,当你想要创建微服务来超快地运行它时,Microstream和Wildfly是很好的盟友。

 

专题一:Labview表格控件 及 应用(三)在表格中插入一行数据 专题一:Labview表格控件 及 应用(三) 在表格中插入一行数据 最近一段时间,做试验台上位机编程,老是用到表格控件,这几天抽时间专门写一个表格控件的专题。有用到的朋友可以参考一下。 今天接着讲一下,表格控件的数据插入,和相关的操作 1.表格控件的数据插入原理: 表格控件是一个 2D 字符串数组。 在表格插入一行,就是在2D数组插入一行。 行、列插入类似** 以下以成绩录入为例说明 2.1 不要表头直接插入 知识点1:创建数组:把数学,语文,英语三个数值,连成一个一位数组(数值型)。 知 阅读详情

相关推荐

浅谈功放PA的VBW

摘要:VBW(视频带宽)反映功放的宽带非线性特性和记忆效应,影响数字预失真(DPD)校正能力。其成因是功放管寄生参数(如Cshunt和Leff)形成低频并联谐振,导致供电臂阻抗增大,引发电压波动和记忆效应。测试方法包括双音IM3/IM5测试(以两侧IM3差≥3dB定义VBW)和魔T测试(通过S21曲线测量谐振频率)。改善措施主要是减小Leff,如采用双电源平衡馈电。VBW指标要求通常为魔T测试结果大于3倍信号带宽,以确保功放线性度。

weixin_49761275的博客 1574

基准测试:Java 8 Lambda和流如何使您的代码慢5倍

与长期的实现相比,Java 8 lambda和流的性能如何? Lambda表达式和流在Java 8中受到了热烈的欢迎。这些是迄今为止很激动人心的功能,很长一段时间以来,它们就已经应用到Java中了。 新的语言功能使我们可以在代码中采用更具功能性的样式,并且在其中玩耍也很有趣。 非常有趣,应该是非法的。 然后我们变得可疑 ,并决定对它们进行测试。 我们已经完成了一个简单的任务,即在Ar...

最佳 Java 编程 331

OFDR解调全同弱反射光纤阵列

全同弱反射光纤光栅阵列是在一根光纤上密集刻写波长相同的WFBG,由于每个光栅的反射都比较弱,可实现一根光纤上复用成千上万个光栅,阵列上每个光栅栅区长度相同,相邻光栅之间栅距相同,呈周期性分布。2、获取测量信号:对弱栅阵列加载状态下,使用OFDR系统再次获取弱栅时域曲线,为测量信号。(这里需要注意的是对弱栅阵列加载后,不能使弱栅中心波长漂移到激光器波长扫描范围之外,若超出范围则OFDR技术不能获取弱栅反射信号,因此在选择弱栅阵列波长时尽量让其中心波长在激光器波长扫描范围中间,确保温度/应变测量范围。

m0_69386663的博客 1956

不可不知的八个出色的Java项目

Java生态系统里面有形形色色、五花八门的开源项目,这些项目是为了满足各种可以想象到的需求而开发的。我们很容易错过其中一些出色的项目。下面介绍七个开源Java项目,从全栈应用程序开发、微服务、Wasm到JVM替代方案,各种需求都能满足。

xuxian的博客 4065

一文搞懂雷达脉冲压缩和匹配滤波器

为了解决传统单频脉冲雷达面临的作用距离和空间分辨力之间的矛盾,脉冲压缩理论被提出。在接收端设计一个和发射信号能够“共轭匹配”的网络来实现脉冲压缩。接收到的回波信号通过匹配滤波器时,滤波器的增益在信号越强的频率点越大;在信号越弱的频率点,增益越小,通过这样的方式使信号在时域更加集中。脉冲压缩技术大致可分为线性调频(LFM)和相位编码。其中LFM信号易于通过硬件或各种技术产生,但是进行匹配滤波后主旁瓣比高达13.2dB,在检测多个目标时,强目标的回波旁瓣可能会把弱小信号覆盖,导致弱小信号的检测受到影响。

FPGA入门到跑路 9937

【实战指南】WinPE环境下360系统急救箱的病毒查杀全流程解析

本文详细解析了在WinPE环境下使用360系统急救箱进行病毒查杀的全流程。从制作WinPE启动盘到进入PE环境,再到360急救箱的深度使用和系统修复,提供了实用技巧和常见问题解决方案,帮助用户高效清除顽固病毒。

weixin_28568819的博客 537

【无标题】

MicroStream 是一个高性能的内存中 NoSQL 数据库平台,用于超快的数据处理和存储。它通过消除面向对象的编程语言和关系数据库之间对转换层的需求来帮助减少对象关系阻抗不匹配,从而提高了生产力和性能。通过将 MicroStream 的强大功能与 Jakarta NoSQL 和 Jakarta Data 提供的标准 API 相结合,开发人员可以创建强大且可扩展的应用程序,轻松处理大量数据。

weixin_56863624的博客 409

ANSYS Fluent 2023R2实战:用欧拉多相流模型搞定流化床模拟(附详细参数避坑)

本文详细解析了ANSYS Fluent 2023R2中欧拉多相流模型在流化床模拟中的应用,包括模型选择、材料属性设置、相间作用力配置及初始化技巧。特别针对高颗粒浓度工况提供参数优化方案,帮助工程师提升模拟精度与效率,适用于化工、能源等领域的流化床反应器设计。

weixin_30938149的博客 269

launch参数JAVA_javafx主要方法launch(args)如何工作? - java

main方法中未提及main方法之外的方法。主要方法仅包含launch(args);我以为需要在方法之外调用使其在程序中起作用的方法?那么launch(args)如何工作?参考方案如果您在Netbeans中打开JavaFX模板,则会有一个JavaDoc对其进行解释:/*** The main() method is ignored in correctly deployed JavaFX appl...

weixin_28900989的博客 2397

【原创理论】Stochastic Coupled Dyadic System (SCDS):一个用于两性关系动力学建模的随机耦合系统框架

基于二人爱情耦合系统动力学、稳定性与最优策略的综合性理论的数值模拟与分析

weixin_44695861的博客 1134

GPS数据处理必备:IGS精密星历下载与使用全攻略(附武汉大学/CDDIS/CODE/GFZ地址)

本文为GPS/GNSS数据处理者提供了IGS精密星历的完整下载与使用指南。详细解析了最终、快速、超快速三种精密星历产品的区别与选择策略,并手把手教学如何从武汉大学、CDDIS、CODE、GFZ四大主流数据中心高效获取数据,涵盖文件命名规则解析及自动化下载脚本,助力科研与工程应用。

weixin_29234239的博客 683

Wildfly 19:MicroProfile 3.3平台规范支持

Wildfly应用程序服务器是一种灵活,轻量级的托管应用程序运行时,可帮助用户创建应用程序。 Wildfly具有启动时间短,内存占用少和活动内存管理以及可自定义的运行时的特点。 自 2020年3月18日起, Wildfly 19 Final即可进行Beta版测试,并可供下载。感谢社区的帮助,此版本发布了。 #WildFly 19已发布,支持Eclipse MicroProfile 3...

420

华为OD机试真题 新系统2026-04-08 C++ 实现【直捣黄龙】

小王在玩一款叫做直捣黄龙的小游戏,在该游戏中他需要从入口位置进入敌营,绕过哨兵的层层封锁,达到敌军司令部实施斩首行动。 敌军阵营是一个n*n的矩阵,入口在坐标(0,n/2),敌军司令部在坐标(n-1,n/2),每个 哨兵警戒以自己为中心的9宫格,一旦被哨兵发现则行动失败。

MISAYAONE的博客 261

WildFly 31支持Jakarta EE 10和新的WildFly Glow资源调配工具

WildFly 31还实现了大多数核心MicroProfile规范,放弃了对MicroProfile Metrics的支持,转而支持Micrometer,使其与MicroProfile规范不兼容。WildFly社区发布了WildFly 31,它提供了对Jakarta MVC 2.1(一种CLI工具)和WildFly Glow(一种Maven插件)的支持,后者分析子系统的使用情况,并建议使用更轻量级的运行时,例如在Docker容器中运行。WildFly核心现在还支持JDK 21,这是JDK的最新LTS版本。

comesure的专栏 389

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

高性能Java原生持久化解决方案:MicroStream

高性能Java原生持久化解决方案:MicroStream 项目介绍 MicroStream 是一款专为Java开发者设计的高性能原生持久化解决方案。它能够存储和加载任何Java对象图或子图,摆脱了传统JPA的繁重负担,实现了微秒级的响应时间、超高的吞吐量和极低的延迟。MicroStream 让开发者能够轻松创建超快的内存数据库应用和微服务,是构建高性能Java应用的理想选择。 项目技术分析 Mic...

gitblog_00012的博客 845

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

MicroStream 开源项目教程

MicroStream 开源项目教程 1、项目介绍 MicroStream 是一个高性能的 Java 原生持久化存储库,旨在存储和加载任何 Java 对象图或子图。它旨在减轻 JPA(Java Persistence API)的负担,提供微秒级的响应时间、超高的吞吐量和最小的延迟。MicroStream 允许开发者创建超快的内存数据库应用程序和微服务。 2、项目快速启动 环境准备 Java 11...

gitblog_00032的博客 400

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

MicroStream 项目教程

MicroStream 项目教程 1. 项目的目录结构及介绍 MicroStream 项目的目录结构如下: microstream/ ├── core/ │ ├── src/ │ │ ├── main/ │ │ │ ├── java/ │ │ │ └── resources/ │ │ └── test/ │ │ ├── java/ │ ...

gitblog_00578的博客 989

终极免费离线语音转文字解决方案:如何用Buzz实现专业级音频转录

还在为昂贵的语音转文字服务烦恼吗?还在担心隐私数据上传到云端的安全问题吗?今天我要向你介绍一款革命性的开源工具——Buzz,它基于OpenAI Whisper技术,让你在个人电脑上实现完全离线的音频转录与翻译功能。无论你是学生、记者、研究者还是普通用户,只需几分钟时间,就能将电脑变成专业的语音转文字工作站。 **Buzz离线语音转文字工具**的核心优势在于完全本地化运行,所有音频处理都在你的设备

gitblog_00201的博客 1054

MicroProfile 1.2新增功能介绍

Eclipse Foundation最近发布了MicroProfile 1.2版,该版本提供了下列新增API:\\Health Check 1.0\\ Health Metrics 1.0\\ Fault Tolerance 1.0\\ JWT Propagation 1.0\Health Check API可以判断计算节点是否即将终或关闭,随后会使用正常运行的新实例替换这样的节点。该API...

cpongo5 234

MicroStream到底是什么

MicroStream到底是什么,要做成什么,其实我也不知道,作为一个软件工人,其实真的希望中国的软件能够走向世界,因为这不仅仅是我的梦想,也是很多中国人的梦想。确切的说,MicroStream是一个平台(Platform),一个平台就很空了,他可以包罗万象,也可以只是一个理念,我想目前,它不过是一个理念吧。  

479

go微服务框架go-micro深度学习(五) stream 调用过程详解

    上一篇写了一下rpc调用过程的实现方式,简单来说就是服务端把实现了接口的结构体对象进行反射,抽取方法,签名,保存,客户端调用的时候go-micro封请求数据,服务端接收到请求时,找到需要调用调用的对象和对应的方法,利用反射进行调用,返回数据。 但是没有说stream的实现方式,感觉单独写一篇帖子来说这个更好一些。上一篇帖子是基础,理解了上一篇,stream实现原理一点即破。先说一下使用方式...

weixin_33757609的博客 458

深入操作系统原理:从《操作系统导论》看微服务网关限流熔断机

在现代分布式系统中,微服务架构已经成为了主流,而微服务网关作为整个系统的第一道防线,承担着流量控制、路由转发、鉴权等核心功能。在实际开发中,我们常常会遇到“服务雪崩”“请求超时”“服务器资源耗尽”等异常情况。这些问题的根源往往与操作系统的调度机制、资源管理以及网络通信的底层实现息息相关。本文将结合经典技术书籍《操作系统导论》中的核心理论知识,从底层系统原理出发,深入探讨微服务网关中的限流与熔断机制,帮助读者建立起系统化的知识图谱。

wuchangjian的专栏 238

VortMall微服务商城系统v1.3.26 供应链后台菜单优化与供应商代发流程说明

在 VortMall 微服务商城系统中,供应商提供货源并维护库存,店铺选货铺货并向消费者销售。供应商代发时,供货方处理发货,消费者通过订单查看物流;发生退换货时,店铺、平台和供应商按业务规则协作。v1.3.26 调整了供应链后台“采购管理”“供应商管理”和“设置”三个分组的图标。本文结合这次界面调整,梳理系统已有的供销与履约流程。

VortMall的博客 393

微服务与单体的取舍

微服务非技术升级,而是组织与运维能力的变现。收益(故障隔离、独立扩展、发布、边界清晰)随规模放大,成本却一次性支付。拆分需满足团队超十人、负载差异大、发布互阻、领域稳定四条件。否则应优先采用模块化单体——代码分层、接口约束,边界清晰,未来可平滑拆分。避免按技术层划分服务,坚持“一服务一数据所有权”。拆分前确保基础设施完备,且以具体痛点为信号,逐步推进,先拆最痛处,验证后再行扩展。

2401_89855466的博客 277

微服务网关中的安全风险与限流熔断策略深度解析

在现代的微服务架构中,网关作为系统的第一道防线,承担了请求路由、鉴权、限流与熔断等核心功能。然而,随着业务复杂度的提升,安全风险也随之增加,尤其是在没有合理配置限流和熔断机制的情况下,网关可能成为攻击者渗透系统的入口。本文将从渗透测试的角度出发,深入剖析微服务网关在安全防护方面的常见问题,并结合限流与熔断的实际场景,提供可操作的安全加固方案。

后台模板 178
上一篇: 好评力荐Spring生态全家桶笔记,Java程序员人手一份
下一篇: Spring框架之Spring AOP
JavaMonsterr
博客等级 码龄4年 211粉丝 481原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值