微服务系列文章之 SpringBoot 最佳实践

news2024/12/25 13:12:20

Spring Boot 是一种广泛使用且非常流行的企业级高性能框架。

以下是一些最佳实践和一些技巧,我们可以使用它们来改进 Spring Boot 应用程序并使其更加高效。

Spring Boot 的四大核心

1、自动配置

针对很多Spring应用程序和常见的应用功能,Spring Boot相关配置可自动提供,通过简单的配置,甚至零配置,可以构建一套完整的框架。

2、起步依赖

告诉Spring Boot它可以引入所需的依赖库;通过启动依赖机制(Starter),简化jar包的引用,解决jar版本的冲突。

3、Actuator

是SpringBoot的程序监控器,可以监控Spring应用程序上下文中的Beann、查看自动配置决策、Controller映射、线程活动、应用程序健康状况等,能深入运行的Spring Boot应用程序,探索Spring boot 程序内部信息。

4、命令界面

这是Spring Booot的可选特性主要用于Grovy语言。

Spring Boot 的应用场景

1、快速构建RESTful API服务

Spring Boot提供了一系列的自动配置和基础组件,可以帮助你快速构建基于 Spring MVC 的 RESTful API 服务。

2、快速构建微服务架构

Spring Boot 提供了一系列的微服务工具和组件,包括服务注册与发现、负载均衡、断路器等,可以帮助你快速构建微服务架构。

3、快速构建企业级应用

Spring Boot 提供了丰富的企业级应用组件,包括数据持久化、消息中间件、安全认证、任务调度等,可以帮助你快速构建企业级应用。

4、快速构建云原生应用

Spring Boot 提供了对云原生应用的支持,包括对云服务的集成、对容器化应用的支持等,可以帮助你快速构建云原生应用。

1.正确的包目录风格

正确的包目录将有助于轻松理解代码和应用程序的流程。

我们可以使用有意义的包目录来构建我们的应用程序。

我们可以将所有控制器包含在单独的包中,将服务包含在单独的包中,将 util 类包含在单独的包中等等。这种风格在小型微服务中非常方便。

如果我们正在处理庞大的代码库,则可以使用基于功能模块的方法。我们可以根据我们的要求来决定。

基于类型

基于功能模块

2.使用设计模式

没什么好说的,设计模式已经是现代编程中编写可维护、可扩展代码的最佳实践。

3.使用 Spring Boot starter

这是 Spring Boot 的一个很酷的功能。

我们可以非常轻松地使用启动器依赖项,而无需一一添加单个依赖项。这些入门依赖项已与所需的依赖项捆绑在一起。

例如,如果我们添加 spring-boot-starter-web 依赖项,默认情况下它会与 jackson、spring-core、spring-mvc 和 spring-boot-starter-tomcat 依赖项捆绑在一起。

所以我们不需要关心单独添加依赖项。它还可以帮助我们避免版本不匹配。

4.使用生产版本的依赖项

始终建议使用最新的稳定 GA 版本。

有时它可能会因 Java 版本、服务器版本、应用程序类型等而有所不同。

不要使用同一包的不同版本,如果存在多个依赖项,请始终使用 <properties> 指定版本。

5.使用 Lombok

作为一名 Java 开发人员,我们可能听说过 Lombok 项目。

Lombok 是一个 Java 库,可用于减少代码并允许我们使用其注释编写干净的代码。

例如,我们可能在某些类(如实体、请求/响应对象、dtos 等)中使用大量的 getter 和 setter 行。

但如果你使用 Lombok,它只是一行,你可以根据你的要求使用@Data、@Getter 或@Setter。

我们也可以使用 Lombok 记录器注释。推荐@Slf4j。

6.将构造函数注入与 Lombok 一起使用

 

但我们强烈建议使用构造函数注入而不是其他类型。因为它允许应用程序在初始化时初始化所有必需的依赖项。

这对于单元测试非常有用。

重要的是,我们可以使用 Lombok 的 @RequiredArgsConstructor 注释来使用构造函数注入。

7.使用 slf4j 日志

日志记录非常重要,如果我们的应用程序在生产过程中出现问题,日志记录是找出根本原因的唯一方法。因此,在添加记录器、日志消息类型、记录器级别和记录器消息之前应该仔细考虑。

不要使用 System.out.print()建议将 Slf4j 与 Spring Boot 中默认的日志框架 logback 一起使用。

