前言
Spring Boot是用于开发微服务的最流行的Java框架。在本文中,我将与你分享自2016年以来我在职业开发中使用Spring Boot所采用的最佳实践,这些都是基于我的个人经验和认可的Spring Boot专家的着作。
在本文中,我将重点介绍Spring Boot特有的实践(大多数时候,也适用于Spring项目)。
以下最佳实践未按特定顺序排列。
使用自动配置
Spring Boot的一个主要功能是使用自动配置,当在类路径classpath上检测到特定的jar文件时,它会被激活。
使用自动配置的最简单方法是使用Spring Boot Starters。比如,如果想与Redis进行交互,首先pom.xml中必须包括:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<p>
如果你想使用MongoDB,你有:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<p>
依赖于这些Starter,依靠这些经过测试和验证的配置,可以很好地协同工作。这有助于避免可怕的Jar Hell(Jar包地域)。
通过使用以下注释属性,可以从自动配置中排除某些类: @EnableAutoConfiguration(exclude = {ClassNotToAutoconfigure.class}),但只有在绝对必要时才应该这样做。
正确构建代码
虽然你有很大的自由,但是有一些基本规则值得关注,然后才能写出你的源代码。
-
避免使用默认包,确保所有内容(包括您的入口点)都位于一个名称很好的包中。这样就可以避免与自动配对和组件扫描相关的意外情况。
-
将Application.java (您的入口类)保留在顶级源目录中。
-
我建议将控制器和服务保存在以功能为导向的模块中,但这是可选的。一些非常好的开发人员建议将所有控制器放在一起,坚持一种风格!
保持@Controller的清洁和专注。控制器应该非常薄。控制器负责协调和委派,而不是执行实际的业务逻辑。
以下是控制器关键实践:
(1)控制器应该是无状态的!默认情况下,控制器是单例,任何状态都可能导致大量问题。
(2)控制器不应该执行业务逻辑,而是依赖委托。
(3)控制器应该处理应用程序的HTTP层,Http相关信息不应该传递给服务。
(4)控制器应该围绕用例/业务能力。
要深入到这里,需要讨论设计REST API的最佳实践。无论您是否想要使用Spring Boot,都值得学习。
围绕业务功能构建@Service
服务是Spring Boot的另一个核心概念。我发现最好围绕业务功能/领域/用例构建服务,也就是你想要的功能。
使用称为AccountService,UserService,PaymentService之 类的服务的应用程序比使用DatabaseService,ValidationService,CalculationService等的应用程序更容易处理。
你可以决定使用控制器和服务之间的1对1映射。那将是理想的。这并不意味着,服务不能互相使用!
使数据库成为一个细节 - 从核心逻辑中抽象出来
我曾经不确定如何在Spring Boot中最好地处理数据库交互。在阅读了罗伯特·C·马丁的“干净架构”之后,对我来说更加清晰。
从服务中抽象出数据库逻辑,理想情况下,不要希望服务知道它正在与哪个数据库通信。有一些抽象可以封装对象的持久性。
罗伯特C.马丁热情地争辩说你的数据库是一个“细节”,这意味着不要将应用程序耦合到特定数据库,虽然过去很少有人会切换数据库,但是我注意到,使用Spring Boot和现代微服务开发 - 事情就会变得更快,难以预料。
保持业务逻辑不受Spring Boot代码的影响
考虑到“干净架构”的教训,应该保护业务逻辑。将业务和各种Spring Boot代码混合在一起是非常诱人的......不要这样做。如果你抵制诱惑,你将保持你的业务逻辑可重用。
部分服务通常成为库,如果你不必从代码中删除大量Spring注释的话,那么代表你的代码更容易创建。
熟悉并发模型
在Spring Boot中,控制器和服务是默认的Singletons。如果你不小心,这会引入可能的并发问题。您通常也在处理有限制的线程池。
将配置管理放在外部
这一点超出了Spring Boot,虽然这是人们开始创建多个类似服务时常见的问题......
你可以手动处理配置Spring应用程序。如果你正在处理许多Spring Boot应用程序,则需要使配置管理成熟。
我建议两种主要方法:
1.使用配置服务器,例如Spring Cloud Config
2.将所有配置存储在环境变量中(可以基于git存储库进行配置)
这些选项中的任何一个(第二个选项)都要求你涉足DevOps。
提供全局异常处理
你真的需要一种处理异常的一致方法,Spring Boot提供了两种主要方法:
1.可以使用 HandlerExceptionResolver来定义全局异常处理策略。
2.可以使用@ExceptionHandler注释控制器,想在某些情况下特定,这可能会很有用。
使用日志框架
应该使用Logger进行日志记录,而不是使用System.out.println()手动执行。这很容易在Spring Boot中完成,几乎没有配置。只需获取该类的记录器实例:
Logger logger = LoggerFactory.getLogger(MyClass.class);
这很重要,因为它可以让你根据需要设置不同的日志记录级别。
测试你的代码
这不是Spring Boot特有的,但需要提醒一下!测试你的代码。如果没有编写测试,那么意味着从一开始就编写的是旧代码。
如果有其他人来到你的代码库,很快就会改变任何东西,当有多个服务相互依赖时,这时可能更具风险。
由于存在Spring Boot最佳实践,因此应该考虑将Spring Cloud Contract用于你的消费者驱动合同,它将使你与其他服务的集成更容易使用。
网友评论