本文主要描述微服务应用程序面临的主要技术挑战,并列出了一些用于解决这些问题的框架、库和实践。
几乎所有微服务都应该解决的最常见的任务是什么?
这些是最常见的任务。当然,该列表可能因项目而异。
- 复杂的业务逻辑,
- HTTP请求路由,
- 测试,
- 数据库集成,
- 同步和异步消息传输,
- 其他。
主要分享低代码、微服务、容器化、SAAS、系统架构方面的的内容,希望大家点赞,评论,关注。
使复杂逻辑可读和可扩展
有很多概念和模式,如SOLID、KISS、DRY等。但在本文中,我想讨论一个不同的概念和模式。
用 Java 开发 Web 应用程序的行业标准是 Spring。这并不意味着您不能满足条件Javalin或Ktor或其他什么,所以让我们考虑一下 Spring 非常喜欢并以某种方式在任何其他框架中实现的主要内容。这种方法是依赖注入 (DI)模式。
简而言之,DI是关于你编写了一个单独的代码块的事实——一个类,并在需要这个块的逻辑而不是编写新代码的地方使用它。
如果我们更深入,DI是对象从外部获取其他所需对象的概念。
DI可以用任何编程语言实现。依赖注入背后的一般概念称为控制反转。
在Java中,类依赖是一个类依赖于另一个类的地方,因为它使用了另一个类的实例。例如,访问服务的类将依赖于服务类。
因此,在您发现自己的任何项目中,都会有一个特定的上下文来存储这些代码块,并且该上下文的存在不依赖于为开发选择的框架。让我告诉你一个秘密:即使欧洲最先进的银行之一放弃了 Spring 并用纯 Java 开发 Web 服务,它们仍然有一个放置所有“服务”的上下文。
HTTP 请求和响应的路由
该层包含的任务是将每个 HTTP 请求定向到将处理它的方法。这还包括作为输入传递的数据模型的描述,以及请求的序列化和响应的反序列化。
目前,最流行的构建 Web 服务的框架是 Spring,即Spring Boot,它立即具有内置的 tomcat 或Netty servlet 容器,具体取决于选择哪个配置集。
因此,为了描述应用程序的端点,在 10 种情况下,您几乎总是有 9 种必须使用@GetMapping和@PostMapping注释。在这 10 个选项中,一个内部编写的库将负责路由,并将做与 Spring Boot 相同的事情,只是“以自己的方式”。
处理 HTTP 请求的控制器层示例。
由于Spring Boot几乎无处不在,因此序列化和反序列化 HTTP 请求和响应的事实上的行业标准是Jackson库。它也包含在Spring Boot依赖项中,并在内部积极使用。
要使用它,您需要创建一个ObjectMapper实例并在必要时对其进行配置。请记住,Spring 上下文已经按照 Spring 需要的方式配置了一个初始化实例,因此请谨慎使用。
此外,有时他们使用来自 Google 的库 - GSON,它与 Jackson 没有根本区别。
数据库集成
如果不使用数据存储,任何 Web 应用程序都是不完整的。任何东西都可以是这样的存储——文本文件、redis缓存。但最常见的当然是使用数据库,而且现在的行业标准是:
- PostgreSQL(高性能,免费)。
- Oracle(高性能,API 不太方便,有供应商分发模型)。
- MongoDB(由于其非关系性质,非常方便启动开发,在云解决方案中极为常见)。
要访问数据库,您需要能够打开连接、监控打开的流、执行 SQL 查询、转换等等。
目前,ORM方法——对象-关系映射——被广泛使用。要涵盖存储数据库信息的所有任务,您需要解决 4 种类型的操作(与 CRUD相同)——创建、读取、更新、删除。
这种方法最流行的实现是Hibernate框架。它能够根据代码和实体生成 SQL 查询,但并不总是以最佳方式进行。
我们也没有忘记Spring Boot是行业标准,还有一个用于处理数据库的ORM实现——Spring Data JPA。它是Hibernate的一个包装器,可以在更高的抽象级别上使用。它配置方便,甚至允许您编写完全没有 SQL 的查询。但如果需要编写原始 SQL 并执行它,也可以这样做。
最后,提供最佳性能但实际上并没有实现ORM思想的最强大工具 - jdbcTemplate。其本质在于执行原始 SQL 查询。但是如果你在其上编写自己的转换逻辑,并使用它按照ORM逻辑将实体存储在数据库中,你将获得一个非常快速且可定制的工具。
同步和异步消息传输
作为消息的传输方式,使用了同步方法,例如 HTTP GET/POST请求。他们使用包含在Spring Boot依赖项列表中的RestTemplate或较新的WebClient。
消息代理用于异步通信,其中最流行的是rabbitmq和kafka。在本文中,我不会深入探讨它们之间的区别。我将详细介绍从代码中与它们集成的方法——Spring Boot模块用于此,或者如果我们谈论的是一家大公司,则可以使用自己编写的“自行车”。Spring Boot项目最流行的扩展是spring-kafka和spring-boot-starter-amqp。
测试
测试是任何自尊发展的一个组成部分。在我们的现实中,如果在TDD(测试驱动开发)范式中没有立即进行开发,那么在团队内部设置了一个代码阈值,必须由测试覆盖。
以下是最受欢迎的测试类型:
- 单元测试——一个单独的类,甚至它的方法,被用于测试。
- 集成测试——系统的一个单独部分与其他元素的集成一起进行测试。例如,服务中流程的集成测试及其与数据库的工作。
测试中需要第三方库来解决直接测试的问题,以及模拟(模拟某些服务或集成的响应)的问题。
对于测试,最常使用junit 5、TestNG、kotest (kotlin) 。对于 mocking,Java 开发标准是mockito,对于kotlin是mockk。为了测试Spring Boot应用程序,使用了spring-boot-starter-test starter,它已经包含了所有必要的依赖项,并且知道如何为每个测试构建一个Spring Context 。
单元测试图。
使用 MockK 在 Kotest 中进行单元测试的示例。
流程如此复杂和华丽以至于测试一个场景需要调用一项服务的多个端点的情况极为罕见。在这种情况下,您需要做好准备,您将遇到自己编写的“自行车”,例如处理调用端点和测试被测主应用程序的单独Spring Boot应用程序。
其他
此外,还有许多不同的做法可以帮助改进开发服务的整个过程。
静态代码分析
静态代码分析的本质是检查代码是否符合条件——没有重复代码、测试覆盖率、符合代码风格等。
通常,使用诸如“ Linters ”之类的东西来检查样式代码是否匹配。从本质上讲,这些是gradle和maven的相同插件。通常,它们会在配置的管道期间自动启动。有时您需要准备好调用一个命令,该命令将根据 linter 中配置的规则格式化您的代码。
对于 Java,最流行的 linter 是Checkstyle和SonarLint。对于 Kotlin - ktlint。
对于静态分析,带有提示和其他有用的东西,绝大多数项目使用定制的sonarqube。对于小型项目 - codacy或codeclimate。我建议将它们用于宠物项目。
但是,并非所有项目都具有保持代码清洁的内置流程。发生这种情况的原因有很多——快速变化的项目,以及团队构建流程的时间不足。
СI/CD 实践
CI/CD——持续集成和持续部署是无法想象现代开发的过程。您可以手动打包jar文件并手动将它们部署到服务器,但这增加了人为因素导致错误的可能性。因此,基本的基础设施操作不会引起大麻烦,通常使用用于组装和部署的脚本。
通常,普通开发人员很少这样做。通常,它位于工程师的DevOps领域。通常,脚本在Jenkins环境或Gitlab CI中执行。
脚本本身是一组必须执行以实现特定目标的操作。最困难的事情可能是理解应用程序内部的代码和部署是如何关联的。构建系统用于此目的。目前,后端有两个最流行的——Maven 和Gradle。10 次中有 9 次是 Maven,它非常粗糙但功能强大,并且有很多插件。Gradle也偶尔会被发现,这又是较新的,但不太普遍。就功能而言,在大多数情况下,它丝毫不逊色于 maven。
结论
在本文中,我们讨论了后端开发人员目前必须处理的主要技术问题。以及解决每个技术领域问题的主要方法。欢迎条友分享你在项目中使用什么工具来解决你的问题。
主要分享低代码、微服务、容器化、SAAS、系统架构方面的的内容,希望大家点赞,评论,关注。
标签:框架,Spring,代码,Boot,技术,应用程序,库及,测试,使用 From: https://blog.51cto.com/sharepointchina/5916686