美文网首页Java架构进阶Java 杂谈
作为程序员不得不看的一篇文----Spring Boot最佳实践

作为程序员不得不看的一篇文----Spring Boot最佳实践

作者: java架构进阶 | 来源:发表于2019-05-14 21:24 被阅读0次

    前言

    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用于你的消费者驱动合同,它将使你与其他服务的集成更容易使用。

    相关文章

      网友评论

        本文标题:作为程序员不得不看的一篇文----Spring Boot最佳实践

        本文链接:https://www.haomeiwen.com/subject/pyqyaqtx.html