快手、孩子王、华为等专家分享大模型在电商运营、母婴消费、翻译等行业场景的实际应用 了解详情
写点什么

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

评论

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

再谈持续测试

FunTester

Higress 开源后,我们整理了开发者最关心的 15 个问题

阿里巴巴中间件

阿里云 云原生 Higress

TapTap算法平台的 Serverless 探索之路

Serverless Devs

DW-Siam:Deeper and Wider Siamese Networks for Real-Time Visual Tracking 更宽更深的孪生网络

Geek_7ubdnf

神经网络

如何选择数据可视化图表?

搞大屏的小北

安全可信| 密评合规!天翼云全栈混合云通过商用密码应用安全性评估!

天翼云开发者社区

大规模 Kubernetes 集群故障注入的利器-ChaosBlade

阿里巴巴中间件

阿里云 Kubernetes 云原生 ChaosBlade

问题盘点|使用 Prometheus 监控 Kafka,我们该关注哪些指标

阿里巴巴中间件

kafka 阿里云 云原生 Prometheus

效能改进中的度量实践

feijieppm

项目管理 研发效能 技术管理 文化 & 方法 效能度量

「认知」打工人的自我修养

职场 认知

如何用 Excel 做数据分析,提升你的工作效率?

搞大屏的小北

提升效率 Excel 数据可视化 DataEase

2023-01-11:体育馆的人流量。编写一个 SQL 查询以找出每行的人数大于或等于 100 且 id 连续的三行或更多行记录。返回按 visit_date 升序排列 的结果表。 DROP TAB

福大大架构师每日一题

MySQL 福大大

阿里巴巴重磅开源云原生网关: Higress

阿里巴巴中间件

阿里云 云原生 Higress

项目制实践如何助力组织进化

feijieppm

项目管理 研发效能 技术管理 文化 & 方法 效能度量

DataEase 在 Windows 系统下的 jar 包部署

搞大屏的小北

《天翼云安全白皮书》发布!共铸国云安全生态!

天翼云开发者社区

天翼云荣获2022年度“边缘计算先锋企业”“分布式云先锋企业”称号!

天翼云开发者社区

场景 | 九科信息大型制造企业RPA数字化解决方案

九科Ninetech

您有一套专属权益已送达,请注意查收

天翼云开发者社区

亚马逊云科技 2022 re:Invent 观察 | 天下武功,唯快不破

亚马逊云科技 (Amazon Web Services)

亚马逊云科技 Builder 专栏

什么是云渲染?云渲染速度快吗?

Renderbus瑞云渲染农场

云渲染 云渲染是什么 云渲染速度快吗

应用 Serverless 化,让业务开发心无旁骛

阿里巴巴中间件

阿里云 Serverless 云原生

容器服务与达摩院合作 AHPA 获 AAAI 2023 IAAI人工智能创新应用奖

阿里巴巴中间件

阿里云 容器 云原生

微服务引擎 MSE 升级至 3.0:降低微服务在云原生时代的演进成本

阿里巴巴中间件

阿里云 微服务 云原生

2023年了 对Go做一个全网最全的总结

卡二条

Go Go Concurrency Patterns Go web

DataEase 在 Mac 系统下的 jar 包部署

搞大屏的小北

DataEase Mac 系统 jar 包部署

效能指标「研发浓度」在项目度量中的应用

feijieppm

项目管理 技术管理 文化 & 方法 效能度量 #研发效能

RatingBar(星级评分条)

芯动大师

Android Studio 星级评分条 ratingbar

2023年有哪些具备潜力的加密投资标的?

股市老人

DataEase 本地源码启动

搞大屏的小北

大前端—2022明星项目,2023展望

非喵鱼

JavaScript Vue 前端 React 前沿技术

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