在 Google Cloud Platform 上執行 Java

免費試用 查看說明文件

針對高擴充性的 Java 應用程式執行建構、部署、偵錯和監控作業

  • 在 GCP 上透過 Eclipse、IntelliJ 或瀏覽器指令列建構 Java 應用程式
  • 部署及擴充 Spring Boot 或 Spark Java 應用程式
  • 透過 Maven 或 Gradle 建構工具外掛程式來建構和部署應用程式至 GCP
  • 使用 Java 在 GCP 上查詢全代管的 MySQL、PostgreSQL 或 NoSQL 資料庫
  • 將 Java 應用程式部署至代管的 Kubernetes 叢集
  • 在 Google 負責維護的 OpenJDK 或 OpenJDK+Jetty9 Docker 映像檔上執行應用程式
一系列慣用的 Java API 和程式庫
在 Cloud Storage 內儲存及封存資料
透過 Pub/Sub 設定全代管的事件驅動訊息傳遞服務
使用 BigQuery 查詢公開資料
透過 Translation API 翻譯不同語言的文字
使用 Vision API 分析圖片內容
在 Cloud Storage 內儲存及封存資料
1
設定 Cloud Platform 主控台專案
  1. 登入您的 Google 帳戶。

    如果您沒有帳戶,請申請新帳戶

  2. 設定 GCP 主控台專案。

    設定專案

    按一下即可:

    • 建立或選取專案。
    • 啟用該專案的Cloud Storage API。
    • 建立服務帳戶。
    • 將私密金鑰下載為 JSON。

    您可以隨時在 GCP 主控台中查看及管理這些資源。

2
設定 Cloud Storage 值區

建立 Cloud Storage 值區:

gsutil mb gs://[YOUR-BUCKET-NAME]

值區必須設為可公開讀取的狀態,才能提供檔案:

gsutil defacl set public-read gs://[YOUR_BUCKET_NAME]
3
為 pom.xml 新增 Maven 依附元件
<dependency>
  <groupId>com.google.cloud</groupId>
  <artifactId>google-cloud-storage</artifactId>
  <version>1.22.0</version>
</dependency>
4
為 app.yaml 新增環境變數
env_variables:
  BUCKET_NAME: YOUR-BUCKET-NAME
5
編寫程式碼
@SuppressWarnings("serial")
@WebServlet(name = "upload", value = "/upload")
@MultipartConfig()
public class UploadServlet extends HttpServlet {

  private static final String BUCKET_NAME = System.getenv("BUCKET_NAME");
  private static Storage storage = null;

  @Override
  public void init() {
    storage = StorageOptions.getDefaultInstance().getService();
  }

  @Override
  public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException,
      ServletException {
    final Part filePart = req.getPart("file");
    final String fileName = filePart.getSubmittedFileName();

    // Modify access list to allow all users with link to read file
    List<Acl> acls = new ArrayList<>();
    acls.add(Acl.of(Acl.User.ofAllUsers(), Acl.Role.READER));
    // the inputstream is closed by default, so we don't need to close it here
    Blob blob =
        storage.create(
            BlobInfo.newBuilder(BUCKET_NAME, fileName).setAcl(acls).build(),
            filePart.getInputStream());

    // return the public download link
    resp.getWriter().print(blob.getMediaLink());
  }
}
透過 Pub/Sub 設定全代管的事件驅動訊息傳遞服務。
1
設定 Cloud Platform 主控台專案
  1. 登入您的 Google 帳戶。

    如果您沒有帳戶,請申請新帳戶

  2. 設定 GCP 主控台專案。

    設定專案

    按一下即可:

    • 建立或選取專案。
    • 啟用該專案的Cloud Pub/Sub API。
    • 建立服務帳戶。
    • 將私密金鑰下載為 JSON。

    您可以隨時在 GCP 主控台中查看及管理這些資源。

2
建立主題和訂閱內容
gcloud beta pubsub topics create YOUR_TOPIC_NAME
gcloud beta pubsub subscriptions create YOUR_SUBSCRIPTION_NAME --topic YOUR_TOPIC_NAME
3
為 pom.xml 新增 Maven 依附元件
<dependency>
  <groupId>com.google.cloud</groupId>
  <artifactId>google-cloud-pubsub</artifactId>
  <version>1.62.0</version>
