大家好,我是安图新。今年很多技术人员估计也不是太好过了,毕竟裁员潮的到来,甚至各大厂也无法避免,这间接导致了供过于求,僧多肉少的情况下,应聘各大技术岗位的竞争尤为激烈。
八股文都已经是最低标配了,所以说庆幸经过多轮裁员潮还有饭碗的小伙伴,就要好好珍惜不要任性了,苟着也是一种幸福。
既然现在技术那么卷,那在未来的 2024 年,作为广大 Java 出身或者既然投入到 Java 怀抱的程序员,我们是否值得继续学习 Spring Boot 呢?说到 Spring Boot,熟悉的小伙伴应该都有一个共同的担忧 —— Spring Boot 在开发速度方面很慢 。
因此,我决定拿它来与 Nodejs、Django 等主流语言框架进行对比测试,不是写个简单的待办事项列表或 hello-world 应用程序,而是用我以前写过的一些应用程序的复杂部分。坦白说,测试的结果让我得出了不同的结论。我强烈反对 Spring 在开发速度方面更慢的观点。事实上,恰恰相反。
接下来,我将列出学习 Spring Boot 的价值所在,以及它与其他后端技术和替代 Java 语言框架的比较,希望可以给你一个更加清晰的理解和对比。
- Spring Boot 热度仍然很高
我有幸认识一些长期在国内大厂做技术骨干,以 Java 为主要开发语言的朋友并聊过,他们多年来一直深入研究 Java 语言和 Spring,他们都承认 Spring Boot 的发布无疑是一种解脱。
配置 Spring 应用程序的各个方面的负担是压倒性的,特别是对于新手来说,Spring Boot 的到来反而标志着一个转折点。它让 Java 的开发难度和效率带来了前所未有的简单,让开发人员可以摆脱大量样板代码的负担, 专注于真正重要的事情: 编写健壮的业务逻辑 。
但还不止这些,真正使 SpringBoot 与众不同的是它的迭代进化能力。它不仅仅是过去的技术。相反,它不断适应现代软件发展不断变化的需求。
Spring Boot 的自古至今以不断创新、充满活力的社区以及一直保持在技术潮流前沿为特征,这证明了它的可靠性。
Spring Boot 现在提供了企业级的特性,并与微服务和云本地化趋势很好地集成,提供了一个完全适合在以云为中心的世界中构建可伸缩的分布式应用程序的平台。根据最近的JetBrains 开发者生态系统调查,Spring Boot 和 Spring MVC 仍然是最常用的 Java 语言开发框架。
- 语言生态和广泛依赖库相结合
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-graphql</artifactId>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.amqp</groupId>
<artifactId>spring-rabbit-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.graphql</groupId>
<artifactId>spring-graphql-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
我一直记得“左耳朵耗子”皓哥说过的一句话,如果你决定想好好学习编程成为技术专家的话,Java 语言你一定要学习,因为它是一门 工业化语言 ,这是目前所有其他编程语言暂时还不能完全做到的。
那什么是工业化语言?
作为当今的一个开发者,你会发现自己在很多工具和库之间游刃有余地构建应用程序。这些工具包括编程语言、框架、库、数据库、 Hibernate 和 JPA 这样的数据库连接器,以及 Apache Kafka 和 RabbitMQ 这样的消息系统。一个有完整生态和成熟脚手架工具的语言,才叫做工业化语言,Java 无疑是。
假设你正在构建一个 Web 应用程序。你可以使用 Python 这样的编程语言、后端 web 框架、前端框架和 PostgreSQL 这样的数据库。你可能还需要利用各种第三方 API 来实现支付处理、用户身份验证,有时还需要地理定位服务等功能。作为一名开发者,你的工作就是让所有这些组件无缝地协同工作。
像 Spring Boot 这样的现代框架让你的开发者工作变得更加容易。与其在每次开发新产品的时候都试图整合这些工具,不如通过简化将这些技术整合到项目中的过程,让你的开发者生活变得更加轻松。
这减少了你自己整合它们的时间,使你成为一个更有效率的开发者。
如果你在过去几年中一直关注技术领域的发展,那么你实际上可以证明 Spring Boot 在跟上新出现的库和工具方面做得很好。无论你是使用 GraphQL 开发强大的查询语言,还是使用 Spring WebFlux 的反应式编程,或者使用云计算本地技术,比如 Docker 和 Kubernetes,Spring Boot 都可以实现无缝集成,这使得它成为现代开发的绝佳选择。
- Spring 无处不在
当回顾我的开发者旅程时,我不禁感激 Spring Boot 是如何成为我职业生涯中不可或缺的一部分的。
让我印象深刻的是我个人和公司发展经历之间的无缝过渡。这意味着我在使用 SpringBoot 的个人项目中练习的经验可以直接转移到我在公司的工作中,这意味着你可以在任何地方使用 SpringBoot。虽然目前环境下,很多公司都在裁员,就业市场很卷,但是 SpringBoot 作为一个主流的框架,它的使用率还是非常高的,迟早值得你去学习。
因此,无论你是想在工作场所构建一个简单的个人项目还是一个大型企业应用程序,Spring Boot 都是应对这种情况的首选框架。
在企业,SpringBoot 的采用是非常常见的。它不仅仅是一个框架的选择,它已经成为许多企业级应用程序的标准和主干,你看知道现在,很多大厂,尤其是业务复杂度高的,无疑都会优先选择 Java 作为主流语言区开发应用。
它的可靠性、社区支持和成熟的集成生态系统也使它成为构建可伸缩、可维护和企业级应用程序的首选解决方案。
- Spring Boot 的可测试性
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class ProductServiceTest {
@Autowired
private ProductService productService;
@Test
public void testProductCreation() {
Product product = new Product("Sample Product", 10.0);
// Act
Product savedProduct = productService.createProduct(product);
// Assert
assertNotEquals(0, savedProduct.getId());
assertEquals("Sample Product", savedProduct.getName());
assertEquals(10.0, savedProduct.getPrice(), 0.01);
}
}
测试是每个开发者都必须写和做的一个开发流程,对吧(虽然国内很多公司为了赶进度,都有跳过写单元测试和阶段测试的情况,但我告诉你,这些都是技术债,你迟早要还的)?应该是的,但让我带你回到那个烦人苦恼低效而不是解脱的时期看看。
在我作为开发者的早期,写测试是一项令人畏惧的实践,尤其是当我还在试图掌握编程的基本概念时。设置测试用例就像解决一个谜语,捕捉异常总是一个自我持续的斗争。这个过程是如此的繁琐,以至于我在编写全面的测试用例时总是感到沮丧,并且经常会找到逃避它们的方法(以前根本想懒得写哈哈...)。
几年后,当我开始使用 Spring Boot 框架编写单元测试时,集成测试不再是一个令人头疼的问题,而是一个令人满意的例行程序。我也鼓励你选择一个好的框架来帮助你提高编写测试用例。
SpringBoot 其实是一个开发具有健壮测试特性的应用程序的极佳选择,原因如下:
- Spring Boot 与流行的测试框架(如 jUnit、 Mockito 和 Spring Test)无缝集成 。
- Spring Boot 提供了广泛的测试注释,包括
@SpringBootTest
、@DataJpaTest
和@WebMvcTest
,它们帮助为特定类型的测试配置应用程序上下文,从而简化流程。 - Spring Boot 天生具有 Spring 框架庞大生态系统作为基础,比如用于安全测试的
Spring Security
和用于数据库相关测试的Spring Data
。 - Spring Boot 天生支持
Mock
框架,比如Mockito
,这样你就可以使用工具来生成测试数据,从而构建更加健壮的应用。 - Spring Boot 与
TestContainer
集成良好,可以快速跟踪集成测试。
说多一句,如果你正在构建一个分布式应用的话,测试就更没有商量余地了。
- 监测和可观察性
我是在大学才开始学习编程语言的,那时的生态只是让我们开发一些基本的单体应用程序(那时前后端分离的概念还不火),这种架构还是相对简单的,复杂性不会太高,毕竟所有的事都在一个项目内调用就可以完成。这些单页应用程序通常有一个简单的前端、小量的数据处理和请求的服务器。使用这种类型的应用程序,比较容易去 debug 问题并在运行过程中进行调整修复。
然而,随着时间的推移,我的项目在范围和复杂性上都有所增长,现在我发现自己要处理更复杂的应用程序。 这些应用程序大多以多个微服务、数据库、外部集成和复杂的业务逻辑为特色 。
在这段时间里,随着我工作的系统复杂性的增加,我还需要了解如何评估度量、日志和分布式跟踪。
Spring Boot,特别是 Spring Boot 3,提供了内置的可观察性功能,使你更容易监视、诊断和了解生产环境中应用程序的内部状态。以下是一些 Spring Boot 的特性,你可以通过这些特性来观察和监控你的应用:
- Actuator
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
Actuator 是 Spring Boot 一套内置的系统内省和监控工具,可以查看应用配置的详细信息,例如自动化配置信息、创建的 Spring beans 以及一些环境属性等。以下是一些具体介绍:
/actuator/health
,提供有关应用程序健康状况的信息/actuator/metrics
,提供了应用程序各个方面的详细度量,比如内存使用量、垃圾回收。/actuator/info
,允许我们公开自定义应用程序信息。/actiator/env
,提供对应用程序环境属性的访问,这对于解决配置问题非常有用。- 你还可以生成自定义 Actuator 端点,以帮助公开特定的数据或触发器操作。
- 监控指标 - Micrometer 集成
我已经看到了微服务和云本地架构的兴起是如何使得监视这些分布式系统变得绝对必要,这就是 Micrometer 发挥作用的地方,它将自己作为应用程序指标的首选“ SLF4J ”。
Micrometer 就像一个全方位的应用指标,支持广泛的监控系统集成 。对于开发人员来说,它就像一个多用途工具,使我们能够从应用程序中收集有价值的见解,而无需被锁定在特定的监视解决方案中。
这一切都是为了让我们有灵活性为工作选择正确的工具,并确保我们不会局限于一个单一的监控系统作为解决方案。例如,你可以直接集成使用 Prometheus、 Datadog、InfluxDB 等工具。
Micrometer 还有丰富的监控集合,如量规、计数器、计时器和分布式信息摘要等。
- 日志
2023-03-05 10:57:51.112 INFO 45469 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet Engine: Apache Tomcat/7.0.52
2023-03-05 10:57:51.253 INFO 45469 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2023-03-05 10:57:51.253 INFO 45469 --- [ost-startStop-1] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 1358 ms
2023-03-05 10:57:51.698 INFO 45469 --- [ost-startStop-1] o.s.b.c.e.ServletRegistrationBean : Mapping servlet: 'dispatcherServlet' to [/]
2023-03-05 10:57:51.702 INFO 45469 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
随着时间的推移,日志的重要性已经从一个简单的调试工具发展成为一种可以构建可靠、可维护和高效的应用监控和审计工具。
开箱即用,Spring Boot 为 Java 语言提供 Util Logging、 Log4j2 和 Logback 作为默认配置。在每个场景中,日志记录器都被预先配置为在控制台,即标准输出上显示日志消息,而且如果需要的话,你还可以直接将日志定向到一个文件。
如果你正在使用"Starters",那么 SpringBoot 默认情况下会为你的日志配置设置 Logback。不仅如此,它还能处理 Logback 路由,确保即使你有使用不同日志框架的依赖库,比如 Java 语言的 Util Logging、Commons Logging、 Log4J 或 SLf4J,一切都能协调集成进来。
你可以自由选择你喜欢的日志框架,但是 Spring Boot 默认的 Logback 设置简化了你初始化的上手使用,使得你可以很容易的开始而不用担心其他库的兼容性问题。
'dispatcherServlet' to [/]
2023-03-05 10:57:51.702 INFO 45469 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
- 分布式跟踪 - OpenTelemetry
假设你是一个相对新手的开发者,负责维护一个大型电子商务平台。有一天,你收到来自客户支持团队的报告,指出一些客户在结帐过程中遇到了问题。用户抱怨订单没有得到处理,他们无法完成客户的商品购买。
如果没有适当的可观察性工具和分布式跟踪,你就不能对请求流进行端对端可视化。你对微服务之间的交互视而不见,并且很难跟踪每个请求是如何处理的,以及错误和瓶颈在哪里。
如今,OpenTelemetry 技术已被认为是服务跟踪的标准,有着广泛的开放源码软件和支持它的商业工具,如 Jaeger、 Zipkin 和一些企业 APMs。幸运的是,Spring 在其许多项目和库中都对 OTEL 提供了广泛的支持。Spring Boot 同时支持 OTEL Instrumentation —— 这是一种非常快速的开发和追踪方式,也支持更高性能的 Micrometer Tracing 库调用。
如果你需要一个更强大灵活的方式来启动并追踪你的 Spring Boot 应用,甚至想把所有重要的数据集成到你的开发过程中,你可以考虑一下使用这个免费的开发者工具,Digma。Digma 是一个持续反馈(CF)工具,旨在简化从 OTEL 代码来源收集和处理可观察性数据的工作。Digma 作为一个 IDE 插件在本地运行,并在你代码的时候收集关于你编码的数据,从跟踪到日志和度量。这意味着你可以随时检测到问题并且实现快速修复。
- 简单易用和发展迅速
在任何项目开始时选择正确的工具都相当于是一个战略决策,会产生深远的影响。它可以影响一切,从开发过程、性能到安全、可扩展性和用户体验等等。
同样,选择正确的框架也会对你的学习曲线和早期经历产生重大影响。如果你刚刚开始你的编程之旅,Spring Boot 是一个很好的选择,因为它的“ 约定优于配置 ”的哲学。
Spring Boot 减少了 Spring 的冗长和复杂的设置。这意味着,作为一个初学者,你可以专注于编码应用程序的核心逻辑,而不会迷失在大量的配置文件中。使用 SpringBoot,你可以创建自包含的、可执行的 JAR 文件,这使得部署非常容易。不需要管理应用服务器或复杂的部署。
Spring Boot 还提供了预先配置的模板或依赖项集合,可以简化应用程序的设置和配置; 这些都被称为 Spring Boot starter。这些启动程序旨在查看你的类路径和已配置的 bean,并对可能缺少的内容做出合理的假设并反馈给你。然后,它们会自动添加必要的组件、库和配置,以使应用程序快速启动并运行。
- 微服务支持
随着微服务开发慢慢成为主流,很明显,管理许多微服务可能是一个真正令人头疼的问题。编排和监控所有这些组件的挑战可能导致复杂性一步步的加重。
这是,Spring Boot 来救场了。你会发现它的特性使得使用微服务远没有那么难和容易维护。Spring Boot 与 Spring 集成的云服务为服务发现、负载平衡和分布式配置提供了工具。这些特性简化了微服务的创建和管理,确保它们能够无缝地协同工作。
在使用 Spring Boot 时,它也有一些其他特色属性包括对集装箱化技术(如 Docker)和编配平台(如 Kubernetes)的支持,以及具有与广泛技术集成的无缝接入,还有安全性。
- 自带 Web 服务器属性
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-core</artifactId>
<version>8.5.23</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-el</artifactId>
<version>8.5.23</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-websocket</artifactId>
<version>8.5.23</version>
<scope>compile</scope>
</dependency>
为了让你更好理解,我来模拟下以前通常需要手动设置和配置 Web 服务器来部署 Web 应用程序的时代,当时的部署和集装箱化技术还不像今天这么普遍。
当你有了一个 web 应用,你通常会把它部署在独立的 web 服务器上,比如 Apache HTTP 服务器或者 Nginx。这些 Web 服务器主要负责处理传入的 HTTP 请求,并将它们转发到运行在不同监听端口的 Web 应用程序上。
配置这些外部独立 Web 服务器需要编写大量的 XML 配置文件。你还必须在这些配置文件中指定 servlet 映射、数据源连接和其他特定于部署的详细信息。
与之相反,现在的 SpringBoot 嵌入式 Web 服务器使得部署更加容易。SpringBoot 包括对嵌入式 Tomcat、 Jetty 和 Undertwow 服务器的支持,这些服务器与应用程序捆绑在一起,允许你将应用程序打包为独立的 JAR 文件。这种方法简化了部署,不需要单独的服务器安装和复杂的服务器配置。
- 开源
SpringBoot 的开源特性让我和许多其他开发人员产生了深刻的共鸣。我喜欢 SpringBoot 的开源特性是因为它为每个人提供了公平的竞争环境。因此,无论你是学生、技术新人还是经验丰富的开发者, 你都有机会获得与其他人相同的代码、相同的文档和相同的贡献机会 。
开源促进了代码的透明度。换句话说,你不是工作在一个完全模糊,不了解的黑盒环境,你可以调查引擎在引擎盖下是如何工作的,甚至可以根据自己的需要进行修改。这也意味着没有任何附加成本。你可以在个人项目、副业或企业级应用程序中免费使用框架,而不用担心成本。
当然,你甚至可以随时通过修复 bug、文档改进,甚至开发新的 Spring Boot 特性来做出自己的贡献。
- 社区和支持
到我接触代码进入编程世界到现在,满打满算也有十年了,这十年,我一直是一个热衷技术的开发者,我已经记不清自己多少次寻求并得到不同社区的支持。这些社区分布在不同的平台上,比如 Baidu、Google、GitHub、CSDN 和 Stack Overflow 等。
作为一个开发者,人们往往很容易忘乎所以,认为待在自己的小房间里,24 小时与世隔绝的编码是一种进步的方式。然而,软件发展的现实却恰恰相反。编程领域本质上是协作性质的,由持续不断的思想交流和团队一起共同解决复杂问题来驱动 。
成为社区的一员是非常有帮助的,特别是当你刚刚开始你的编程之旅的时候。
Spring Boot 已经存在一段时间了,它拥有一个由开发人员、架构师和专家组成的欣欣向荣的生态系统,这些人经常共享想法和资源,并互相帮助解决问题。由于它的开源特性,开发人员还可以分享改进 Spring Boot 框架的想法,你也可以参与其中。
Spring Boot VS Django 或 NodeJS
在我的经历和职业生涯中,我也逐渐体会到不同技术的独特优势和平衡。许多开发人员在将 Spring Boot 与其他 Java 语言生态系统之外的框架进行比较时,似乎有着相似的看法。
Java 语言的生态系统有一个相对较高的初始学习曲线,但是因为它的稳健性和强大完善的依赖库而脱颖而出。Spring Boot 在可靠性和可扩展性等非常重要的场景中表现出色。但是, 与其他框架相比,有一个不太好的缺点就是启动时间稍微长一些 。
另一方面,Python 和 Django 为 web 开发提供了令人愉快的体验,特别是在开发者生产力和快速迭代至关重要的项目中。
在某些情况下,Python 的性能可能不如 Java 语言,但它有一个可读和清晰的代码语法。Django 已经表明,对于内容管理系统、 Web 应用程序以及优先考虑项目启动和快速运行的情况,它是一个很好的选择。
拥有 JavaScript 生态基础的 Node.js 一直是实时应用程序和微服务的首选。它的性能,特别是对于 I/O 受限和实时的场景,是非常出色的。
我使用 Node.js 的经验是,在速度和可扩展性至关重要的情况下,它是一个完美的选择,尤其是在构建聊天平台等实时应用时。此外,为客户和服务器使用同一种语言的能力会让你的编程生活更加轻松,毕竟一个编程语言就可以开发全端平台了,我这里主要指前端、后端和手机端。
结论: Spring Boot 值得学习
Spring Boot 仍然是框架 Java 语言的领导者,而且似乎不会很快改变。
Spring Boot 仍然非常重要。如果或者真的当它被其他框架超越时,你学习到的上述这些概念,其实很有可能也会在其他框架中使用到。此外,随着新的 Spring Boot 发布,我认为至少在未来几年,Spring Boot 可能会继续保持事实上最主流的 Java 语言框架甚至是编程开发框架。
同样重要的是要注意到像 Micronaut 和 Quarkus 这样的框架日益增长的相关性,它们为特定类型的项目提供了独特的优势。探索这些选择并理解何时应用它们也可以进一步提高你作为开发者的能力。
自问自答环节
Q:什么是 Spring Boot? 为什么我要考虑在 2024 年学习它?
A:Spring Boot 是一个流行的开源 Java 语言框架,它使得创建微服务和 web 应用变得更加容易。在 2024 年学习 Spring Boot 仍然是值得的,因为它仍然为现代软件开发项目提供了许多优势和大量的工作机会。
Q:目前有哪一些大厂使用到 Spring Boot?
A:SpringBoot 用于广泛的应用程序,从 Web 开发和微服务到 API 创建和后端系统。Netflix、阿里巴巴、 LinkedIn、 Uber 和 Groupon 等公司都有一直在使用 Spring Boot。
如果大家喜欢我的文章,可以点赞、收藏、关注我的公众号 ,我会不定期的分享一些技术干货,也会分享一些我个人的生活感悟,欢迎大家一起交流学习。
关注公众号: 程序员安仔 ,回复: " 面试题"
注意,不要乱回复
(一定要回复 **" 面试题"
)** 否则啥得不到
安仔唯一官方公众号
点击下方 小卡片 回复: " 面试题"