springboot最流行的16条实践

ddgougou      2022-05-08     471

关键词:

 

  Spring Boot是最流行的用于开发微服务的Java框架。在本文中,我将重点介绍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>

  通过使用以下注解属性,可以从自动配置中排除某些配置类,但只有在绝对必要时才应该这样做。

    1. @EnableAutoConfiguration(exclude = {ClassNotToAutoconfigure.class})

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

  Spring Initializr 提供了一个超级简单的方法来创建一个新的Spring Boot项目,并根据你的需要来加载可能使用到的依赖。使用Initializr创建应用程序可确保你获得经过测试和验证的依赖项,这些依赖项适用于Spring自动配置。你甚至可能会发现一些新的集成,但你可能并没有意识到这些。

https://start.spring.io/

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

  如果你在一个严重依赖Spring Boot的公司或团队中工作,并且有共同的问题需要解决,那么你可以创建自己的自动配置。这项任务涉及较多工作,因此你需要考虑何时获益是值得投入的。与多个略有不同的定制配置相比,维护单个自动配置更容易。如果将这个提供Spring Boot配置以开源库的形式发布出去,那么将极大地简化数千个用户的配置工作。

5、正确设计代码目录结构

    尽管允许你有很大的自由,但是有一些基本规则值得遵守来设计你的源代码结构。

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

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

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

6、保持@Controller的简洁和专注

Controller应该非常简单。。你希望控制器作为协调和委派的角色,而不是执行实际的业务逻辑。以下是主要做法:

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

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

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

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

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

7、围绕业务功能构建@Service

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

在应用中设计名称类似 AccountService, UserService, PaymentService这样的服务,比起像DatabaseServiceValidationServiceCalculationService这样的会更合适一些。

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

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

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

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

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

将各种Spring Boot代码混合在一起是非常诱人的……不要这样做。如果你能抵制诱惑,你将保持你的业务逻辑可重用。部分服务通常成为库。如果不从代码中删除大量Spring注解,则更容易创建。

10、推荐使用构造函数注入

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

11、熟悉并发模型

我认为这样做的原因是这个领域经常被误解和忽视。如果使用不当,就会出现问题。

https://www.e4developer.com/2018/03/30/introduction-to-concurrency-in-spring-boot/

在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注解,这在某些特定场景下使用可能会很有用。

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

https://www.baeldung.com/exception-handling-for-rest-with-spring

14、使用日志框架

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

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

 

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

15、测试你的代码

  这不是Spring Boot特有的,但它需要提醒——测试你的代码!如果你没有编写测试,那么你将从一开始就编写遗留代码。如果有其他人使用你的代码库,那边改变任何东西将会变得危险。当你有多个服务相互依赖时,这甚至可能更具风险。由于存在Spring Boot最佳实践,因此你应该考虑将Spring Cloud Contract用于你的消费者驱动契约,它将使你与其他服务的集成更容易使用。

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

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

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

https://spring.io/blog/2016/08/30/custom-test-slice-with-spring-boot-1-4

总结

  感谢Spring Boot,编写基于Spring的微服务正变得前所未有的简单。

 

springboot生产中16条最佳实践(代码片段)

...限时折扣中,一本深入讲解Java基础的干货笔记!SpringBoot是最流行的用于开发微服务的Java框架。在本文中,我将与你分享自2016年以来我在专业开发中使用SpringBoot所采用的最佳实践。这些内容是基于我的个人经验和一... 查看详情

springboot生产中16条最佳实践(代码片段)

...限时折扣中,一本深入讲解Java基础的干货笔记!SpringBoot是最流行的用于开发微服务的Java框架。在本文中,我将与你分享自2016年以来我在专业开发中使用SpringBoot所采用的最佳实践。这些内容是基于我的个人经验和一... 查看详情

两年摸爬滚打springboot,总结了这16条最佳实践(代码片段)

SpringBoot是最流行的用于开发微服务的Java框架。在本文中,我将与你分享自2016年以来我在专业开发中使用SpringBoot所采用的最佳实践。这些内容是基于我的个人经验和一些熟知的SpringBoot专家的文章。在本文中,我将重点介绍SpringB... 查看详情

两年摸爬滚打springboot,总结了这16条最佳实践(代码片段)

SpringBoot是最流行的用于开发微服务的Java框架。在本文中,我将与你分享自2016年以来我在专业开发中使用SpringBoot所采用的最佳实践。这些内容是基于我的个人经验和一些熟知的SpringBoot专家的文章。在本文中,我将重点介绍SpringB... 查看详情

