电信微服务革命 - 使用 Quarkus 实现 JDiameter 的现代化
![]](/assets/images/posts/quarkus-jdiameter-intro/quarkus-jdiameter-intro.png)
简介
Diameter 协议是任何现代电信后端的基石,在 3G、IMS、4G 和 5G 网络中提供身份验证、授权和计费 (AAA) 服务。一些供应商提供商业许可的 Diameter 协议栈,其中大多数是用 C++ 编写的。因此,Java 世界中的许多人转向了开源的 RestComm JDiameter 协议栈。
JDiameter 开发于 2010 年代初期,在过去七年中未收到任何更新。JDiameter 的一个主要挑战是它依赖于过时的依赖项——一些依赖项具有已知的通用漏洞和暴露 (CVE),另一些依赖项已弃用或不再支持。此外,JDiameter 是用 Java 1.7 编写的,这限制了 Java 语言中现代进步的使用,例如虚拟线程。
随着电信领域向微服务的转变,许多组织现在开发使用 Kubernetes 和 OpenShift 等平台部署和管理的解决方案。在 Java 生态系统中,开发人员有几种微服务框架可供选择,主要的框架是 Spring Boot、Micronaut 和我首选的 Quarkus。
在过去的七年中,我主要为预付费移动网络中的用户开发计费和账单解决方案,包括编写 Diameter 路由代理 (DRA) 和在线计费系统 (OCS)。在这两种情况下,我都使用 Quarkus 作为微服务框架,并使用 JDiameter 作为 Diameter 协议栈——我必须补充一点,这带来了很多挫败感。
我们开发的解决方案是有效的,但感觉更像是一个带有 JDiameter Sidecar 的 Quarkus 应用程序。Diameter 协议栈独立运行,没有利用 Quarkus 框架提供的优势。
Quarkus JDiameter 扩展
最终,我对将 JDiameter 与 Quarkus 集成的 Sidecar 方法感到沮丧,这促使我开发了一种解决方案,使两者能够更和谐地工作。这项举措促成了 Quarkus JDiameter 扩展的创建。
如前所述,RestComm JDiameter 协议栈已被忽视,并且急需关注。我的第一步是通过删除已弃用的依赖项并将过时的依赖项更新到最新版本来使 JDiameter 协议栈现代化。
对协议栈进行了两项关键更改。第一个是删除 Pico 容器(来自 Java EE 时代之前的过时的依赖注入框架),第二个是用更现代的线程池模型替换旧线程组模型的并发逻辑。随着线程池的引入,Diameter 协议栈现在可以利用虚拟线程了!
下一个挑战是开发一个 Quarkus 扩展,将 Diameter 协议栈集成到 Quarkus 框架中。我对这个扩展有三个主要目标
-
简化配置:将配置移动到“application.properties”文件,以使协议栈更易于配置。
-
依赖注入:支持将 Diameter 协议栈和配置依赖注入到作用域服务中。
-
拦截器服务框架:创建一个拦截器服务框架,以便更直接地实现 Diameter 应用程序。
Quarkus JDiameter 协议栈已发布,现在是 Quarkiverse Hub 的一部分。您可以在 Quarkiverse Hub 上找到它。协议栈的文档可在 Quarkus JDiameter 文档 中找到。