始终使用 slf4j 的 {} 占位符语法,避免在记录器消息中使用字符串插值。因为字符串插值会消耗更多的内存。

我们可以使用 Lombok @Slf4j 注释非常轻松地创建日志记录器。

如果我们处于微服务环境中,则可以使用 ELK 技术栈。

8.控制器仅用于路由

  • 控制器专用于路由。

  • 它是无状态且单体的。

  • DispatcherServlet 将检查控制器上的 @RequestMapping

  • 控制器是请求的最终目标,请求将交给服务层并由服务层处理。

  • 业务逻辑不应位于控制器中。

9.使用Service来实现业务逻辑

  • 完整的业务逻辑包含验证、缓存等。

  • 与持久层通信并接收结果。

  • Service也是单例的。

10.避免空指针异常

  • 为了避免 NullPointerException,我们可以使用 java.util 包中的 Optional。

  • 我们还可以使用空安全库。例如:Apache Commons StringUtils

  • 对已知对象调用 equals() 和 equalsIgnoreCase() 方法。

  • 使用 valueOf() 而不是 toString()

  • 使用基于 IDE 的 @NotNull 和 @Nullable 注释。

11.使用集合框架的最佳实践

  • 对我们的数据集使用适当的集合。

  • 将 forEach 与 Java 8 功能结合使用,并避免使用旧版 for 循环。

  • 使用接口类型而不是实现。

  • 使用 isEmpty() 而不是 size() 以获得更好的可读性。

  • 不返回空值,可以返回空集合。

  • 如果我们使用对象作为要存储在基于哈希的集合中的数据,则应重写 equals() 和 hashCode() 方法。

12.使用分页

这将提高应用程序的性能。

如果我们使用 Spring Data JPA,则 PagingAndSortingRepository 使分页的使用变得非常容易且几乎不费吹灰之力。

13.使用缓存

在谈论应用程序性能时,缓存是另一个重要因素。

默认情况下,Spring Boot 通过 ConcurrentHashMap 提供缓存,我们可以通过 @EnableCaching 注解来实现这一点。如果我们对默认缓存不满意,可以使用 Redis、Hazelcast 或任何其他分布式缓存实现。

Redis 和 Hazelcast 是内存缓存方法。我们还可以使用数据库缓存实现。

14.使用自定义异常处理程序和全局异常处理

  • 这在使用大型企业级应用程序时非常重要。

  • 除了一般异常之外,我们可能还会有一些场景来识别某些特定的错误情况。

  • 异常顾问可以使用@ControllerAdvice 创建,我们可以创建具有有意义细节的单独异常。

  • 它将使得将来识别和调试错误变得更加容易。

15.使用自定义响应对象

自定义响应对象可用于返回包含某些特定数据的对象,并满足 HTTP 状态代码、API 代码、消息等要求。

我们可以使用构建器设计模式来创建具有自定义属性的自定义响应对象。

16.删除不必要的代码、变量、方法和类。

  • 未使用的变量声明将占用一些内存。

  • 删除未使用的方法、类等,因为它会影响应用程序的性能。

  • 尽量避免嵌套循环。我们可以使用map代替。

17.使用注释

注释是一个很好的做法。

不要对一切代码发表注释。相反,我们可以使用类、函数、方法、变量等有意义的单词编写描述性代码。

删除注释代码、误导性注释和故事型注释。

我们可以使用注释进行警告,并解释一些乍一看难以理解的内容。

18.对类、方法、函数、变量和其他属性使用有意义的词语。

这看起来很简单,但影响却是巨大的。

始终使用正确的有意义且可搜索的命名约定以及正确的大小写。

通常,我们在声明类、变量和常量时使用名词或短语。例如:字符串 firstNameconst isValid

我们可以使用带有形容词的动词和短语来表示函数和方法。例如:readFile()sendData()

避免使用缩写变量名和意图揭示的名称。例如:int i;字符串 getExUsr;

如果我们有意义地使用此功能,则可以减少声明注释行。由于它具有有意义的名称,新开发人员可以通过阅读代码轻松理解。

19.使用正确的大小写进行声明

有许多不同的大小写,如大写、小写、驼峰命名、帕斯卡命名、蛇命名、大蛇式命名、短横线命名等。

但我们需要确定哪个案例专用于哪个变量。

通常,我会遵循:

  • 类 — 帕斯卡命名

  • 方法和变量 — 驼峰命名

  • 常量 — 大蛇式命名

  • 数据库相关字段 — 短横线命名

