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

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.mzph.cn/news/44272.shtml

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

相关文章

攻防世界-fileclude

原题 解题思路 直接展示源码了&#xff0c;flag.php应该存放了flag&#xff0c;在file1与file2都不为空且file2是“hello ctf”时file1将被导入。接下来做法很明显&#xff0c;让file为flag.php&#xff0c;file2为“hello ctf”。“?file1php://filter/readconvert.base64-en…

Open3D 最小二乘拟合空间直线(方法一)

目录 一、算法原理1、空间直线2、最小二乘法拟合二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、算法原理 1、空间直线 x −

基于web的停车场收费管理系统/基于springboot的停车场管理系统

摘 要 随着汽车工业的迅猛发展&#xff0c;我国汽车拥有量急剧增加。停车场作为交通设施的组成部分,随着交通运输的繁忙和不断发展&#xff0c;人们对其管理的要求也不断提高&#xff0c;都希望管理能够达到方便、快捷以及安全的效果。停车场的规模各不相同,对其进行管理的模…

ElasticSearch 数据聚合、自动补全(自定义分词器)、数据同步

文章目录 数据聚合一、聚合的种类二、DSL实现聚合1、Bucket&#xff08;桶&#xff09;聚合2、Metrics&#xff08;度量&#xff09;聚合 三、RestAPI实现聚合 自动补全一、拼音分词器二、自定义分词器三、自动补全查询四、实现搜索款自动补全&#xff08;例酒店信息&#xff0…

【rust/egui】(三)看看template的app.rs:序列化、持久化存储

说在前面 rust新手&#xff0c;egui没啥找到啥教程&#xff0c;这里自己记录下学习过程环境&#xff1a;windows11 22H2rust版本&#xff1a;rustc 1.71.1egui版本&#xff1a;0.22.0eframe版本&#xff1a;0.22.0上一篇&#xff1a;这里 serde app.rs中首先定义了我们的Templ…

Git判断本地是否最新

场景需求 需要判断是否有新内容更新,确定有更新之后执行pull操作&#xff0c;然后pull成功之后再将新内容进行复制到其他地方 pgit log -1 --prettyformat:"%H" HEAD -- . "origin/HEAD" rgit rev-parse origin/HEAD if [[ $p $r ]];thenecho "Is La…

域名解析和代理

购买域名 这里使用腾讯云进行购买。 对域名进行解析 通过添加记录接口对域名进行解析。 此时我们的服务器地址就被解析到域名上了。 我们可以通过以下格式进行访问&#xff1a; [域名]:[对应的项目端口] 效果为下: 通过nginx进行代理 如果我们使用上述的方式进行访问还是…

【hive】hive分桶表的学习

hive分桶表的学习 前言&#xff1a; 每一个表或者分区&#xff0c;hive都可以进一步组织成桶&#xff0c;桶是更细粒度的数据划分&#xff0c;他本质不会改变表或分区的目录组织方式&#xff0c;他会改变数据在文件中的分布方式。 分桶规则&#xff1a; 对分桶字段值进行哈…

react之react-redux的介绍、基本使用、获取状态、分发动作、数据流、reducer的分离与合并等

react之react-redux的介绍、基本使用、获取状态、分发动作、数据流、reducer的分离与合并等 一、react-redux介绍二、React-Redux-基本使用三、获取状态useSelector四、分发动作useDispatch五、 Redux 数据流六、代码结构七、ActionType的使用八、Reducer的分离与合并九、购物挣…

计算机视觉的应用11-基于pytorch框架的卷积神经网络与注意力机制对街道房屋号码的识别应用

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下计算机视觉的应用11-基于pytorch框架的卷积神经网络与注意力机制对街道房屋号码的识别应用&#xff0c;本文我们借助PyTorch&#xff0c;快速构建和训练卷积神经网络&#xff08;CNN&#xff09;等模型&#xff0c;…

【Redis从头学-5】Redis中的List数据类型实战场景之天猫热销榜单

