Spring Boot
1.为什么用模块?
构建模块化系统可以缩短开发时间,改进代码管理,延长系统寿命,并提供更高效的不同包装的部署,以满足不同用户的需求。
2.模块化的类型
2.1编译时模块化
在编译时模块化中,开发人员需要声明应用程序将使用哪些模块。当所需的模块发生变化或模块更新时,必须重新构建整个系统。当想到模块化时,大多数开发人员会想到编译时模块化
2.2运行时模块化
另一方面,运行时模块化系统可以通过简单地在部署中包含不同的模块或向已经运行的系统添加新模块来动态部署。
运行时模块化基于插件或微服务。
基于插件的运行时模块化系统的好处
a.服务、领域模型定义和 API 是在一组物理隔离的可执行文件(使用 Spring 时为 jar)中定义的。
b.不同的开发团队负责不同的插件集,团队之间的交流为零或接近零。
c.新版本的插件集不需要外部测试。
d.同一系统可以部署在满足细粒度客户需求的无限组合中,而无需编译数十种组合,同时维护多个分支,如果没有良好的插件技术,则需要一个分支。
e.可扩展性达到了一个全新的水平,即使无需重新编译,也可以通过扩展插件自动使用扩展插件的更改和新版本。
f.与微服务模式不同,单向维护依赖关系很容易,微服务中从未完全解决的数据库拆分问题不存在,并且性能影响序列化、反序列化和通信可能会影响基于微服务的系统。
2.3当前的模块化模式
大多数模块化系统,包括 Spring 自己的多模块系统,都是编译时类型的。也就是说,必须在编译系统之前声明依赖项,并且新的服务组合需要在依赖项声明之前进行新的构建过程。这之后通常是针对所有系统组件的全套测试周期。 基于 Maven 的项目也使用编译时范式,其中在编译之前必须知道所有依赖项。 微服务显然属于运行时类型,但是,微服务的拓扑决策很困难.服务提供者(在插件中)可以在没有负责该服务的开发团队干预的情况下进行扩展和更改,并且不会影响依赖它的其他服务。
2.4通过进程内插件运行时模块化
运行时插件系统应在其插件系统中支持:
a.插件之间的依赖注入,任何深度。也就是说,插件必须可以注入到其他插件中,而注入的插件可以将其他插件注入到它们中。注入的插件应该不知道它们被注入的插件。
b.容器,即 Spring Boot 应用程序不必了解扩展和服务它的插件的任何信息。
c.插件/模块在 Spring 开发的上下文中可以做什么应该没有限制,这应该包括 REST API 定义、业务服务、新的 JPA 实体、事件总线支持等。
d.本着重用的精神,现有插件应该可以注入到能够扩展它们的新插件中,这应该可以通过 REST 服务、业务服务和 JPA 实体模型实现。
e.在支持软件即服务 (SaaS) 基于云的系统时,可能需要支持同一插件/模块的多个版本。
3.什么是模块化开发?
模块化开发是一种软件设计模式,将软件组件分成模块,每个模块处理特定的问题。
4.为什么要构建模块化应用程序?
模块化应用程序更易于维护,开发周期更短,并可根据需求进行打包
5.不同类型的模块化
模块化系统可以用于编译时或运行时。
运行时模块化系统更加灵活,因为可以在不更改其他模块和重新编译的情况下部署模块。
此外,运行时模块化系统在正确构建时不需要先验知识或可能模块的声明。因此,系统提供的服务集可以通过分发不同的模块集来改变。可以使用无限部署组合无限扩展现有系统。
6.运行时模块化系统中的依赖性
理解模块化系统中的依赖范式至关重要。
当一个系统可以在不知道它可以容纳的可能服务的情况下进行扩展时,就可以实现不同水平的生产力和灵活性。
例如:
一个容器(Spring 应用程序)X 托管了 3 个插件 A、B、C。X 没有声明 A、B 和 C。
插件 C 被注入到插件 D 中。也就是说,插件 D 知道 C 的存在和服务,但反之则不然。
在运行时,容器收集插件 A、B、C 和 D,并将 C 注入 D。四个插件中定义的服务和实体可用于前端和使用此后端应用程序的其他客户端。
当需要附加服务时,可以将新插件 E 添加到系统的插件存储库中,通过引入新服务或扩展现有服务来添加所需服务。
网友评论