把握行业变革关键节点,12 月 19 日 - 20 日,AICon北京站即将重磅启幕! 了解详情
写点什么

Spring Modulith 1.0 已生产就绪且获 IDE 支持

作者:Karsten Silz

  • 2023-10-17
    北京
  • 本文字数:2385 字

    阅读完需:约 8 分钟

大小:1.02M时长:05:54
Spring Modulith 1.0已生产就绪且获IDE支持

Spring Modulith 1.0 从实验状态提升为完全支持的 Spring 项目。它通过模块和事件来构建 Spring Boot 3 应用程序。Spring Tool Suite 和 Visual Studio Code 等 IDE 现在已经提供了这个模块结构。事件发布注册中心(EPR)可以更快地完成事件保存。集成测试场景则简化了测试事件。

 

Spring Modulith 模块之所以会存在是因为 Java 包不分层。在下面的示例中,Java 的默认可见性向其他包隐藏了example.inventory.SomethingInventoryInternal类。但是,example.order.internal包必须是public的,因为example.order 要访问它。这就使得它对所有其他包都可见。


└─  src/main/java   ├─  example   |  └─  Application.java   ├─  example.inventory   |  ├─  InventoryManagement.java   |  └─  SomethingInventoryInternal.java   ├─  example.order   |  └─  OrderManagement.java   └─  example.order.internal      └─  SomethingOrderInternal.java
复制代码


Spring Modulith 模块既不使用 Java 平台模块系统(JPMS),也不生成代码。相反,主包的每个直接子包在默认情况下都只是一个模块。在上面的例子中就是inventoryorder。模块 API 由包中所有的公共类型组成。最关键的是,Spring Modulith 认为子包是模块内部的。这就解决了上面所说的example.order.internal公共包的问题。

 

当模块访问其他模块的内部包时,Java 仍然可以编译。但是 Spring Modulith 测试ApplicationModules.of(Application.class).verify()将会失败。Spring Modulith 使用 ArchUnit 来检测这种违规行为。

 

Spring Modulith 鼓励使用 Spring Framework 应用程序事件实现模块之间的通信。Spring Modulith 用 EPR 增强了这些事件,保证了事件的传递。因此,即使接收事件的模块崩溃或整个应用程序崩溃,当模块或应用程序再次运行时,注册中心仍然会传递事件。

 

EPR 使用 JPA、JDBC 和 MongoDB 来存储事件。在这个版本中,MongoDB 获得了自动配置的事务。使用 Spring Modulith 的应用程序可以同时使用模块和事件,也可以单独使用某个特性。

 

到目前为止,异步事务事件监听器需要三个注解:

@Componentclass InventoryManagement {

@Async @Transactional(propagation = Propagation.REQUIRES_NEW) @TransactionalEventListener void on(OrderCompleted event) { /*…*/ }}
复制代码

 

1.0 版本新增注解@ApplicationModuleListener简化了上述代码:

@Componentclass InventoryManagement {

@ApplicationModuleListener void on(OrderCompleted event) { /*…*/ }}
复制代码

测试异步事务性代码颇具挑战性。这就轮到新工具Integration Test Scenarios登场了。我们可以将它们注入到 Java 测试中,并定义好事件驱动测试的起点和预期结果。此外,在这些场景中,我们还可以自定义执行细节并定义额外的事件测试。

 

jMolecules为架构定义注解,如领域驱动设计的@ValueObject@Repository,六角架构(Hexagonal Architecture)的@Port@Adapter。Spring Modulith 1.0 检测 jMolecules 注解,生成应用程序文档,并根据注解的作用(如“Port”或“Adapter”)对类进行分组。

 

2023年8月的Spring One大会上,VMware 宣布即将推出 Spring Modulith 1.1。这个新版本依赖 Spring Boot 3.2,而后者要到 2023 年 11 月 23 日才能发布。1.1 版本将支持用于事件持久化的其他数据库,如 Neo4J,为的是更好地与 Spring Data 保持一致。它还可以自动将事件发送到外部目的地。当其他应用程序对其中一些事件感兴趣时,这会很有帮助。1.1 版本将支持使用 Kafka、AMQP、甚至可能是 Redis 作为事件的外部目的地。

 

Oliver Drotbohm是 VMware Staff 2 的工程师,也是 Spring Modulith 背后的推动者。他向 InfoQ 介绍了 Spring Modulith。

 

InfoQ:Spring Modulith 推出已经有 10 个月。到目前为止,反响如何?


Oliver Drotbohm: 会议和在线社区的反馈都非常积极。让人们有点犹豫的一个主要方面是,在几天前发布之前,这个项目还一直被认为是实验性的。我们期待着社区消除顾虑并采用它。

 

InfoQ:在你们看来,Spring Modulith 怎么才算成功?该如何度量?


Drotbohm:当然,与所有的 Spring 项目一样,我们也在监控 Maven Central 的下载量,因为这些数值可能增长或下降。尽管如此,对于单个项目,这个数值的增长趋势通常是一个不错的使用增长率指标。我们也有 start.spring.io 的数据。考虑到 Spring Modulith 主要是面向新应用程序的,希望我们能看到好的结果。除此之外,我们也关注 GitHub 上星星的数量。

 

