Go 執行階段環境

透過 App Engine,您可以使用 Go 程式設計語言建構網路應用程式。您的 Go 應用程式會在 Google 的可擴充基礎架構中執行,並使用大型的永久儲存空間與服務。

簡介

App Engine 使用安全沙箱環境建構及執行 Go 應用程式程式碼。您的應用程式會與這個環境互動,藉此接收網路要求、執行工作並傳送回應。

Go 適用的 App Engine SDK 提供與標準 Go http 套件類似的介面;編寫 Go App Engine 應用程式的方式與編寫獨立 Go 網路伺服器類似。

Go 執行階段環境使用 Go 1.9 版。 App Engine SDK 內含 Go 編譯器與標準程式庫,因此沒有其他依附元件。至於其他執行階段,沙箱並不提供所有標準程式庫的功能。例如,嘗試開啟通訊端或寫入檔案將會傳回 os.ErrPermission 錯誤。

App Engine SDK 內含自動化建構服務,可用來編譯您的應用程式,這樣您就永遠不需要自行叫用編譯器了。此外,對於 Python SDK 而言,每當您變更來源時,您的應用程式就會自動重新建構。

App Engine 的 Go 執行階段環境可完整支援 Go 常式,但無法同時執行,而是以下列方式執行:將 Go 常式置於作業系統的單一執行緒上進行排程。未來的版本中可能會放寬這項「單一執行緒」限制,特定執行個體將可並行處理多個要求;這就表示,假設有一個要求正在等待 Cloud Datastore API 呼叫,則可由相同的執行個體處理另一個要求。

Go 應用程式在安全的沙箱環境中執行,程式庫稍經刪減。例如,應用程式無法將資料寫入本機檔案系統,也無法任意建立網路連線,只能使用 App Engine 提供的可擴充服務儲存資料,以及透過網際網路通訊。

App Engine 平台提供許多服務,您的程式碼可以呼叫這些服務。

使用 Go 建構應用程式一文提供了使用 Go 與 App Engine 開發網路應用程式的介紹。

選取 Go 執行階段

您需在 app.yaml 設定檔中指定 Go 執行階段環境,再使用該檔案將應用程式部署至 App Engine。例如:

runtime: go
api_version: go1

第一個元素 runtime 會選取 Go 執行階段環境。

第二個元素 api_version 會選取 Go 執行階段環境使用的版本。截至本文撰寫時,Go 環境的最新版本是 go1,這是 Go 最新版本的別名 (目前為 go1.9)。當 App Engine 團隊發佈的環境變更可能無法與現有程式碼相容時,版本 ID 將會遞增。這表示您可以繼續使用舊版 API,此時您仍能夠更新應用程式及變更 api_version 設定。可用的 api_version 值有 go1go1.9go1.8go1.6

整理 Go 應用程式

在 Go 中開發 App Engine 應用程式時,您的程式碼會分割為一或多個服務;每個服務通常都與服務的 app.yaml 檔案一起包含在自己的目錄中:

- project-dir
   - service1-dir
      app.yaml
      src1-1.go
      src1-2.go
   - service2-dir
      app.yaml
      src2-1.go
      src2-2.go

Go 應用程式會整理成若干套件,套件的目錄結構與來源檔案相同。使用 importApp Engine 原始碼中的陳述式時,SDK 工具會以兩種方式解譯 import 的相對路徑:

  • 相對於包含服務之 app.yaml 檔案的目錄

  • 相對於 GOPATH 中所有目錄的 src 子目錄 (這又稱為「完全合格的」匯入路徑)

例如,如果這樣定義 GOPATH

export GOPATH=/home/fred/go

且以上專案目錄範例中的 src1-1.go 檔案包含以下陳述式:

import "foo/bar"

App Engine SDK 會在您執行或部署 service1 時,在這些位置尋找「foo/bar」套件:

project-dir/service1/foo/bar
/home/fred/go/src/foo/bar

