一些研发工程师在Springboot注意点
一些研发工程师在Springboot注意点
1. 正确设计代码目录结构
虽然您有很大的自由度,但有一些基本规则值得遵循来设计您的源代码结构。
避免使用默认包。确保所有内容(包括入口点)都在命名良好的包中,这样您就可以避免与组装和组件扫描相关的意外情况;
将 Application.java(应用程序的入口类)放在顶级源目录中;
建议将控制器和服务放在面向功能的模块中,但这是可选的。一些非常优秀的开发人员建议将所有控制器放在一起。无论如何,坚持一种风格!
2. 保持 @Controller 简洁和专注控制器应该非常简单。
可以在这里阅读 GRASP 中的控制器模式部分。希望控制器充当协调员和委托者,而不是执行实际的业务逻辑。以下是主要实践:
https://en.wikipedia.org/wiki/GRASP(object-orienteddesign)#Controller
控制器应该是无状态的!控制器默认是单例的,任何状态都可能引起许多问题;
控制器不应执行业务逻辑,而是依赖于委托;
控制器应处理应用程序的 HTTP 层,这不应该传递给服务;
控制器应围绕用例/业务能力设计。
要深入了解此内容,需要了解更多有关设计 REST API 的最佳实践。无论是想使用 Spring Boot 还是其他,这都值得学习。
3. 围绕业务功能构建 @Service
Service 是 Spring Boot 的另一个核心概念。
最好是围绕业务功能/域/用例(无论您愿意如何称呼)的结构化服务。
在应用程序中设计名称为 AccountService、UserService 等的服务比 DatabaseService、ValidationService、CalculationService 更合适。
可以决定在控制器和服务之间建立一对一的映射,这将是理想的。但这并不意味着服务不能相互调用!
4. 使数据库与核心业务逻辑独立
在之前,我们不确定如何最好地处理 Spring Boot 中的数据库交互。
阅读 Robert C. Martin 的《清晰架构》之后,对此有了更清晰的理解。
希望您的数据库逻辑与服务分离。理想情况下,您不希望服务知道它正在与哪个数据库交互,这需要一些抽象来封装对象持久化。
Robert C. Martin 强调,您的数据库是一个“细节”,这意味着不将应用程序耦合到特定的数据库。过去很少有人会切换数据库,而我注意到使用 Spring Boot 和现代微服务开发使事情变得更快。
5. 将业务逻辑与 Spring Boot 代码分离
考虑到《清晰架构》的教训,您应该保护您的业务逻辑。
混合各种 Spring Boot 代码是非常诱人的……不要这样做。如果您能抵制诱惑,您将使您的业务逻辑更具可重用性。
服务的一部分通常会成为一个库。删除代码中许多 Spring 注解变得更容易。
6. 推荐使用构造函数注入
这个实践来自 Phil Webb(Spring Boot 项目负责人,@phillip_webb)。
将您的业务逻辑与 Spring Boot 代码分离的一种方法是使用构造函数注入。
构造函数上的 @Autowired 注解不仅是可选的,而且使得在没有 Spring 的情况下实例化 bean 变得更容易。
7. 熟悉并发模型
最受欢迎的文章之一是《Spring Boot 并发简介》
认为之所以受欢迎是因为这个领域经常被误解和忽视。如果使用不当,可能会出现问题。
在 Spring Boot 中,默认情况下,Controller 和 Service 是单例的。如果不小心,这可能引入可能的并发问题。您通常也在处理有限的线程池。请熟悉这些概念。
如果正在使用新的 WebFlux 风格的 Spring Boot 应用程序,已经在“Spring 的 WebFlux/Reactor 并行性和压力”中解释了它是如何工作的。
8.加强配置管理的外部化
这超出了 Spring Boot 的范围,尽管这是当人们开始创建多个相似服务时常见的问题……
您可以手动处理 Spring 应用程序的配置。如果您正在处理多个 Spring Boot 应用程序,您需要使配置管理更加强大。
推荐两种主要方法:
1) 使用配置服务器,比如 Spring Cloud Config,国内的Nacos
2) 将所有配置存储在环境变量中(可以基于 git 仓库进行配置)。
这两种选项(第二种选项稍微更多一些)都需要您在 DevOps 上做更少的工作,但在微服务世界中这是相当常见的.
9. 提供全局异常处理
真的需要一种一致的方式来处理异常。Spring Boot 提供了两种主要方法:
您应该使用 HandlerExceptionResolver 来定义全局异常处理策略;
您也可以在控制器中添加 @ExceptionHandler 注解,在某些特定情况下可能有用。
10.使用日志框架
可能已经意识到这一点,但应该使用 Logger 来记录日志,而不是手动使用 System.out.println()。
在 Spring Boot 中,只需在类中获取日志记录器实例即可,几乎不需要配置:
Logger logger = LoggerFactory.getLogger(MyClass.class);
11.测试您的代码
这并不是特定于 Spring Boot,但需要提醒 — 测试您的代码!如果您不编写测试,那么从一开始就编写了遗留代码。
如果其他人使用您的代码库,对其进行任何更改都会变得危险。当您拥有相互依赖的多个服务时,这可能变得更加危险。
由于存在 Spring Boot 最佳实践,您应该考虑使用 Spring Cloud Contract 来进行消费者驱动的.
今天先到这儿,希望对云原生,技术领导力, 企业管理,系统架构设计与评估,团队管理, 项目管理, 产品管管,团队建设 有参考作用 , 您可能感兴趣的文章:
领导人怎样带领好团队
构建创业公司突击小团队
国际化环境下系统架构演化
微服务架构设计
视频直播平台的系统架构演化
微服务与Docker介绍
Docker与CI持续集成/CD
互联网电商购物车架构演变案例
互联网业务场景下消息队列架构
互联网高效研发团队管理演进之一
消息系统架构设计演进
互联网电商搜索架构演化之一
企业信息化与软件工程的迷思
企业项目化管理介绍
软件项目成功之要素
人际沟通风格介绍一
精益IT组织与分享式领导
学习型组织与企业
企业创新文化与等级观念
组织目标与个人目标
初创公司人才招聘与管理
人才公司环境与企业文化
企业文化、团队文化与知识共享
高效能的团队建设
项目管理沟通计划
构建高效的研发与自动化运维
某大型电商云平台实践
互联网数据库架构设计思路
IT基础架构规划方案一(网络系统规划)
餐饮行业解决方案之客户分析流程
餐饮行业解决方案之采购战略制定与实施流程
餐饮行业解决方案之业务设计流程
供应链需求调研CheckList
企业应用之性能实时度量系统演变
如有想了解更多软件设计与架构, 系统IT,企业信息化, 团队管理 资讯,请关注我的微信订阅号:
作者:Petter Liu
出处:http://www.cnblogs.com/wintersun/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
该文章也同时发布在我的独立博客中-Petter Liu Blog。