Spring Boot最佳实践

这是来自于e4developer的一篇微服务最佳实践: 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>

如果你想使用MongoDB,你有:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

依赖于这些Starter,依靠这些经过测试和验证的配置,可以很好地协同工作。这有助于避免可怕的Jar Hell(Jar包地域)。 通过使用以下注释属性,可以从自动配置中排除某些类: @EnableAutoConfiguration(exclude = {ClassNotToAutoconfigure.class}),但只有在绝对必要时才应该这样做。 正确构建代码 虽然你有很大的自由,但是有一些基本规则值得关注,然后才能写出你的源代码。 1.避免使用默认包,确保所有内容(包括您的入口点)都位于一个名称很好的包中。这样就可以避免与自动配对和组件扫描相关的意外情况。 2.将Application.java (您的入口类)保留在顶级源目录中。 3.我建议将控制器和服务保存在以功能为导向的模块中,但这是可选的。一些非常好的开发人员建议将所有控制器放在一起,坚持一种风格! 保持@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用于你的消费者驱动合同,它将使你与其他服务的集成更容易使用。

原文发布于微信公众号 - Linyb极客之路(gh_c420b2cf6b47)

原文发表时间:2018-08-10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏技术墨客

Jolokia架构介绍 原

    虽然jolokia是为了满足JSR-160的要求,但是他和JSR-160连接器有巨大的差异。其中最引人注目的区别是jolokia传递数据是无类型的数据(...

1143
来自专栏史上最简单的Spring Cloud教程

我是如何根据豆瓣api来理解Restful API设计的

1.什么是REST REST全称是Representational State Transfer,表述状态转移的意思。它是在Roy Fielding博士论文首次...

2505
来自专栏Java架构师历程

springcloud(二):注册中心Eureka

Eureka是Netflix开源的一款提供服务注册和发现的产品,它提供了完整的Service Registry和Service Discovery实现。也是sp...

1131
来自专栏散尽浮华

Centos7下部署分布式跟踪工具Pinpoint的操作记录

一、Pinpoint简单介绍 Pinpoint是一款对Java编写的大规模分布式系统的APM工具,有些人也喜欢称呼这类工具为调用链系统、分布式跟踪系统。一般来说...

1502
来自专栏向治洪

android binder机制详解

摘要 Binder是android中一个很重要且很复杂的概念,它在系统的整体运作中发挥着极其重要的作用,不过本文并不打算从深层次分析Binder机制,有两点原...

2475
来自专栏闻道于事

Spring技术内幕:设计理念和整体架构概述

2593
来自专栏微信公众号:Java团长

Java开发必须要知道的知识体系

Java是超高人气编程语言,拥有跨平台、面向对象、泛型编程等特性。在TIOBE编程语言排行榜中,连续夺得第一宝座,而且国内各大知名互联网公司,后端开发首选语言:...

1772
来自专栏纯洁的微笑

springcloud(二):注册中心Eureka

Eureka是Netflix开源的一款提供服务注册和发现的产品,它提供了完整的Service Registry和Service Discovery实现。也是sp...

4037
来自专栏A周立SpringCloud

理解Eureka的自我保护模式

本文我们来探讨Eureka的自我保护模式。自我保护模式是Eureka的重要特性。进入自我保护模式最直观的体现,是Eureka Server首页输出的警告,如图4...

3817
来自专栏程序你好

流行的9个Java框架介绍: 优点、缺点等等

在2018年,Java仍然是世界上最流行的编程语言。它拥有一个巨大的生态系统,在全世界有超过900万Java开发人员。虽然Java不是最直接的语言,但是您不需要...

2002

扫码关注云+社区

领取腾讯云代金券