这只是一个例子,它可能与我们在公司遵循的标准不同。

20.简单点

始终尝试编写简单、可读的代码,同样简单的逻辑可以用不同的方式实现,但是如果不可读或不理解就很难理解。

有时复杂的逻辑会消耗更多的内存,编写代码时尝试使用 KISS、DRY 和 SOLID 原则。

21.使用通用的代码格式样式

格式样式因开发人员而异。编码风格的改变也被认为是一种改变,并且会使代码合并变得非常困难。

为了避免这种情况,团队可以采用通用的编码格式。

22.使用 SonarLint 插件

这对于识别小错误和最佳实践非常有用,以避免不必要的错误和代码质量问题。

我们可以将插件安装到我们最喜欢的 IDE 中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/900123.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux 线程的概念与实现方式

一、线程的概念 线程是进程内部的一条执行序列或执行路径&#xff0c;一个进程可以包含多条线程。 一个进程中有两条或多条执行路径的时候&#xff0c;它们是可以同时执行的&#xff0c;也就是说&#xff0c;一个进程中的多个线程是可以同时执行的。当我们需要一个程序同时执行…

【LeetCode-简单题】49. 字母异位词分组

题目 题解一:排序哈希表 思路:由于互为字母异位词的两个字符串包含的字母相同&#xff0c;因此对两个字符串分别进行排序之后得到的字符串一定是相同的&#xff0c;故可以将排序之后的字符串作为哈希表的键。 核心api: //将字符串转换为字符数组char[] ch str.toCharArray();…

飞机打方块(二)游戏界面制作

