程序员们不容错过,Spring Boot 最流行的 16 条实践解读!

作者 : 开心源码 本文共4262个字,预计阅读时间需要11分钟 发布时间: 2022-05-12 共179人阅读

Spring Boot是最流行的用于开发微服务的Java框架。在本文中,我将与你分享自2016年以来我在专业开发中使用Spring Boot所采用的最佳实践。这些内容是基于我的个人经验和少量熟知的Spring Boot专家的文章。

在本文中,我将重点详情Spring Boot特有的实践(大多数时候,也适用于Spring项目)。以下依次列出了最佳实践,排名不分先后。

Spring Boot实战

使用自己设置BOM来维护第三方依赖

这条实践是我根据实际项目中的经历总结出的。

Spring Boot项目本身使用和集成了大量的开源项目,它帮助我们维护了这些第三方依赖。但是也有一部分在实际项目使用中并没有包括进来,这就需要我们在项目中自己维护版本。假如在一个大型的项目中,包括了很多未开发板块,那么维护起来就非常的繁琐。

怎样办呢?事实上,Spring IO Platform就是做的这个事情,它本身就是Spring Boot的子项目,同时维护了其余第三方开源库。我们可以借鉴Spring IO Platform来编写自己的基础项目platform-bom,所有的业务板块项目应该以BOM的方式引入。这样在更新第三方依赖时,就只要要更新这一个依赖的版本而已。

使用自动配置

Spring Boot的一个主要特性是使用自动配置。这是Spring Boot的一部分,它可以简化你的代码并使之工作。当在类路径上检测到特定的jar文件时,自动配置就会被激活。

使用它的最简单方法是依赖Spring Boot Starters。因而,假如你想与Redis进行集成,你可以首先包括:

假如你想与MongoDB进行集成,需要这样:

借助于这些starters,这些繁琐的配置即可以很好地集成起来并协同工作,而且它们都是经过测试和验证的。这非常有助于避免可怕的Jar地狱。

通过使用以下注解属性,可以从自动配置中排除某些配置类:

但只有在绝对必要时才应该这样做。

使用Spring Initializr来开始一个新的Spring Boot项目

这一条最佳实践来自Josh Long (Spring Advocate,@starbuxman)。

