如何通过Google Run Java SDK仅更新修订版本的流量分配?
解决Google Cloud Run Java SDK更新流量占比时创建新修订版的问题
要实现和gcloud run services update-traffic命令相同的流量更新效果,核心是仅修改服务的流量配置,不触动服务模板(Template)内容,同时通过update_mask明确指定只更新流量字段,避免触发新修订版的创建。
关键实现步骤
- 构造仅含流量配置的服务对象:不需要设置服务的容器镜像、环境变量等模板相关字段,只需要指定服务的完整资源名称和目标流量分配规则。
- 设置正确的
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
相关产品推荐
相关产品推荐

