Quarkus后端开发优势:安全和JSON支持


GRAN Software Solutions 是一家设计和构建现代后端解决方案的德国公司。我们与大型汽车客户和其他客户合作,重组并创建新的解决方案。我们还开发并提供 SaaS 工具来帮助我们和其他人的日常工作。

时间追踪挑战
我们需要创建一个时间跟踪应用程序,因为市场上现有的解决方案不能满足我们的特定要求。它们要么不是为开发人员设计的,要么缺乏我们所需的简单性,要么加载了不必要的功能。我们希望利用多年来在客户项目中获得的丰富经验,构建一个完全适合我们需求的工具。我们还希望创造一种更现代、更人性化的设计,使用和融合 Quarkus 等新技术会很有趣。

我们现有的时间跟踪解决方案面临的主要问题是缺乏在客户端之间切换的简单方法。我们还发现它们不支持我们习惯的快速操作或快捷方式,并且没有直观的方式来查看我们白天输入的时间。此外,我们希望根据与客户签订的合同的每日费率和合同上限来跟踪时间。这就是为什么我们决定创建一个定制解决方案来满足所有这些特定需求。

解决方案
当我们选择后端使用的技术堆栈时,我们的主要目标是使用我们已经熟悉的技术,例如 Kotlin 编程语言、Spring Boot 框架和 Postgres 数据库。我们还希望选择一个能够为我们提供数据库连接、Web 客户端、缓存和其他类似功能的库的生态系统。此外,我们希望使用高性能解决方案来降低托管成本并避免高内存要求。

在分析了市场上的各种解决方案后,我们决定使用 Quarkus 框架,因为它满足了我们的所有要求。

亮点:安全支持
为了以现代且安全的方式保护我们的后端 API:

  • 我们选择使用 JSON Web 令牌,Quarkus 对它们提供了出色的支持。
  • 我们还为 API 使用基于角色的安全性,Quarkus 使我们可以轻松实现这一点。
  • 我们在应用程序中拥有不同的角色,例如普通用户和管理员,并且此信息编码在我们的 JSON Web 令牌中。
  • Quarkus 确保这些token在到达我们的后端系统时不会被篡改或操纵。

@RolesAllowed用于授权我们的 API 端点

@Path("/clients")
@RolesAllowed(
"User")
@Produces(MediaType.APPLICATION_JSON)
@ApplicationScoped
class ClientResource(
    private val getClientsHandler: GetClientsHandler,
    private val newClientHandler: NewClientHandler,


亮点:JSON支持
我们严重依赖丰富的 JSON 支持来灵活地建模数据,并将大部分功能委托给 Postgres 本身来操作数据。这样,我们可以将已构建的 JSON 对象传递回 API 客户端,这显着减少了在应用程序代码中做出设计决策所需的时间。

Quarkus 为 JSON 对象 API 提供了出色的支持。我们认为,由于性能和代码维护方面的原因,Postgres 是执行数据操作和聚合的正确位置,而不是应用程序代码。

用于JsonObject传入和传出我们的数据

@GET
@Produces(MediaType.APPLICATION_JSON)
suspend fun getProfile() = db.preparedQuery(
    """select profile from "user" where email = $1""".trimIndent()
).execute().awaitSuspending().first().getJsonObject(
"profile")

经验分享
到目前为止,Quarkus 的开发过程非常出色。与 Spring Boot 等其他框架相比:

  • Quarkus 具有更快的启动时间和更小的内存占用。
  • 它还提供配置文件,使我们能够在环境之间进行稍微不同的配置或行为。
  • 我们可以轻松地用本地模拟替换一些难以运行的第三方服务,而保持应用程序代码不变。
  • Quarkus 在配置方面也很出色,并且我们可以轻松地使用application.yaml外部环境变量覆盖文件中存储的值。
  • 虽然热重载模式在 Kotlin 上运行得不太好,但我相信所有与之相关的 bug 都会在即将发布的版本中得到解决。
  • 在开发过程中,我们大多数时候都必须重新启动正在运行的服务才能使代码更改生效。

我们的后端 API 功能大约花了一个半月的时间才完成。考虑到只有两名开发人员在后端工作,我认为这是一个很好的结果。在产品生命周期的这个阶段,由于不断重新审视需求和我们的需求,我们决定不编写自动化测试。相反,我们现在进行手动测试。

一旦我们的时间跟踪应用程序获得更多活跃用户,我们计划开始使用 Quarkus 测试支持(包括测试容器等)编写自动化测试。开发成熟的 API,包括使用 JSON Web 令牌和授权实现 API 安全性,在应用程序启动时自动应用数据库迁移,拥有围绕 JSON 的灵活且可维护的代码库,能够将我们的 API 打包和部署到我们的 Kubernetes 集群仅用了一个半月的时间就取得了相当大的成就。