Skip to content

AOT 与原生镜像支持 (AOT and Native Image Support)

4.0.0 版本起,Spring Cloud Gateway 已支持 Spring AOT 转换和原生镜像(Native Images)。

提示

如果您正在使用负载均衡路由(Load-balanced routes),则需要显式定义您的 LoadBalancerClient 服务 ID。 您可以通过使用 @LoadBalancerClient 注解的 valuename 属性,或者通过 spring.cloud.loadbalancer.eager-load.clients 属性来设置这些服务 ID。


补充教学 —— 为什么要关注原生镜像?

1. 什么是原生镜像 (Native Image)? 通常我们运行 Spring 应用程序是 java -jar,这需要 JVM 虚拟机。而原生镜像(基于 GraalVM)允许将应用程序预先编译成特定操作系统的二进制可执行文件。

2. 对网关的巨大优势

  • 启动速度极快:传统网关启动可能需要 10-20 秒,原生镜像可以将启动时间降低到 100 毫秒 级别。这在 Serverless 架构(如 AWS Lambda, Knative)中实现“秒开”至关重要。
  • 内存占用极低:原生镜像不需要完整的 JVM 运行时,内存占用通常只有传统模式的 1/5 到 1/10。这大大降低了云端部署的成本。
  • 安全增强:由于不包含未使用的代码,攻击面更小。

3. 为什么负载均衡需要显式定义 ID? 在原生镜像中,程序运行时的反射(Reflection)和动态代理受到严格限制。Spring Cloud LoadBalancer 为了在原生环境中正常工作,必须提前知道它要为哪些服务(Service ID)提供负载均衡,以便 AOT 编译器能够预先准备好必要的元数据和代理类。

如果你遗漏了配置,可能会遇到路由到 lb://service-name 时报错,因为网关在启动时还没“准备好”该服务的负载均衡器。

最佳实践: 如果你的网关决定走向云原生架构(如 K8s 环境),尝试使用 GraalVM 编译。虽然编译过程较慢(可能需要几分钟),但运行时的极速体验和资源节省是非常值得的。

Based on Spring Framework.