springboot生产中16条最佳实践

...依赖2、使用自动配置3、使用SpringInitializr来开始一个新的SpringBoot项目4、考虑为常见的组织问题创建自己的自动配置5、正确设计代码目 查看详情

springboot实践总结(转)

...服务的Java框架。在本文主要分享的是在专业开发中使用SpringBoot所采用的最佳实践。这些内容是基于个人经验和一些熟知的SpringBoot专家的文章。 在本文中重点介绍SpringBoot特有的实践(大多数时候,也适用于Spring项目)。以... 查看详情

springboot迭代发布下的jar瘦身实践(代码片段)

...成显卡  blog.csdn.net/ssrc0604hx/article/details/54175027背景随着SpringBoot的流行,越来越多开发者选择使用SpringBoot来发布Web应用。不同于传统的War包发布,SpringBoot把整个项目打包成一个可运行的Jar包ÿ 查看详情

建设kubernetes生产环境的16条建议(代码片段)

...也很复杂。我们整理了以下清单,以帮助你生产环境最佳实践Kubernetes(Kubernetes生产环境最佳实践)。容器最佳实践Kubernetes提供了一种编排容器化服务的方法,因此,如果您没有按顺序实践你的容器,那么集群一开始就不会 查看详情

微服务实践

...有太多的体会和经验的。从最初的开源软件云收藏来熟悉SpringBoot,到项目中的慢慢使用,再到最后全面拥抱SpringCloud。这篇文章就给大家介绍 查看详情

什么是最可靠和最流行的 Node.js 模板引擎? [关闭]

】什么是最可靠和最流行的Node.js模板引擎?[关闭]【英文标题】:WhatisthemostreliableandpopularNode.jstemplatingengine?[closed]【发布时间】:2013-01-0413:16:54【问题描述】:Nodenoobie问题我希望有智慧的人可以帮助回答:1)最可靠和最流行的Nod... 查看详情

springboot对于数据源的动态管理实践(代码片段)

springboot对于数据源的动态管理实践需求用户通过界面配置数据源,可能包括oracle、mysql、mongodb等等;配置完数据源后,支持对于具体数据源进行实时sql查询操作。一般来说,如果不考虑性能,最简单的实现就是每次进行sqlconnecnt... 查看详情

springboot最佳实践集成jsp与生产环境部署

...市面上仍有很多的公司在使用JSP,所以本文就来介绍一下SpringBoot怎么集成JSP开发,以及生产环境的详细部署方法。二、集成JSP开发环境SpringBoot2.0.4RELEASETomcat9.0.10IDEA(IntellijIDEA简称,下文统 查看详情

请问2021年最稳定的jdk版本or哪个最好用,最流行!

...长的版本了。更有甚者1.7以下的使用者不在少数,1.8兼容springboot,虽说目前jdk已经更新到jdk15了,但是多数人都是了解下新版本的特性,项目使用还是1.8居多,这样能保证很好的兼容性。 查看详情

25springboot发送邮件

...i推出了JavaMailSender更加简化了邮件发送的代码编写,现在springboot对此进行了封装就有了现在 查看详情

25springboot发送邮件

...i推出了JavaMailSender更加简化了邮件发送的代码编写,现在springboot对此进行了封装就有了现在 查看详情

ASCII 艺术文档的流行 JavaDoc 实践是啥? [关闭]

】ASCII艺术文档的流行JavaDoc实践是啥?[关闭]【英文标题】:WhatisapopularJavaDocpracticeforASCII-artdocumentation?[closed]ASCII艺术文档的流行JavaDoc实践是什么?[关闭]【发布时间】:2014-02-0520:03:32【问题描述】:我正在开发一个用Java编写的... 查看详情

编程实践精华总结集锦系列1:springboot/maven/idea/java/kotlin/redis等等

UNIX设计哲学:Doonethinganddoitwell一次只做一件事,并做到极致。《UNIX编程艺术》一书,提出的17条编程原则,经过时间和实践的锤炼,发展成为Unix哲学17条原则,在维基百科能搜到。下面就来说说我对这17要... 查看详情

springboot2.x实践记:h2database(代码片段)

...H2Console小结TL;DR今天,我们一起来快速学习下如何在SpringBoot2下配置H2数据库。H2作为内存数据库,被广泛应用于本地单元测试,开发环境数据表操作,临时数据存储等。1.H2Database什么是H2Database?H2是用Java编写... 查看详情