&#x1f9d1;‍&#x1f4bb;作者名称&#xff1a;DaenCode &#x1f3a4;作者简介&#xff1a;啥技术都喜欢捣鼓捣鼓&#xff0c;喜欢分享技术、经验、生活。 &#x1f60e;人生感悟&#xff1a;尝尽人生百味&#xff0c;方知世间冷暖。 &#x1f4d6;所属专栏&#xff1a;Re…

git错误记录

露id没有影响&#xff0c;搞得微软不知道我ip一样 git fatal: 拒绝合并无关的历史的错误解决(亲测有效)

mybatis缓存

目的&#xff1a;提高查询效率。 映射语句文件中的所有 select 语句的结果将会被缓存。映射语句文件中的所有 insert、update 和 delete 语句会刷新缓存。缓存会使用最近最少使用算法&#xff08;LRU, Least Recently Used&#xff09;算法来清除不需要的缓存。缓存不会定时进行…

Matplotlib绘图知识小结--Python数据分析学习

一、Pyplot子库绘制2D图表 1、Matplotlib Pyplot Pyplot 是 Matplotlib 的子库&#xff0c;提供了和 MATLAB 类似的绘图 API。 Pyplot 是常用的绘图模块&#xff0c;能很方便让用户绘制 2D 图表。 Pyplot 包含一系列绘图函数的相关函数&#xff0c;每个函数会对当前的图像进行…

爬虫框架- feapder + 爬虫管理系统 - feaplat 的学习简记

文章目录 feapder 的使用feaplat 爬虫管理系统部署 feapder 的使用 feapder是一款上手简单&#xff0c;功能强大的Python爬虫框架 feapder 官方文档 文档写的很详细&#xff0c;可以直接上手。 基本命令&#xff1a; 创建爬虫项目 feapder create -p first-project创建爬虫 …

根据源码,模拟实现 RabbitMQ - 实现消息持久化,统一硬盘操作(3)

目录 一、实现消息持久化 1.1、消息的存储设定 1.1.1、存储方式 1.1.2、存储格式约定 1.1.3、queue_data.txt 文件内容 1.1.4、queue_stat.txt 文件内容 1.2、实现 MessageFileManager 类 1.2.1、设计目录结构和文件格式 1.2.2、实现消息的写入 1.2.3、实现消息的删除…

如何将常用的jdbc方法封装起来???

你是否还在为每次新建项目连接数据库而烦恼&#xff1f;&#xff1f;&#xff1f;&#xff08;教你一次代码&#xff0c;简单完成每次连接&#xff09; 1.建立maven项目 还没下载安装或者不会建立maven项目的可以看这里哦&#xff1a;maven的下载安装与配置环境变量&#xff0…

javascript期末作业【三维房屋设计】 【源码+文档下载】

1、引入three.js库 官网下载three.js 库 放置目录并引用 引入js文件: 设置场景&#xff08;scene&#xff09; &#xff08;1&#xff09;创建场景对象 &#xff08;2&#xff09;设置透明相机 1,透明相机的优点 透明相机机制更符合于人的视角,在场景预览和游戏场景多有使用…

VALN-hybrid模式

实验拓扑及要求 一、实验思路 1.R1-R3按要求配置&#xff0c;R2不划分vlan使其全部都可以访问 2.交换机和路由器的交换机直连接口设为hybrid模式且R4-R6不带vlan标签访问路由器 3.交换机和交换机的两个直连接口设为hybrid模式且只允许R4-R6所在vlan标签通过 4.R4-R6只允许其…

怎么对视频进行压缩?

怎么对视频进行压缩&#xff1f;视频压缩&#xff0c;我们都知道是将视频文件进行压缩变小的过程&#xff0c;是我们日常办公中较为常用的手段。现如今&#xff0c;在视频技术不断发展与创新的基础上&#xff0c;视频分辨率也在不断提高&#xff0c;进而导致文件占有量也非常大…