InfoQ:Spring Tool Suite 和 VS Code 已经可以读取模块结构。对于 IntelliJ 和 Eclipse 支持,你们有什么计划吗?


Drotbohm:Eclipse 通过 STS 插件提供支持。至于 IDEA,我们会和开发团队保持联系,他们正在研究。

 

InfoQ:目前,Spring Modulith 有两个核心的抽象概念——模块和事件。您觉得在未来的版本中还会增加其他的抽象概念吗?


Drotbohm:实际上,这两个抽象概念分别服务于尼尔·福特和马克·理查兹在《分布式系统架构》一书中所描述的软件架构的两个基本活动:“把事情拆分”(即定义应用程序的功能分解)和“将它们重新组合在一起”(定义一个编程模型,使分解出的单个部分最终能够相互交互)。应用程序模块的概念有助于实现代码库的功能结构,其中也包含了方法,确保应该分开的东西实际上是分开的。我们推荐的基于事件的应用程序集成编程模型,使这些模块可以用最终一致的方式进行交互。

 

目前,我们的重点是这两部分该如何演进,并搞清楚社区会如何使用它们,以及我们该如何响应并完善它们。计划在 1.1 M1 中引入的事件外部化机制就体现了这一点。

 

InfoQ:据您估计,使用模块的 Spring Modulith 应用程序占比有多少,使用事件的占比又有多少?


Drotbohm:这个我们得看下单个 Spring Modulith 构件的下载量。实验阶段的统计数据显示,模块(包括模块集成测试支持)与事件的比例是 90/10。


原文链接:

https://www.infoq.com/news/2023/08/spring-modulith-1-0/

2023-10-17 08:008341

评论

发布
暂无评论
发现更多内容

27 K8S之服务发现

穿过生命散发芬芳

k8s 11月日更

Flutter 状态管理概述【Flutter 专题 7】

坚果

flutter 签约计划第二季

Flutter 状态管理Provider快速指南【Flutter 专题 8】

坚果

flutter 签约计划第二季

Redis值Sentinel(哨兵)详述,图文并茂才能浅显易懂

李子捌

redis redis sentinel 签约计划第二季

写代码的思路

king

DDD与CQRS的关系

Bruce Talk

领域驱动设计 DDD

金三银四面试必备,“全新”突击真题宝典,阿里腾讯字节都稳了

Geek_1df311

Java 程序员 架构 面试

在Flutter中构建图像选择器【Flutter专题9】

坚果

flutter 签约计划第二季

比特币的账户模型

Rayjun

比特币 区块链

巧用代理设计模式(Proxy Design Pattern)改善前端图片加载体验

汪子熙

设计模式 web开发 代理模式 Proxy 11月日更

比较 Flutter 日期选择器库【Flutter专题6】

坚果

flutter 签约计划第二季

阿里内部“SpringCloudAlibaba学习笔记”强势来袭,开创微服务的新时代

Geek_1df311

Java 编程 架构 微服务

ES6, Angular, React 和 ABAP 中的 String Template(字符串模板)

汪子熙

JavaScript angular React abap 11月日更

面试官:GET能上传图片吗?

喵叔

11月日更

Redis分布式锁就应该这样学,精细胞与卵细胞的故事告诉你真实原理!

李子捌

redis 分布式锁 签约计划第二季

“退微信群”谣言背后:总有人用阴谋论湮没常识

脑极体

Flutter 中的一切都是一个小部件【Flutter专题5】

坚果

flutter 签约计划第二季

分布式系统的全局快照

ElvinYang

分布式系统 一致性 全局快照 Chandy-Lamport Flink ABS

Go语言学习查缺补漏ing Day9

Regan Yue

Go 语言 11月日更

掌握这些核心算法,拿不到10个offer你来找我,我锤你个不争气的

热爱java的分享家

Java 架构 程序人生 编程语言 经验分享

46道史上最全Redis面试题,面试官能问的都被我找到了(含答案)

热爱java的分享家

Java 架构 程序人生 编程语言 经验分享

新能源汽车发展的三种路线及差别

石云升

学习笔记 新能源汽车 11月日更

owasp zap 暴力破解测试

喀拉峻

网络安全 安全 信息安全

Flutter在各平台的安装与配置(Windows,macos,linux)【Flutter 专题 0】

坚果

flutter 签约计划第二季

Redis之主从复制详述,看完这篇文章不再稀里糊涂

李子捌

redis 主从复制 签约计划第二季

Redis集群模式,你若还是一知半解,试试仔细阅读一遍这篇文章

李子捌

redis redis cluster 签约计划第二季

大专毕业的我狂刷29天“阿里内部面试笔记”最终直接斩获十七个Offer

热爱java的分享家

Java 面试 程序人生 编程语言 经验分享

模块六作业

bob

「架构实战营」

GitHub标星139K的:“嵌入式Linux系统开发教程”

热爱java的分享家

Java 架构 程序人生 编程语言 经验分享

五面阿里拿下飞猪事业部offer,2021新鲜出炉阿里巴巴面试真题

热爱java的分享家

Java 面试 程序人生 编程语言 经验分享

六年Java老鸟,写给1-3年程序员的几点建议,满满硬货指导

热爱java的分享家

Java 架构 面试 程序人生 编程语言

Spring Modulith 1.0已生产就绪且获IDE支持_编程语言_InfoQ精选文章