Spring-Modulith

使用 Spring Modulith 实现事件外部化

1、概览 本文将带你了解如何使用 Spring Modulith 来监听 Spring Application Event 并自动将其发布到 Kafka Topic。 2、事务操作和 Message Broker 假设,正在开发一个保存文章的功能: @Service class Baeldung { private final ArticleRepository articleRepository; // 构造函数 @Transactional public void createArticle(Article article) { validateArticle(article); article = addArticleTags(article); // ...其他业务逻辑 articleRepository.save(article); } } 此外,还需要向系统的其他部分通知这一新文章。其他模块或服务会根据此做出反应,例如创建报告或向网站读者发送新闻邮件。 最简单的方法是使用 KafkaOperations 向 baeldung.articles.published Kafka Topic 发送消息,并使用文章的 slug() 作为关 Key: @Service class Baeldung { private final ArticleRepository articleRepository; private final KafkaOperations<String, ArticlePublishedEvent> messageProducer; // 构造函数 @Transactional public void createArticle(Article article) { // .

Spring Boot 构建 Modulith 指南

本文将教你如何使用 Spring Boot 构建 Modulith,并使用 Spring Modulith 项目的特性。Modulith 是一种软件架构模式,假设将你的单体应用程序组织成逻辑模块。这些模块应尽可能独立于彼此。Modulith 平衡了单体架构和基于微服务的架构。它可以成为组织应用程序的目标模型。但你也可以将其视为从单体架构向基于微服务的方法迁移的过渡阶段。Spring Modulith 将帮助我们构建结构良好的 Spring Boot 应用程序,并验证逻辑模块之间的依赖关系。 我们将比较当前的方法和基于微服务的架构。为此,我们将实现与我最近一篇关于 使用 Spring Cloud 和 Spring Boot 3 构建微服务 的文章中所描述的非常相似的功能。 源码 你可以克隆我的 GitHub Repository,然后按照说明操作即可。 在开始之前,我们先来看看下图。它展示了我们示例系统的架构。我们有三个独立的模块,它们相互通信:employee(员工)、department(部门)和 organization(组织)。此外还有 gateway(网关)模块。它负责将内部服务作为 REST 端点暴露在应用之外。我们的模块使用 Spring Modulith 项目提供的支持向 Zipkin 实例发送追踪。 如果你想将其与先前提到的文章中描述的类似微服务架构进行比较,这是该架构的图。 让我们来看看代码的结构。默认情况下,main 的每个直接子包都被视为一个应用模块包。因此有四个应用模块:department、employee、gateway 和 organization。每个模块都包含向其他模块开放的 “provided interfaces”(提供的接口)。我们需要将它们放在应用模块根目录下。其他模块不能访问应用模块子包中的任何类或 bean。我们将在接下来的章节中详细介绍。 src/main/java └── pl └── piomin └── services ├── OrganizationAddEvent.java ├── OrganizationRemoveEvent.java ├── SpringModulith.java ├── department │ ├── DepartmentDTO.java │ ├── DepartmentExternalAPI.java │ ├── DepartmentInternalAPI.

Spring Modulith 简介

1、简介 模块化单体(Modular Monolith)是一种架构风格,在这种风格中,我们的源代码按照模块的概念进行结构化。对于许多组织来说,模块化单体是一个很好的选择。它有助于保持一定程度的独立性,这有助于我们在需要时过渡到微服务架构。 Spring Modulith 是 Spring 的一个实验项目,可用于模块化单体应用程序。此外,它还支持开发人员构建结构合理、领域一致的 Spring Boot 应用程序。 在本教程中,我们将讨论 Spring Modulith 项目的基础知识,并举例说明如何实际使用它。 2、模块化单体架构 我们有不同的选择来构建应用程序的代码。传统上,我们围绕基础设施设计软件解决方案。但是,当我们围绕业务设计应用程序时,就能更好地理解和维护系统。模块化单体架构就是这样一种设计。 模块化单体架构因其简单性和可维护性而越来越受到架构师和开发人员的青睐。如果我们将领域驱动设计(DDD)应用于现有的单体应用程序,就可以将其重构为模块化单体架构: 我们可以通过确定应用程序的领域和定义有界上下文,将单体的核心拆分成模块。 让我们来看看如何在 Spring Boot 框架内实现模块化单体应用程序。Spring Modulith 包含一系列库,可帮助开发人员构建模块化 Spring Boot 应用程序。 3、Spring Modulith 基础 Spring Modulith 可帮助开发人员使用由领域(domain)驱动的模块,并支持对这种模块化进行验证和文档化。 3.1、Maven 依赖 首先,让我们在 pom.xml 的 <dependencyManagement> 部分导入 spring-modulith-bom 依赖: <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.experimental</groupId> <artifactId>spring-modulith-bom</artifactId> <version>0.5.1</version> <scope>import</scope> <type>pom</type> </dependency> </dependencies> </dependencyManagement> 此外,我们还需要一些 Spring Modulith 核心依赖: <dependency> <groupId>org.springframework.experimental</groupId> <artifactId>spring-modulith-api</artifactId> </dependency> <dependency> <groupId>org.springframework.experimental</groupId> <artifactId>spring-modulith-starter-test</artifactId> <scope>test</scope> </dependency> 3.2、模块 Spring Modulith 的主要概念是模块。模块是将 API 暴露给其他模块的功能单元。此外,它还有一些不允许其他模块访问的内部实现。当我们设计应用程序时,我们会为每个域(domain)考虑一个模块。