</dependency>
4
編寫程式碼以發布及接收訊息

發布訊息

import com.google.api.core.ApiFuture;
import com.google.api.core.ApiFutureCallback;
import com.google.api.core.ApiFutures;
import com.google.api.gax.rpc.ApiException;
import com.google.cloud.ServiceOptions;
import com.google.cloud.pubsub.v1.Publisher;
import com.google.protobuf.ByteString;
import com.google.pubsub.v1.ProjectTopicName;
import com.google.pubsub.v1.PubsubMessage;

public class PublisherExample {

  // use the default project id
  private static final String PROJECT_ID = ServiceOptions.getDefaultProjectId();

  /** Publish messages to a topic.
   * @param args topic name, number of messages
   */
  public static void main(String... args) throws Exception {
    // topic id, eg. "my-topic"
    String topicId = args[0];
    int messageCount = Integer.parseInt(args[1]);
    ProjectTopicName topicName = ProjectTopicName.of(PROJECT_ID, topicId);
    Publisher publisher = null;
    try {
      // Create a publisher instance with default settings bound to the topic
      publisher = Publisher.newBuilder(topicName).build();

      for (int i = 0; i < messageCount; i++) {
        String message = "message-" + i;

        // convert message to bytes
        ByteString data = ByteString.copyFromUtf8(message);
        PubsubMessage pubsubMessage = PubsubMessage.newBuilder()
            .setData(data)
            .build();

        //schedule a message to be published, messages are automatically batched
        ApiFuture<String> future = publisher.publish(pubsubMessage);

        // add an asynchronous callback to handle success / failure
        ApiFutures.addCallback(future, new ApiFutureCallback<String>() {

          @Override
          public void onFailure(Throwable throwable) {
            if (throwable instanceof ApiException) {
              ApiException apiException = ((ApiException) throwable);
              // details on the API exception
              System.out.println(apiException.getStatusCode().getCode());
              System.out.println(apiException.isRetryable());
            }
            System.out.println("Error publishing message : " + message);
          }

          @Override
          public void onSuccess(String messageId) {
            // Once published, returns server-assigned message ids (unique within the topic)
            System.out.println(messageId);
          }
        });
      }
    } finally {
      if (publisher != null) {
        // When finished with the publisher, shutdown to free up resources.
        publisher.shutdown();
      }
    }
  }
}

訂閱訊息

import com.google.cloud.ServiceOptions;
import com.google.cloud.pubsub.v1.AckReplyConsumer;
import com.google.cloud.pubsub.v1.MessageReceiver;
import com.google.cloud.pubsub.v1.Subscriber;
import com.google.pubsub.v1.ProjectSubscriptionName;
import com.google.pubsub.v1.PubsubMessage;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingDeque;

public class SubscriberExample {

  // use the default project id
  private static final String PROJECT_ID = ServiceOptions.getDefaultProjectId();

  private static final BlockingQueue<PubsubMessage> messages = new LinkedBlockingDeque<>();

  static class MessageReceiverExample implements MessageReceiver {

    @Override
    public void receiveMessage(PubsubMessage message, AckReplyConsumer consumer) {
      messages.offer(message);
      consumer.ack();
    }
  }

  /** Receive messages over a subscription. */
  public static void main(String... args) throws Exception {
    // set subscriber id, eg. my-sub
    String subscriptionId = args[0];
    ProjectSubscriptionName subscriptionName = ProjectSubscriptionName.of(
        PROJECT_ID, subscriptionId);
    Subscriber subscriber = null;
    try {
      // create a subscriber bound to the asynchronous message receiver
      subscriber =
          Subscriber.newBuilder(subscriptionName, new MessageReceiverExample()).build();
      subscriber.startAsync().awaitRunning();
      // Continue to listen to messages
      while (true) {
        PubsubMessage message = messages.take();
        System.out.println("Message Id: " + message.getMessageId());
        System.out.println("Data: " + message.getData().toStringUtf8());
      }
    } finally {
      if (subscriber != null) {
        subscriber.stopAsync();
      }
    }
  }
}
透過 BigQuery 執行資料分析
1
設定 Cloud Platform 主控台專案
  1. 登入您的 Google 帳戶。

    如果您沒有帳戶,請申請新帳戶

  2. 設定 GCP 主控台專案。

    設定專案

    按一下即可:

    • 建立或選取專案。
    • 啟用該專案的BigQuery API。
    • 建立服務帳戶。
    • 將私密金鑰下載為 JSON。

    您可以隨時在 GCP 主控台中查看及管理這些資源。

