Orange 如何利用 Quarkus 无缝访问电信网络功能

Orange

简介

作为全球领先的电信公司,Orange 一直处于创新前沿。Orange 与 Deutsche Telekom、Telefónica 和 Vodafone 一起,共同创立了 Camara Project,旨在简化第三方应用程序开发人员对 5G API 的使用。

为了实现这一目标,Orange 需要一个灵活且轻量级的框架,能够处理受限的 API 暴露,同时确保与现有网络核心系统的兼容性。

在对多个框架和工具包(包括 Quarkus、Ktor、Micronaut 和 Vert.x)进行严格评估后,Orange 选择 Quarkus 作为理想的解决方案。

Patrice Conil,Orange 的软件工匠,告诉了我们原因。

为什么选择 Quarkus?框架评估

Orange 团队发现应用程序启动时间是动态 Kubernetes Pod 管理的障碍。因此,他们进行了一项比较研究,以测试 Spring Boot 的替代方案,在一个定义明确的 API 包装器暴露环境中。关键评估标准包括:

  • 学习曲线:Spring 开发人员可以多么容易地过渡?

  • Kotlin 兼容性:该框架是否可以与 Kotlin 无缝协作?

  • 运行时占用空间:它能否在受限环境中高效运行?

  • 部署难易度:它在 Kubernetes 上的部署有多顺畅?

经过广泛的测试,Quarkus 因多种原因脱颖而出:

  • 简单性:学习曲线相对简单,尤其是对于那些熟悉 JAX-RS / Jakarta REST 的人。

  • 开发模式:极快的启动速度、实时重新加载和零配置开发服务(Vault、Redis)带来了极高的开发人员生产力。

  • 模块化:仅嵌入所需的依赖项,保持应用程序精简。

  • 文档:组织良好、版本化的文档,带有可用的示例。

  • 原生编译:能够生成用于 Kubernetes 部署的紧凑型原生二进制文件。

尽管来自活跃的 JVM 生态系统的竞争激烈,但这些优势使 Quarkus 成为 Orange 暴露 5G API 的首选。

采用 Quarkus 的经验教训

迁移和开发经验

从 Spring 过渡到 Quarkus 并不太复杂,尤其是对于那些熟悉 JAX-RS / Jakarta REST 的人。

开发服务 显著提高了开发和测试模式下的生产力,但需要在 CI/CD 环境中仔细考虑,因为那里没有容器运行时可用。

模块化方法确保应用程序保持轻量级,但引入了大量小型依赖项进行管理。

规范优先 API 开发

作为规范优先实践者,集成 OpenAPI 规范生成是一项关键要求,Quarkus 有效地处理了这一点。

Java 和 Kotlin 互操作性

虽然 Quarkus 支持 Kotlin,但编写完整的 Kotlin 扩展有时会遇到挑战。该团队保留了一些 Java 代码,并且 Java-Kotlin 互操作性运作顺利。

原生编译和性能

原生编译生成了紧凑的原生可执行文件,但生成过程漫长。该团队将其保留在绝对必要的最终构建阶段。

需要进行一些微调以防止类修剪问题。

构建原生可执行文件时,会分析调用树以确定使用了哪些类和方法。所有未使用的内容都会被修剪,以减小可执行文件的大小和 RSS 使用量。

在某些情况下,例如,当使用反射时,您必须显式声明使用了某个类,以便将其包含在原生可执行文件中。

Quarkus 提供了简化此配置的工具。

响应式编程和 Mutiny

由于广泛使用了 Reactor,过渡到 Mutiny 有一个学习曲线。

虽然由于其可导航的 API 而有效且更直观,但在简单情况下,它被认为更冗长。

架构概览

Orange 设计了一个基于微服务的架构,以高效地公开 5G API。

微服务和 API 包装器

每个 API 包装器都作为专用的微服务实现,以实现更好的版本控制。该团队尽可能利用 Reactive API,因为需要在核心网络端执行许多耗时的异步任务,并且节省资源是一项业务目标。

CI/CD 和部署

每个微服务都有自己的 GitLab 存储库,其中包含用于其 Docker 映像的独立构建管道。

Renovate 用于自动执行依赖项升级。一个专用的部署项目使用 Kustomize + ArgoCD 将新的 Docker 映像推送到 OpenShift 集群。

基础设施组件

其他服务包括:

  • 用于密钥管理的 Vault

  • 用于缓存的 Redis

  • 用于数据库操作的 Neo4j

  • 用于消息传递的 Kafka

Vert.x HTTP Proxy 用于路由和后端保护。

结果和影响

在生产中实施 Quarkus 后,Orange 成功地在各种 4G/5G 网络核心上部署了 10 个 API。随着时间的推移,该团队执行了多次 Quarkus 版本升级 (2.11 → 3.14),所有这些都通过 Renovate 得到良好管理,只需进行最少的代码调整——除了迁移到 Jakarta EE 期间的必要调整。