一、背景 1.新建bg节点 二、飞机节点功能实现 1.移动 1.新建plane节点 2.新建脚本GameController.ts,并绑定Canvas GameControll.ts const { ccclass, property } cc._decorator;ccclass export default class NewClass extends cc.Component {property(cc.Node)canvas:…

详解strcmp函数

strcmp函数是用来比较两个字符串的&#xff0c;按理来说&#xff0c;比较结果只有两种&#xff1a;相同或不同。但是&#xff0c;事实上&#xff0c;strcmp函数在设计时会有三种情况&#xff0c;下面详细介绍&#xff1a; 这个函数的输入为两个字符串的首元素地址&#xff08;即…

Hlang--用Python写个编程语言-逻辑运算

文章目录 前言关键词解析token解析器解释器语法表示前言 在上一篇文章里面,实现了基本的变量,并且详细地阐述了基本原理,所以的话,这里要实现的就是这个判断,由于架子基本上打好了,后面的操作无法就是确定这个AST的一个执行顺序,也就是我们希望解释器执行的一个情况。 …

OpenCV基础知识(5)— 几何变换

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。OpenCV中的几何变换是指改变图像的几何结构&#xff0c;例如大小、角度和形状等&#xff0c;让图像呈现出缩放、翻转、旋转和透视效果。这些几何变换操作都涉及复杂、精密的计算。OpenCV将这些计算过程都封装成了非常灵活的…

8. 实现业务功能--用户注册

目录 1. 顺序图 2. 参数要求 3. 接口规范 4. 创建扩展 Mapper.xml 5. 修改 DAO 6. 创建 Service 接口 7. 实现接口 8. 测试接口 9. 实现 Controller 9.1 密码加密处理 10. 实现前端界面 业务实现过程中主要的包和目录及主要功能&#xff1a; model 包&#xff1a;实体对象 d…

一文带你了解G1收集器:全功能的垃圾收集器

&#xff08;笔记参考书籍&#xff1a;《JVM高级特性与最佳实践》&#xff09; 一、介绍 Garbage First&#xff08;简称G1&#xff09;收集器是垃圾收集器技术发展历史上的里程碑式的成果&#xff0c;它开创了收集器面向局部收集的设计思路和基于Region的内存布局形式。 G1…

【Lua】(一)VSCode 搭建 Lua 开发环境

前言 最近在找工作&#xff0c;基本所有的岗位都会问到 Lua&#xff08;甚至拼 UI 的都要求会 Lua&#xff09;&#xff0c;咱能怎么办呢&#xff0c;咱也只能学啊…… 工欲善其事&#xff0c;必先利其器。第一步&#xff0c;先来把环境配置好吧&#xff01; 当前适用版本&a…

【玩转Linux操作】crond的基本操作

&#x1f38a;专栏【玩转Linux操作】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【Counting Stars 】 欢迎并且感谢大家指出小吉的问题&#x1f970; 文章目录 &#x1f354;概述&#x1f354;命令⭐常用选项 &#x1f354;练…

如何解决由于找不到msvcp120.dll无法继续执行代码的问题

在使用电脑的过程中&#xff0c;突然遭遇到了一个让我犯愁的问题——缺少了msvcp120.dll文件。这个文件是系统中的一个重要组件&#xff0c;它的丢失导致了一些应用程序无法正常运行。面对这个困扰&#xff0c;我决定展开一场寻找和修复的心旅程。起初&#xff0c;我并不知道ms…

ONLYOFFICE协作空间服务器如何一键安装自托管私有化部署

ONLYOFFICE协作空间服务器如何一键安装自托管私有化部署 如何在 Ubuntu 上部署 ONLYOFFICE 协作空间社区版&#xff1f;https://blog.csdn.net/m0_68274698/article/details/132069372?ops_request_misc&request_id&biz_id102&utm_termonlyoffice%20%E5%8D%8F%E4…

leetcode:1668. 最大重复子字符串(python3解法)

难度&#xff1a;简单 给你一个字符串 sequence &#xff0c;如果字符串 word 连续重复 k 次形成的字符串是 sequence 的一个子字符串&#xff0c;那么单词 word 的 重复值为 k 。单词 word 的 最大重复值 是单词 word 在 sequence 中最大的重复值。如果 word 不是 sequence 的…

GIF文件解析

Java & Swing实现对GIF图像的解析和显示。 有三部分内容&#xff1a; 1 是gif文件解析&#xff1b; 2 是 图像数据解码&#xff1b; 3 是GUI端显示&#xff1b;仅贴出第2部分图像数据解码&#xff0c; 解码也有三部分&#xff0c;1 是基于位的code获取&#xff1b; 2是字典…

CVE-2015-5254漏洞复现

1.漏洞介绍。 Apache ActiveMQ 是美国阿帕奇&#xff08;Apache&#xff09;软件基金会所研发的一套开源的消息中间件&#xff0c;它支持 Java 消息服务&#xff0c;集群&#xff0c;Spring Framework 等。Apache ActiveMQ 5.13.0之前 5.x 版本中存在安全漏洞&#xff0c;该漏…

SpringBoot 学习(03): 弱语言的注解和SpringBoot注解的异同

弱语言代表&#xff1a;Hyperf&#xff0c;一个基于 PHP Swoole 扩展的常驻内存框架 注解概念的举例说明&#xff1b; 说白了就是&#xff0c;你当领导&#xff0c;破烂事让秘书帮你去安排&#xff0c;你只需要批注一下&#xff0c;例如下周要举办一场活动&#xff0c;秘书将方…

步步向前,曙光已现:百度的大模型之路

大模型&#xff0c;是今年全球科技界最火热&#xff0c;最耀眼的关键词。在几个月的狂飙突进中&#xff0c;全球主要科技公司纷纷加入了大模型领域。中国AI产业更是开启了被戏称为“百模大战”的盛况。 但喧嚣与热闹之后&#xff0c;新的问题也随之而来&#xff1a;大模型的力量…

[虚幻引擎] UE使用虚拟纹理在模型上显示挖空效果

此教程是记录如在UE中使用虚拟纹理&#xff0c;实现模型挖洞的效果。 1. 新建项目&#xff0c;开启项目支持虚拟纹理并并重启。 2. 新建一个基础关卡 3. 拖动“运行时虚拟纹理体积” 进入场景&#xff0c;并把体积修改变大&#xff0c;以可以完全包括到地板。 4. 创建一个虚拟纹…

08-微信小程序视图层

08-微信小程序视图层 文章目录 视图层 ViewWXML数据绑定列表渲染条件渲染模板引用importimport 的作用域include WXSS尺寸单位样式导入内联样式选择器全局样式与局部样式 WXS注意事项页面渲染数据处理 视图层 View 框架的视图层由 WXML 与 WXSS 编写&#xff0c;由组件来进行…

使用Scikit-Learn实现多标签分类,助力机器学习

大家好&#xff0c;在机器学习任务中&#xff0c;分类是一种监督学习方法&#xff0c;用于根据输入数据预测标签。例如&#xff0c;我们想要根据历史特征预测某人是否对销售优惠感兴趣&#xff0c;通过使用可用的训练数据训练机器学习模型&#xff0c;可以对输入数据执行分类任…