https://www.e4developer.com/2018/08/06/

  • 1、使用自定义BOM来维护第三方依赖

  • 2、使用自动配置

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

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

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

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

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

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

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

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

  • 11、熟悉并发模型

  • 12、加强配置管理的外部化

  • 13、提供全局异常处理

  • 14、使用日志框架

  • 15、测试你的代码

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

  • 总结


Spring Boot是最流行的用于开发微服务的Java框架。

在本文中,我将与你分享自2016年以来我在专业开发中使用Spring Boot所采用的最佳实践。

这些内容是基于我的个人经验和一些熟知的Spring Boot专家的文章。

在本文中,我将重点介绍Spring Boot特有的实践(大多数时候,也适用于Spring项目)。以下依次列出了最佳实践,排名不分先后。

欢迎胖友在文末留言,分享你的 Spring Boot 的最佳实践。

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>

借助于这些starters,这些繁琐的配置就可以很好地集成起来并协同工作,而且它们都是经过测试和验证的。

这非常有助于避免可怕的Jar地狱。

https://dzone.com/articles/what-is-jar-hell

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

@EnableAutoConfiguration(exclude = {ClassNotToAutoconfigure.class})

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

有关自动配置的官方文档可在此处找到:

https://docs.spring.io/spring-boot/docs/current/reference/html/using-boot-auto-configuration.html。

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

这一条最佳实践来自Josh Long (Spring Advocate,@starbuxman)。

Spring Initializr 提供了一个超级简单的方法来创建一个新的Spring Boot项目,并根据你的需要来加载可能使用到的依赖。

https://start.spring.io/

使用Initializr创建应用程序可确保你获得经过测试和验证的依赖项,这些依赖项适用于Spring自动配置。

你甚至可能会发现一些新的集成,但你可能并没有意识到这些。

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

这一条也来自Josh Long(Spring Advocate,@starbuxman)——这个实践是针对高级用户的。

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

这项任务涉及较多工作,因此你需要考虑何时获益是值得投入的。

与多个略有不同的定制配置相比,维护单个自动配置更容易。

如果将这个提供Spring Boot配置以开源库的形式发布出去,那么将极大地简化数千个用户的配置工作。

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

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

避免使用默认包。

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

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

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

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

Controller应该非常简单。你可以在此处阅读有关GRASP中有关控制器模式部分的说明。

你希望控制器作为协调和委派的角色,而不是执行实际的业务逻辑。

以下是主要做法:

https://en.wikipedia.org/wiki/GRASP_(object-oriented_design)#Controller

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

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

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

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

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

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

Service是Spring Boot的另一个核心概念。

我发现最好围绕业务功能/领域/用例(无论你怎么称呼都行)来构建服务。

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

你可以决定使用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。

11、熟悉并发模型

我写过的最受欢迎的文章之一是“介绍Spring Boot中的并发”。

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

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、使用测试切片让测试更容易,并且更专注

这一条实践来自Madhura Bhave(Spring 开发者, @madhurabhave23)。

使用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的微服务正变得前所未有的简单。

我希望通过这些最佳实践,你的实施过程不仅会变得很快,而且从长远来看也会更加强大和成功。祝你好运!

架构师小秘圈

聚集20万架构师的小圈子

长按二维码 ▲

关注「架构师小秘圈」公众号

在看↓