Spring Initializr(https://start.spring.io/)提供了一个超级简单的方法来创立一个新的Spring Boot项目,并根据你的需要来加载可能使用到的依赖。

使用Initializr创立应用程序可确保你取得经过测试和验证的依赖项,这些依赖项适用于Spring自动配置。你甚至可能会发现少量新的集成,但你可能并没有意识到这些。

考虑为常见的组织问题创立自己的自动配置

这一条也来自Josh Long(Spring Advocate,@starbuxman)——这个实践是针对高级客户的。

假如你在一个严重依赖Spring Boot的公司或者团队中工作,并且有共同的问题需要处理,那么你可以创立自己的自动配置。

这项任务涉及较多工作,因而你需要考虑何时获益是值得投入的。与多个略有不同的定制配置相比,维护单个自动配置更容易。

假如将这个提供Spring Boot配置以开源库的形式发布出去,那么将极大地简化数千个客户的配置工作。

正确设计代码目录结构

虽然允许你有很大的自由,但是有少量基本规则值得遵守来设计你的源代码结构。

? ?·? ?避免使用默认包。确保所有内容(包括你的入口点)都位于一个名称很好的包中,这样即可以避免与装配和组件扫描相关的意外情况;

? ?·? ?将Application.java(应用的入口类)保留在顶级源代码目录中;

? ?·? ?我建议将控制器和服务放在以功能为导向的板块中,但这是可选的。少量非常好的开发人员建议将所有控制器放在一起。不管怎么,坚持一种风格!

保持@Controller的简洁和专注

Controller应该非常简单。你可以在此处阅读有关GRASP中有关控制器模式部分的说明(https://en.wikipedia.org/wiki/GRASP_(object-oriented_design)#Controller)。你希望控制器作为协调和委派的角色,而不是执行实际的业务逻辑。以下是主要做法:

? ?·? ?控制器应该是无状态的!默认情况下,控制器是单例,并且任何状态都可能导致大量问题;

? ?·? ?控制器不应该执行业务逻辑,而是依赖委托;

? ?·? ?控制器应该解决应用程序的HTTP层,这不应该传递给服务;

? ?·? ?控制器应该围绕用例/业务能力来设计。

要深入这个内容,需要进一步地理解设计REST API的最佳实践。无论你能否想要使用Spring Boot,都是值得学习的。

围绕业务功能构建@Service

Service是Spring Boot的另一个核心概念。我发现最好围绕业务功能/领域/用例(无论你怎样称呼都行)来构建服务。

在应用中设计名称相似AccountService, UserService, PaymentService这样的服务,比起像DatabaseService、ValidationService、CalculationService这样的会更合适少量。

你可以决定使用Controler和Service之间的一对一映射,那将是理想的情况。但这并不意味着,Service之间不能互相调用!

JavaEE开发的颠覆者 Spring Boot实战

管理员处免费获取文中 spring boot实战 电子书籍:

关注我,转发文章,加入Java进阶架构交流:805685193。

使数据库独立于核心业务逻辑之外

我之前还不确定如何在Spring Boot中最好地解决数据库交互。在阅读了罗伯特·C·马丁的“Clear Architecture”之后,对我来说就清晰多了。

你希望你的数据库逻辑于服务分离出来。理想情况下,你不希望服务知道它正在与哪个数据库通信,这需要少量笼统来封装对象的持久性。

罗伯特C.马丁强烈地说明,你的数据库是一个“细节”,这意味着不将你的应用程序与特定数据库耦合。过去很少有人会切换数据库,我注意到,使用Spring Boot和现代微服务开发会让事情变得更快。

保持业务逻辑不受Spring Boot代码的影响

考虑到“Clear Architecture”的教训,你还应该保护你的业务逻辑。将各种Spring Boot代码混合在一起是非常诱人的……不要这样做。假如你能抵制诱惑,你将保持你的业务逻辑可重用。

部分服务通常成为库。假如不从代码中删除大量Spring注解,则更容易创立。

推荐使用构造函数注入

这一条实践来自Phil Webb(Spring Boot的项目负责人, @phillip_webb)。

保持业务逻辑免受Spring Boot代码侵入的一种方法是使用构造函数注入。 不仅是由于@Autowired注解在构造函数上是可选的,而且还可以在没有Spring的情况下轻松实例化bean。

熟习并发模型

我写过的最受欢迎的文章之一是“详情Spring Boot中的并发”。我认为这样做的起因是这个领域经常被误会和忽视。假如使用不当,就会出现问题。

在Spring Boot中,Controller和Service是默认是单例。假如你不小心,这会引入可能的并发问题。 你通常也在解决有限的线程池。请熟习这些概念。

假如你正在使用新的WebFlux风格的Spring Boot应用程序,我已经解释了它在“Spring’s WebFlux/Reactor Parallelism and Backpressure”中是如何工作的。

增强配置管理的外部化

这一点超出了Spring Boot,尽管这是人们开始创立多个相似服务时常见的问题……

你可以手动解决Spring应用程序的配置。假如你正在解决多个Spring Boot应用程序,则需要使配置管理能力更增强大。

我推荐两种主要方法:

? ?·? ?使用配置服务器,例如Spring Cloud Config;

? ?·? ?将所有配置存储在环境变量中(可以基于git仓库进行配置)。

这些选项中的任何一个(第二个选项多少量)都要求你在DevOps更少工作量,但这在微服务领域是很常见的。

提供全局异常解决

你真的需要一种解决异常的一致方法。Spring Boot提供了两种主要方法:

? ?·? ?你应该使用HandlerExceptionResolver定义全局异常解决策略;

? ?·? ?你也可以在控制器上增加@ExceptionHandler注解,这在某些特定场景下使用可能会很有用。

这与Spring中的几乎相同,并且Baeldung有一篇关于REST与Spring的错误解决的详细文章,非常值得一读。

使用日志框架

你可能已经意识到这一点,但你应该使用Logger进行日志记录,而不是使用System.out.println()手动执行。这很容易在Spring Boot中完成,几乎没有配置。只要获取该类的记录器实例:

Logger logger= LoggerFactory.getLogger(MyClass.class);

这很重要,由于它可以让你根据需要设置不同的日志记录级别。

测试你的代码

这不是Spring Boot特有的,但它需要提示——测试你的代码!假如你没有编写测试,那么你将从一开始就编写遗留代码。

假如有其余人使用你的代码库,那边改变任何东西将会变得危险。当你有多个服务相互依赖时,这甚至可能更具风险。

因为存在Spring Boot最佳实践,因而你应该考虑将Spring Cloud Contract用于你的消费者驱动契约,它将使你与其余服务的集成更容易使用。

使用测试切片让测试更容易,并且更专注

这一条实践来自Madhura Bhave(Spring 开发者, @madhurabhave23)。

使用Spring Boot测试代码可能很辣手——你需要初始化数据层,连接大量服务,模拟事物……实际上并不是那么难!答案是使用测试切片。

使用测试切片,你可以根据需要仅连接部分应用程序。这可以为你节省大量时间,并确保你的测试不会与未使用的内容相关联。来自spring.io的一篇名为Custom test slice with Spring test 1.4的博客文章解释了这种技术。

Spring源码深度解析

总结

感谢Spring Boot,编写基于Spring的微服务正变得史无前例的简单。我希望通过这些最佳实践,你的实施过程不仅会变得很快,而且从长远来看也会更增强大和成功。祝你好运!

管理员处免费获取文中 spring boot实战 电子书籍:

关注我,转发文章,加入Java进阶架构交流:805685193。

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » 程序员们不容错过,Spring Boot 最流行的 16 条实践解读!

发表回复