2
為 pom.xml 新增 Maven 依附元件
<dependency>
  <groupId>com.google.cloud</groupId>
  <artifactId>google-cloud-bigquery</artifactId>
  <version>1.62.0</version>
</dependency>
3
編寫程式碼

建立 BigQuery 服務物件

BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();

查詢公開資料

QueryJobConfiguration queryConfig =
    QueryJobConfiguration.newBuilder(
      "SELECT "
          + "CONCAT('https://stackoverflow.com/questions/', CAST(id as STRING)) as url, "
          + "view_count "
          + "FROM `bigquery-public-data.stackoverflow.posts_questions` "
          + "WHERE tags like '%google-bigquery%' "
          + "ORDER BY favorite_count DESC LIMIT 10")
        // Use standard SQL syntax for queries.
        // See: https://cloud.google.com/bigquery/sql-reference/
        .setUseLegacySql(false)
        .build();

// Create a job ID so that we can safely retry.
JobId jobId = JobId.of(UUID.randomUUID().toString());
Job queryJob = bigquery.create(JobInfo.newBuilder(queryConfig).setJobId(jobId).build());

// Wait for the query to complete.
queryJob = queryJob.waitFor();

// Check for errors
if (queryJob == null) {
  throw new RuntimeException("Job no longer exists");
} else if (queryJob.getStatus().getError() != null) {
  // You can also look at queryJob.getStatus().getExecutionErrors() for all
  // errors, not just the latest one.
  throw new RuntimeException(queryJob.getStatus().getError().toString());
}

顯示結果

// Get the results.
QueryResponse response = bigquery.getQueryResults(jobId);

TableResult result = queryJob.getQueryResults();

// Print all pages of the results.
for (FieldValueList row : result.iterateAll()) {
  String url = row.get("url").getStringValue();
  long viewCount = row.get("view_count").getLongValue();
  System.out.printf("url: %s views: %d%n", url, viewCount);
}
透過 Translation API 翻譯不同語言的文字
1
設定 Cloud Platform 主控台專案
  1. 登入您的 Google 帳戶。

    如果您沒有帳戶,請申請新帳戶

  2. 設定 GCP 主控台專案。

    設定專案

    按一下即可:

    • 建立或選取專案。
    • 啟用該專案的Cloud Translation API。
    • 建立服務帳戶。
    • 將私密金鑰下載為 JSON。

    您可以隨時在 GCP 主控台中查看及管理這些資源。

2
為 pom.xml 新增 Maven 依附元件
<dependency>
  <groupId>com.google.cloud</groupId>
  <artifactId>google-cloud-translate</artifactId>
  <version>1.62.0</version>
</dependency>
3
編寫程式碼
// Imports the Google Cloud client library
import com.google.cloud.translate.Translate;
import com.google.cloud.translate.Translate.TranslateOption;
import com.google.cloud.translate.TranslateOptions;
import com.google.cloud.translate.Translation;

public class QuickstartSample {
  public static void main(String... args) throws Exception {
    // Instantiates a client
    Translate translate = TranslateOptions.getDefaultInstance().getService();

    // The text to translate
    String text = "Hello, world!";

    // Translates some text into Russian
    Translation translation =
        translate.translate(
            text,
            TranslateOption.sourceLanguage("en"),
            TranslateOption.targetLanguage("ru"));

    System.out.printf("Text: %s%n", text);
    System.out.printf("Translation: %s%n", translation.getTranslatedText());
  }
}
使用 Vision API 分析圖片內容
1
設定 Cloud Platform 主控台專案
  1. 登入您的 Google 帳戶。

    如果您沒有帳戶,請申請新帳戶

  2. 設定 GCP 主控台專案。

    設定專案

    按一下即可:

    • 建立或選取專案。
    • 啟用該專案的Cloud Vision API。
    • 建立服務帳戶。
    • 將私密金鑰下載為 JSON。

    您可以隨時在 GCP 主控台中查看及管理這些資源。

