You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Google Run Java SDK仅更新修订版本的流量分配?

解决Google Cloud Run Java SDK更新流量占比时创建新修订版的问题

要实现和gcloud run services update-traffic命令相同的流量更新效果,核心是仅修改服务的流量配置,不触动服务模板(Template)内容,同时通过update_mask明确指定只更新流量字段,避免触发新修订版的创建。

关键实现步骤

  1. 构造仅含流量配置的服务对象:不需要设置服务的容器镜像、环境变量等模板相关字段,只需要指定服务的完整资源名称和目标流量分配规则。
  2. 设置正确的update_mask:必须将update_mask设置为"traffic",告知Cloud Run API仅更新流量配置部分,忽略其他未指定的字段。

Java代码示例

import com.google.cloud.run.v2.*;
import com.google.protobuf.FieldMask;

public class UpdateRunTraffic {
    public static void main(String[] args) throws Exception {
        // 初始化Cloud Run客户端
        try (ServicesClient servicesClient = ServicesClient.create()) {
            // 服务的完整资源名称
            String serviceName = "projects/[PROJECT_ID]/locations/[REGION]/services/[SERVICE_NAME]";

            // 构造流量分配规则:比如给两个修订版分配70%和30%的流量
            TrafficTarget trafficTarget1 = TrafficTarget.newBuilder()
                    .setRevision("projects/[PROJECT_ID]/locations/[REGION]/services/[SERVICE_NAME]/revisions/[REVISION_1_NAME]")
                    .setPercent(70)
                    .build();

            TrafficTarget trafficTarget2 = TrafficTarget.newBuilder()
                    .setRevision("projects/[PROJECT_ID]/locations/[REGION]/services/[SERVICE_NAME]/revisions/[REVISION_2_NAME]")
                    .setPercent(30)
                    .build();

            // 构造服务对象:仅设置名称和流量配置
            Service service = Service.newBuilder()
                    .setName(serviceName)
                    .addAllTraffic(java.util.List.of(trafficTarget1, trafficTarget2))
                    .build();

            // 构建UpdateServiceRequest,指定update_mask为"traffic"
            UpdateServiceRequest request = UpdateServiceRequest.newBuilder()
                    .setService(service)
                    .setUpdateMask(FieldMask.newBuilder().addPaths("traffic").build())
                    .build();

            // 发送请求更新流量
            Service updatedService = servicesClient.updateService(request);
            System.out.println("流量更新完成:" + updatedService.getTrafficList());
        }
    }
}

注意事项

  • 修订版名称格式:必须使用完整的资源名称,不能仅用修订版的短名称。
  • 避免修改模板字段:如果在Service对象中设置了template相关字段(如容器镜像、资源限制),即使update_mask设为traffic,仍可能触发新修订版创建,务必只保留name和traffic字段。
  • 使用v2版本SDK:确保依赖的是Google Cloud Run v2的客户端库,与你参考的API文档版本一致。

内容的提问来源于stack exchange,提问作者Sainath Batthala

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 15:35:49