使用Java挂起Google云平台实例



我有一个Java web应用程序,我在其中创建GCP VM实例并对其执行操作。

我使用Java计算引擎API来执行创建、启动、停止等任务

我想表演:

Compute compute = getComputeObj();
Suspend suspend = compute.instances().suspend(getProjectId(), getOrder().getAvailabilityZone(), getOrder().getMachineName());
Operation response = suspend .execute();

然而,我不能";挂起";将这种API作为;挂起";是测试版(它不是计算引擎v1 API的一部分,因此它不是Java包装器的一部分(。

在我看来,我有两个选择来解决这个问题,但我都没能完成:

  1. 创建一个Java类"ComputeBeta";其继承Compute类并实现Suspend类来执行操作。这是有问题的,因为原始Compute类中的URL字段是最终字段,所以我不能将URL从";v1";到";β;url。

  2. 执行一个";常规的";httpconnection到GCP beta API以便挂起计算机。这里的问题是,我无法找到API身份验证的正确语法,并且得到了401响应。到目前为止我尝试过的:

String serviceAccountKey = getServiceAccountKey();
String baseUrl = "https://compute.googleapis.com";
String endpoint = "/compute/beta/projects/" + getOrder().getProject() 
+ "/zones/" + getOrder().getAvailabilityZone() + "/instances/" 
+ getOrder().getMachineName() + "/suspend";
URL serverUrl = new URL(baseUrl + endpoint);
httpConnection = (HttpsURLConnection)serverUrl.openConnection();
httpConnection.setRequestMethod(HttpMethods.POST);
httpConnection.setDoOutput(true);
httpConnection.setDoInput(true);

httpConnection.setFixedLengthStreamingMode(length);
httpConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
httpConnection.setRequestProperty("Authorization", "Bearer " + serviceAccountKey);
httpConnection.connect();
int responseCode = httpConnection.getResponseCode();
String responseMessage = httpConnection.getResponseMessage();

如有任何关于如何前进的帮助,我们将不胜感激!

您不必像这样使用服务帐户密钥。此密钥允许您创建凭证,然后用它生成令牌。

GoogleCredentials credentials = GoogleCredentials.getApplicationDefault();
// You can use explicitly your service account key file like this
// GoogleCredentials credentials = GoogleCredentials.fromStream(this.getClass().getResourceAsStream("my_key_file.json"));
String token = credentials.refreshAccessToken().getTokenValue();
...
httpConnection.setRequestProperty("Authorization", "Bearer " + token);

您也可以使用谷歌运输工厂来避免手动添加授权标头

GoogleCredentials credentials = GoogleCredentials.getApplicationDefault();
// You can use explicitly your service account key file like this
// GoogleCredentials credentials = GoogleCredentials.fromStream(this.getClass().getResourceAsStream("my_key_file.json"));
HttpRequestFactory factory = new NetHttpTransport().createRequestFactory(new HttpCredentialsAdapter(credentials));
// Here a GET request, but you can build a POST request also
HttpRequest request = factory.buildGetRequest(new GenericUrl("YOUR_URL"));
HttpResponse httpResponse = request.execute();
System.out.println(CharStreams.toString(new InputStreamReader(httpResponse.getContent(), Charsets.UTF_8)));

如果你有依赖性问题(通常不是因为你使用了包含它的计算引擎库(,你可以添加这个依赖性

<dependency>
<groupId>com.google.auth</groupId>
<artifactId>google-auth-library-oauth2-http</artifactId>
<version>0.21.1</version>
</dependency>

最新更新