2天时间,聊今年最热的 Agent、上下文工程、AI 产品创新等话题。2025 年最后一场~ 了解详情
写点什么

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:008298

评论

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

一文教会你认识Vuex状态机

华为云开发者联盟

Vue 应用 vuex 事件 父子组件

构建高可用的MySQL

林一

MySQ MySQL 高可用 Maxscale

博云作为专业独立PaaS厂商,入选中国PaaS市场研究报告

BoCloud博云

PaaS

内嵌双向链表的设计与实现

实力程序员

如何进行可视化大屏视觉设计?

博文视点Broadview

想做DBA,多租户管理你一定要知道这些

华为云开发者联盟

多租户 GaussDB(DWS) 资源池 存储空间 资源隔离

带你剖析鸿蒙轻内核任务栈的源代码

华为云开发者联盟

鸿蒙 任务栈 任务调度 任务上下文

如何科学制定和管理项目计划?

万事ONES

项目管理 ONES 项目经理

春色满园关不住,带你体验阿里云 Knative

阿里巴巴云原生

云原生

理解Linux之文件I/O——知其然,知其所以然

奔着腾讯去

文件管理 Linux内核 文件I/O I/O模型

密码学系列之:生日攻击

程序那些事

加密解密 密码学 程序那些事

Java 并发编程——线程池开篇

Antway

6月日更

☕️【Java技术之旅】站在Linux操作系统角度去看Thread(线程)

码界西柚

线程 Thread 6月日更 内核线程

那个陪我打王者的兄弟进了阿里

艾小仙

小白必看的,JS中循环语句大集合

华为云开发者联盟

JavaScript js 循环语句 while循环 for循环

企业应用AI之路怎么走?飞桨实践有真知

百度大脑

AI 飞桨

react源码解析9.diff算法

全栈潇晨

react源码

面试官:如何给字符串设计索引?

一个优秀的废人

MySQL 索引 字符串 索引优化

聊聊追求测试技术导致过度测试

陈磊@Criss

证券互动问答平台关键词监控提醒

木头

互动平台 证券监控 股市消息 监控提醒

Kubernetes 的自动伸缩你用对了吗?

张晓辉

Kubernetes k8s最佳实践

【LeetCode】从上到下打印二叉树 Java题解

Albert

算法 LeetCode 6月日更

模块六作业

c

架构实战营

Webpack 系列:如何编写loader

范文杰

webpack 6月日更

待办事项列表,敏捷项目管理的核心工件

万事ONES

Scrum 敏捷 研发管理 ONES

如何针对美工与设计师的Maya工具进行版本控制

龙智—DevSecOps解决方案

百度灵医智惠明星案例获人民日报点赞:智慧医疗让看病更便捷

百度大脑

人工智能 智慧医疗

☕️【Java技术之旅】带你一起探究String类不可变的特性

码界西柚

string 原理 字符串 6月日更

基于传感器的人体生命体征监控技术

不脱发的程序猿

物联网 传感器 智能医疗 人体生命体征监控技术

质量分析工具-监控大厅大揭秘

anyRTC开发者

音视频 WebRTC sdk

宜兴牵手百度智能云共建人工智能应用中心,推动数字经济创新发展

百度大脑

人工智能

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