Spring Boot 最流行的 16 条实践解读!相关推荐

  1. Spring Boot 最流行的 16 条实践解读,值得收藏!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:Jedrzejewski 来源:e4developer.co ...

  2. 老司机给我们解读 Spring Boot 最流行的 16 条实践忠告

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 来源 | http://e4developer.com/2 ...

  3. 老司机给我们解读 Spring Boot 最流行的 16 条实践

    点击上方"朱小厮的博客",选择"设为星标" 后台回复"书",获取个xxx Spring Boot 是最流行的用于开发微服务的 Java 框架 ...

  4. 老司机入职一周,给我们解读 Spring Boot 最流行的 16 条实践

    Spring Boot 是最流行的用于开发微服务的 Java 框架.在本文中,我将与你分享自 2016 年以来我在专业开发中使用 Spring Boot 所采用的最佳实践.这些内容是基于我的个人经验和 ...

  5. spring cloud是什么时候流行的_老司机给我们解读 Spring Boot 最流行的 16 条实践 - 码农突围

    Spring Boot 是最流行的用于开发微服务的 Java 框架.在本文中,我将与你分享自 2016 年以来我在专业开发中使用 Spring Boot 所采用的最佳实践.这些内容是基于我的个人经验和 ...

  6. Spring Boot 最流行的 16 条最佳实践!

    点击上方 IT牧场 ,选择 置顶或者星标技术干货每日送达! 来源:http://t.cn/EJWZNra Spring Boot是最流行的用于开发微服务的Java框架.在本文中,我将与你分享自2016 ...

  7. Spring Boot 生产中的 16 条最佳实践

    来源:www.e4developer.com/2018/08/06/ Spring Boot是最流行的用于开发微服务的Java框架.在本文中,我将与你分享自2016年以来我在专业开发中使用Spring ...

  8. Spring Boot 架构中的国际化支持实践—— Spring Boot 全球化解决方案

    背景 Spring Boot 主要通过 Maven 或 Gradle 这样的构建系统以继承方式添加依赖,同时继承了 Spring 框架中的优秀元素,减少了 Spring MVC 架构中的复杂配置,内置 ...

  9. 后端技术:Spring Boot 项目打包 + Shell 脚本部署实践,太有用了!

    本篇和大家分享的是 Spring Boot 打包并结合 Shell 脚本命令部署,重点在分享一个shell 程序启动工具,希望能便利工作: profiles指定不同环境的配置 maven-assemb ...

最新文章

  1. 两种方法动态加载外部原生JS文件
  2. 抓取网络文件的URL地址作附件发送
  3. 链表思想(我是如何理解链表)
  4. 可行性nullpoj 2723 Get Luffy Out 2sat
  5. 编程软件python中的if用法-Python编程工具pycharm的使用
  6. 为什么C++(来自C++之父的观点)
  7. redis高并发抽奖
  8. IBM将利用Watson进行报税 以彰显人工智能优势
  9. epublib java_使用Epublib处理epub文件 | 学步园
  10. 前端开发——移动端及响应式布局解决办法总结(适配)
  11. [react] 在React中你有遇到过安全问题吗?怎么解决?
  12. HTML学习笔记--HTML的语法【1】
  13. org.apache.http.NoHttpResponseException
  14. Zoho中国:如何利用好免费版CRM
  15. A LEARNED REPRESENTATION FOR ARTISTIC STYLE
  16. 分享一个目前还支持离线下载的网盘
  17. CCF公布国家集训队50进15名单!5月确定IOI2019选手!
  18. 远程桌面无法连接 计算机死机,远程桌面被远程的机器就死机解决方案
  19. 给大家分享一款非常漂亮的博客
  20. 各大互联网公司架构演进之路汇总

热门文章

  1. LCA ---- E. Tree Queries[LCA或者dfs序的解法]
  2. 自定义表单mysql_自定义表单,计算答案然后更新mysql DB(Custom form, calculate answer then update mysql DB)...
  3. ajax对象状态0,ajax返回readyState为0?
  4. SWPU ACM2020 年预备队员选拔赛 题解
  5. 【动态规划专题】最长上升子序列模型
  6. miniui列表下拉允许编辑且保存_办公小技巧:请个好用的文本代码编辑器
  7. 协整检验r语言代码_R语言学习笔记(一):时间序列分析
  8. Javascript基础知识篇(5): 面向对象之链式调用
  9. Springboot 使用thymeleaf模板layout布局
  10. Markdown学习之路