Spring Boot 最佳实践
发布日期:2021-07-01 01:51:07 浏览次数:3 分类:技术文章

本文共 3356 字,大约阅读时间需要 11 分钟。

转载自  

Spring Boot是用于开发微服务的最流行的Java框架。在本文中,我将与您分享自2016年以来我在专业开发中使用Spring Boot所采用的最佳实践。本文基于我的个人经验和认可的Spring Boot方面的专家。

在本文中,我将重点介绍Spring Boot特有的实践(大多数时候,也适用于Spring项目)。

以下最佳实践未按特定顺序列出。

1使用自动配置

Spring Boot的一个主要功能是使用自动配置。这是Spring Boot的一部分,它使您的代码可以正常工作。当在类路径上检测到特定的jar文件时,它会被激活。

使用它的最简单方法是依赖Spring Boot Starters。因此,如果您想与Redis进行交互,您可以首先包括:

org.springframework.boot
spring-boot-starter-data-redis

如果你想使用MongoDB:

    
org.springframework.boot
    
spring-boot-starter-data-mongodb

对于初学者来说,您使用这些经过测试和验证的配置,可以很好地协同工作。

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

@EnableAutoConfiguration(exclude = {ClassNotToAutoconfigure.class})

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

2使用Spring Initializr启动新的Spring Boot项目

Spring Initializr 为您提供了一个简单的方法来启动一个新的Spring Boot项目并使用您可能需要的依赖项加载它。

使用Initializr创建应用程序可确保您获得经过测试和批准的依赖项,这些依赖项适用于Spring自动配置。您甚至可能会发现一些您不了解的新集成。

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

这个是针对高级用户的。

如果您在一个严重依赖Spring Boot的组织中工作,并且您有共同的问题需要解决,那么您可以创建自己的自动配置。

这项任务涉及更多,因此您需要考虑何时获益是值得投资的。与多个定制配置相比,维护单个自动配置更容易,所有配置都略有不同。

如果要将库发布到开源,提供Spring Boot配置将极大地简化数千个用户的采用。

4正确构建代码

虽然允许你有很大的自由,但是有一些基本规则值得关注,然后列出你的源代码。

  • 避免使用默认包。确保所有内容(包括您的入口点)都位于一个名称很好的包中。这样您就可以避免与布线和元件扫描相关的意外情况。

  • 将Application.java (您的条目类)保留  在顶级源目录中。

  • 我建议将控制器和服务保存在以功能为导向的模块中,但这是可选的。一些非常好的开发人员建议将所有控制器放在一起 坚持一种风格!

5保持@Controller的清洁和专注

控制器应该非常薄。您希望控制器协调和委派,而不是执行实际的业务逻辑。以下是主要做法:

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

  • 控制器不应该执行业务逻辑,而是依赖委托。

  • 控制器应该处理应用程序的HTTP层。这不应该传递给服务。

  • 控制器应该围绕用例/业务能力。

要深入到这里,将开始讨论设计REST API的最佳实践。无论您是否想要使用Spring Boot,都值得学习。

6围绕业务功能构建@Service

服务是Spring Boot的另一个核心概念。我发现最好围绕业务功能/域/用例构建服务,称之为您想要的。

使用称为AccountService,UserService,PaymentService之 类的服务的应用程序比使用DatabaseService,ValidationService,CalculationService等的应用程序更容易处理。

您可以决定使用控制器和服务之间的1对1映射。那将是理想的。这并不意味着,服务不能互相使用!

7使您的数据库成为一个细节 - 从核心逻辑中抽象出来

我曾经不确定如何在Spring Boot中最好地处理数据库交互。在阅读了罗伯特·C·马丁的“整洁的架构”之后,对我来说更加清晰。

您希望从服务中抽象出您的数据库逻辑。理想情况下,您不希望服务知道它正在与哪个数据库通信。有一些抽象可以封装对象的持久性。

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

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

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

部分服务通常成为库。如果您不必从代码中删除大量Spring注释,则更容易创建。

9支持构造函数注入

保持业务逻辑免受Spring Boot代码攻击的一种方法是依赖于Constructor Injection。@Autowired注释不仅在构造函数上是可选的,而且还可以在没有Spring的情况下轻松实例化bean。

10熟悉并发模型

在Spring Boot中,控制器和服务是默认的Singletons。如果你不小心,这会引入可能的并发问题。您通常也在处理有限的线程池。

11外部化和成熟您的配置管理

这一点超出了Spring Boot,虽然这是人们开始创建多个类似服务时常见的问题......

您可以手动处理配置Spring应用程序。如果您正在处理许多Spring Boot应用程序,则需要使配置管理成熟。

我建议两种主要方法:

  • 使用配置服务器,例如Spring Cloud Config

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

这些选项中的任何一个(第二个选项)都要求您在DevOps区域中轻轻一点,但这在微服务领域是可以预期的。

12提供全局异常处理

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

  1. 您应该使用  HandlerExceptionResolver来定义全局异常处理策略。

  2. 您可以使用@ExceptionHandler注释控制器  。如果您想在某些情况下特定,这可能会很有用。

13使用日志框架

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

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

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

14测试你的代码

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

如果有其他人来到你的代码库,很快就会改变任何东西。当您有多个服务相互依赖时,这甚至可能更具风险。

由于存在Spring Boot最佳实践,因此您应该考虑将Spring Cloud Contract用于您的消费者驱动合同。它将使您与其他服务的集成更容易使用。

15使用测试切片使您的测试更容易,更专注

使用Spring Boot测试代码可能很棘手 - 您需要初始化数据层,连接大量服务,模拟事物......实际上并不是那么难!

答案是 - 使用测试切片。

使用测试切片,您可以根据需要仅连接部分应用程序。这可以为您节省大量时间,并确保您的测试不会与您未使用的内容相关联。

 

总结

感谢Spring Boot,它使我们编写基于Spring的微服务变得前所未有的简单。希望通过这些最佳实践,您的实施过程不仅会很快,而且从长远来看也会更加强大和成功。祝您好运!

转载地址:https://maokun.blog.csdn.net/article/details/82824315 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:面试官最爱问的并发问题
下一篇:如何让面试官认可你的简历

发表评论

最新留言

能坚持,总会有不一样的收获!
[***.219.124.196]2024年04月12日 17时14分12秒