2
為 pom.xml 新增 Maven 依附元件
<dependency>
  <groupId>com.google.cloud</groupId>
  <artifactId>google-cloud-vision</artifactId>
  <version>1.62.0</version>
</dependency>
<dependency>
  <groupId>com.google.cloud</groupId>
  <artifactId>google-cloud-storage</artifactId>
  <version>1.62.0</version>
</dependency>
3
編寫程式碼

取得 Vision 服務

/**
 * Connects to the Vision API using Application Default Credentials.
 */
public static Vision getVisionService() throws IOException, GeneralSecurityException {
  GoogleCredential credential =
      GoogleCredential.getApplicationDefault().createScoped(VisionScopes.all());
  JsonFactory jsonFactory = JacksonFactory.getDefaultInstance();
  return new Vision.Builder(GoogleNetHttpTransport.newTrustedTransport(), jsonFactory, credential)
          .setApplicationName(APPLICATION_NAME)
          .build();
}

偵測臉孔

/**
 * Gets up to {@code maxResults} faces for an image stored at {@code path}.
 */
public List<FaceAnnotation> detectFaces(Path path, int maxResults) throws IOException {
  byte[] data = Files.readAllBytes(path);

  AnnotateImageRequest request =
      new AnnotateImageRequest()
          .setImage(new Image().encodeContent(data))
          .setFeatures(ImmutableList.of(
              new Feature()
                  .setType("FACE_DETECTION")
                  .setMaxResults(maxResults)));
  Vision.Images.Annotate annotate =
      vision.images()
          .annotate(new BatchAnnotateImagesRequest().setRequests(ImmutableList.of(request)));
  // Due to a bug: requests to Vision API containing large images fail when GZipped.
  annotate.setDisableGZipContent(true);

  BatchAnnotateImagesResponse batchResponse = annotate.execute();
  assert batchResponse.getResponses().size() == 1;
  AnnotateImageResponse response = batchResponse.getResponses().get(0);
  if (response.getFaceAnnotations() == null) {
    throw new IOException(
        response.getError() != null
            ? response.getError().getMessage()
            : "Unknown error getting image annotations");
  }
  return response.getFaceAnnotations();
}

標明臉孔

/**
 * Reads image {@code inputPath} and writes {@code outputPath} with {@code faces} outlined.
 */
private static void writeWithFaces(Path inputPath, Path outputPath, List<FaceAnnotation> faces)
    throws IOException {
  BufferedImage img = ImageIO.read(inputPath.toFile());
  annotateWithFaces(img, faces);
  ImageIO.write(img, "jpg", outputPath.toFile());
}

/**
 * Annotates an image {@code img} with a polygon around each face in {@code faces}.
 */
public static void annotateWithFaces(BufferedImage img, List<FaceAnnotation> faces) {
  for (FaceAnnotation face : faces) {
    annotateWithFace(img, face);
  }
}

/**
 * Annotates an image {@code img} with a polygon defined by {@code face}.
 */
private static void annotateWithFace(BufferedImage img, FaceAnnotation face) {
  Graphics2D gfx = img.createGraphics();
  Polygon poly = new Polygon();
  for (Vertex vertex : face.getFdBoundingPoly().getVertices()) {
    poly.addPoint(vertex.getX(), vertex.getY());
  }
  gfx.setStroke(new BasicStroke(5));
  gfx.setColor(new Color(0x00ff00));
  gfx.draw(poly);
}
Java 快速入門
找出並修復實際工作環境的問題

Google Stackdriver 提供追蹤、偵錯記錄、監控和回報功能,可讓您深入掌握雲端應用程式的健康狀態、效能和可用性,更快找出實際工作環境的問題並加以修復。

瞭解詳情
歡迎加入 GCP 的 Java 社群討論空間

有任何想法或疑問嗎?加入我們的社群後,您可以提出問題,或是和協助在 Google Cloud Platform 建構 Java 支援服務的 Google 專家交流聯繫。