如果您將套件來源包含在 GOPATH 中,請小心不要將原始碼放在 App Engine 專案 (專案中包含 app.yaml 檔案) 的任何目錄中或目錄之下。如果您這樣做,系統可能會載入套件兩次,一次針對服務目錄的相對路徑載入,一次針對完全合格的路徑載入。這可能會導致產生一些小問題,而 App Engine SDK 會掃描您的專案與 GOPATH,偵測這種情況,並將情況回報為錯誤。

為了確保作業能順利進行,建議您採取下列措施:

  • 在專案中為每項服務建立單獨的目錄。
  • 每個服務目錄都應該包含服務的 app.yaml 檔案以及一或多個 .go 檔案。
  • 請勿在服務目錄中包含任何子目錄。
  • 您的 .go 檔案應使用完全合格的路徑匯入套件;請將所有套件程式碼放在 src 目錄之下,該目錄必須是專案目錄的第一層子目錄,或者不能在專案目錄之下。

如要進一步瞭解如何建構服務,請參閱 App Engine 總覽一文。

如需 Go 的 GOPATH 的介紹,以及其與 App Engine 開發之間的關係,請參閱 App Engine SDK 與工作區一文。

沙箱

如要讓 App Engine 將應用程式要求分散到多部網路伺服器,並且避免應用程式彼此干擾,應用程式會在受到限制的「沙箱」環境中執行。在這個環境中,應用程式可以執行程式碼、儲存及查詢 Cloud Datastore 中的資料、使用 App Engine 郵件、網址擷取以及使用者服務,也可以檢查使用者的網路要求,以及準備回應。

App Engine 應用程式做不到的事情如下:

  • 寫入檔案系統。應用程式必須使用 Cloud Datastore 儲存永久資料。至於讀取方面,可以從檔案系統讀取,而透過應用程式上傳的所有應用程式檔案也都能提供使用。

  • 回應緩慢。對應用程式發出的網路要求必須在幾秒鐘內處理完成。處理程序需要的回應時間如果太長,就會中斷,以免對網路伺服器造成過重的負荷。

  • 進行其他種類的系統呼叫。

Go 執行階段會限制標準程式庫套件的使用,因為標準程式庫套件可能會違反沙箱的原則。此類功能已由傳回 os.ErrPermission 錯誤的虛設常式取代,或已遭完全移除。

背景要求

手動或基本資源調度執行個體執行的程式碼可以啟動一個要求,這個要求的期限可以長於產生其本身之要求的期限。如此一來,執行個體便可執行任意定期或排程工作,將要求傳回使用者後,也可以繼續在背景執行。

請使用 runtime.RunInBackground 在背景 Go 常式執行程式碼:

err := runtime.RunInBackground(c, func(c appengine.Context) {
  // do something...
})

提供的函式將會由背景資訊叫用,該背景資訊與提供的資訊不同 (並且可能持續得更久)。請注意,每個執行個體設有 10 個同時背景要求的限制。

工具

App Engine 適用的 SDK 所含的工具可用來測試應用程式及上傳應用程式檔案。

開發伺服器會在本機電腦上執行您的應用程式,以測試應用程式。伺服器會模擬 Cloud Datastore 服務和沙箱限制。開發伺服器也會根據應用程式在測試期間執行的查詢,產生 Cloud Datastore 索引的設定。

gcloud 工具會處理指令列與 App Engine 上執行應用程式的所有互動。您需使用 gcloud app deploy 將應用程式上傳至 App Engine,或是更新個別設定檔,例如 Cloud Datastore 索引設定,以利在部署程式碼之前建構新的索引。您也可以查看應用程式的記錄資料,以利使用自己的工具分析應用程式效能。

並行與延遲

應用程式的延遲對提供流量所需的執行個體數量影響最大。如果快速處理要求,單一執行個體就能處理許多要求。

延遲時間與執行個體每秒能夠處理的要求數量之間存在直接關係。例如,延遲 10ms 相當於每個執行個體每秒 100 個要求。

Go 執行階段可以並行處理多個要求,但一次只能有一個執行中的 Go 常式取得 CPU 時間。其他 Go 常式可於發生 I/O 動作 (讀取檔案、進行系統或 API 呼叫) 時執行 I/O 動作。

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
Go 適用的 App Engine 標準環境