SpringBoot16条最佳实践
Spring Boot是最流⾏的⽤于开发微服务的Java框架。在本⽂中,我将与你分享⾃2016年以来我在专业开发中使⽤Spring Boot所采⽤的最佳实践。这些内容是基于我的个⼈经验和⼀些熟知的Spring Boot专家的⽂章。
在本⽂中,我将重点介绍Spring Boot特有的实践(⼤多数时候,也适⽤于Spring项⽬)。以下依次列出了最佳实践,排名不分先后。
1、使⽤⾃定义BOM来维护第三⽅依赖
这条实践是我根据实际项⽬中的经历总结出的。
Spring Boot项⽬本⾝使⽤和集成了⼤量的开源项⽬,它帮助我们维护了这些第三⽅依赖。但是也有⼀部分在实际项⽬使⽤中并没有包括进来,这就需要我们在项⽬中⾃⼰维护版本。如果在⼀个⼤型的项⽬中,包括了很多未开发模块,那么维护起来就⾮常的繁琐。
怎么办呢?事实上,Spring IO Platform就是做的这个事情,它本⾝就是Spring Boot的⼦项⽬,同时维护了其他第三⽅开源库。我们可以借鉴Spring IO Platform来编写⾃⼰的基础项⽬platform-bom,所有的业务模块项⽬应该以BOM的⽅式引⼊。这样在升级第三⽅依赖时,就只需要升级这⼀个依赖的版本⽽已。
<dependencyManagement>
<dependencies>
<dependency>
<groupId>io.spring.platform</groupId>
<artifactId>platform-bom</artifactId>
<version>Cairo-SR3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
2、使⽤⾃动配置
Spring Boot的⼀个主要特性是使⽤⾃动配置。这是Spring Boot的⼀部分,它可以简化你的代码并使之⼯作。当在类路径上检测到特定的jar ⽂件时,⾃动配置就会被激活。
使⽤它的最简单⽅法是依赖Spring Boot Starters。因此,如果你想与Redis进⾏集成,你可以⾸先包括:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
如果你想与MongoDB进⾏集成,需要这样:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
通过使⽤以下注解属性,可以从⾃动配置中排除某些配置类:
@EnableAutoConfiguration(exclude = {ClassNotToAutoconfigure.class})
但只有在绝对必要时才应该这样做。
3、使⽤Spring Initializr来开始⼀个新的Spring Boot项⽬
这⼀条最佳实践来⾃Josh Long (Spring Advocate,@starbuxman)。
使⽤Initializr创建应⽤程序可确保你获得经过测试和验证的依赖项,这些依赖项适⽤于Spring⾃动配置。你甚⾄可能会发现⼀些新的集成,但你可能并没有意识到这些。
4、考虑为常见的组织问题创建⾃⼰的⾃动配置
这⼀条也来⾃Josh Long(Spring Advocate,@starbuxman)——这个实践是针对⾼级⽤户的。
如果你在⼀个严重依赖Spring Boot的公司或团队中⼯作,并且有共同的问题需要解决,那么你可以创建⾃⼰的⾃动配置。
这项任务涉及较多⼯作,因此你需要考虑何时获益是值得投⼊的。与多个略有不同的定制配置相⽐,维护单个⾃动配置更容易。
如果将这个提供Spring Boot配置以开源库的形式发布出去,那么将极⼤地简化数千个⽤户的配置⼯作。有关⾃动配置点击有⼀篇实战⽂章。
5、正确设计代码⽬录结构
尽管允许你有很⼤的⾃由,但是有⼀些基本规则值得遵守来设计你的源代码结构。
避免使⽤默认包。确保所有内容(包括你的⼊⼝点)都位于⼀个名称很好的包中,这样就可以避免与装配和组件扫描相关的意外情
况;
将Application.java(应⽤的⼊⼝类)保留在顶级源代码⽬录中;
我建议将控制器和服务放在以功能为导向的模块中,但这是可选的。⼀些⾮常好的开发⼈员建议将所有控制器放在⼀起。不论怎样,坚持⼀种风格!
6、保持@Controller的简洁和专注
控制器应该是⽆状态的!默认情况下,控制器是单例,并且任何状态都可能导致⼤量问题;
控制器不应该执⾏业务逻辑,⽽是依赖委托;
控制器应该处理应⽤程序的HTTP层,这不应该传递给服务;
控制器应该围绕⽤例/业务能⼒来设计。
要深⼊这个内容,需要进⼀步地了解设计REST API的最佳实践。⽆论你是否想要使⽤Spring Boot,都是值得学习的。
7、围绕业务功能构建@Service
Service是Spring Boot的另⼀个核⼼概念。我发现最好围绕业务功能/领域/⽤例(⽆论你怎么称呼都⾏)来构建服务。
在应⽤中设计名称类似AccountService, UserService, PaymentService这样的服务,⽐起像DatabaseService、ValidationService、CalculationService这样的会更合适⼀些。
你可以决定使⽤Controler和Service之间的⼀对⼀映射,那将是理想的情况。但这并不意味着,Service之间不能互相调⽤!
8、使数据库独⽴于核⼼业务逻辑之外
我之前还不确定如何在Spring Boot中最好地处理数据库交互。在阅读了罗伯特·C·马丁的“Clear Architecture”之后,对我来说就清晰多了。
你希望你的数据库逻辑于服务分离出来。理想情况下,你不希望服务知道它正在与哪个数据库通信,这需要⼀些抽象来封装对象的持久性。
罗伯特C.马丁强烈地说明,你的数据库是⼀个“细节”,这意味着不将你的应⽤程序与特定数据库耦合。过去很少有⼈会切换数据库,我注意到,使⽤Spring Boot和现代微服务开发会让事情变得更快。
9、保持业务逻辑不受Spring Boot代码的影响
考虑到“Clear Architecture”的教训,你还应该保护你的业务逻辑。将各种Spring Boot代码混合在⼀起是⾮常诱⼈的……不要这样做。如果你能抵制诱惑,你将保持你的业务逻辑可重⽤。
部分服务通常成为库。如果不从代码中删除⼤量Spring注解,则更容易创建。
10、推荐使⽤构造函数注⼊
这⼀条实践来⾃Phil Webb(Spring Boot的项⽬负责⼈, @phillip_webb)。
保持业务逻辑免受Spring Boot代码侵⼊的⼀种⽅法是使⽤构造函数注⼊。不仅是因为@Autowired注解在构造函数上是可选的,⽽且还可以在没有Spring的情况下轻松实例化bean。适合新手的spring boot
11、熟悉并发模型
在Spring Boot中,Controller和Service是默认是单例。如果你不⼩⼼,这会引⼊可能的并发问题。你通常也在处理有限的线程池。请熟悉这些概念。
如果你正在使⽤新的WebFlux风格的Spring Boot应⽤程序,我已经解释了它在“Spring’s WebFlux/Reactor Parallelism and Backpressure”中是如何⼯作的。
12、加强配置管理的外部化
这⼀点超出了Spring Boot,虽然这是⼈们开始创建多个类似服务时常见的问题……
你可以⼿动处理Spring应⽤程序的配置。如果你正在处理多个Spring Boot应⽤程序,则需要使配置管理能⼒更加强⼤。
我推荐两种主要⽅法:
使⽤配置服务器,例如Spring Cloud Config;
将所有配置存储在环境变量中(可以基于git仓库进⾏配置)。
这些选项中的任何⼀个(第⼆个选项多⼀些)都要求你在DevOps更少⼯作量,但这在微服务领域是很常见的。
13、提供全局异常处理
你真的需要⼀种处理异常的⼀致⽅法。Spring Boot提供了两种主要⽅法:
你应该使⽤HandlerExceptionResolver定义全局异常处理策略;
你也可以在控制器上添加@ExceptionHandler注解,这在某些特定场景下使⽤可能会很有⽤。
14、使⽤⽇志框架
你可能已经意识到这⼀点,但你应该使⽤Logger进⾏⽇志记录,⽽不是使⽤System.out.println()⼿动执⾏。这很容易在Spring Boot中完成,⼏乎没有配置。只需获取该类的记录器实例:
Logger logger = Logger(MyClass.class);
这很重要,因为它可以让你根据需要设置不同的⽇志记录级别。有关Spring Boot⽇志集成点击有⼀篇实战⽂章
15、测试你的代码
这不是Spring Boot特有的,但它需要提醒——测试你的代码!如果你没有编写测试,那么你将从⼀开始就编写遗留代码。
如果有其他⼈使⽤你的代码库,那边改变任何东西将会变得危险。当你有多个服务相互依赖时,这甚⾄可能更具风险。
由于存在Spring Boot最佳实践,因此你应该考虑将Spring Cloud Contract⽤于你的消费者驱动契约,它将使你与其他服务的集成更容易使⽤。有关Spring Boot单元测试点击有⼀篇实战⽂章
16、使⽤测试切⽚让测试更容易,并且更专注
这⼀条实践来⾃Madhura Bhave(Spring 开发者, @madhurabhave23)。
使⽤Spring Boot测试代码可能很棘⼿——你需要初始化数据层,连接⼤量服务,模拟事物……实际上并不是那么难!答案是使⽤测试切⽚。
总结
感谢Spring Boot,编写基于Spring的微服务正变得前所未有的简单。我希望通过这些最佳实践,你的实施过程不仅会变得很快,⽽且从长远来看也会更加强⼤和成功。祝你好运!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论