服務的每個版本是由 .yaml
檔案來定義,該檔案會說明服務與版本的名稱。YAML 檔案通常與其定義的服務同名,但這並非必要條件。如要部署某項服務的數個版本,可以在同一個目錄中建立多個 yaml 檔案 (每個版本各一個)。
一般來說,您可以為各項服務建立目錄,當中包含該項服務的 YAML 檔案和相關聯原始碼。最上層應用程式目錄中會包含選用的應用程式層級設定檔 (dispatch.yaml
、cron.yaml
、index.yaml
和 queue.yaml
)。以下範例呈現了三項服務。service1
和 service2
中的原始檔與 YAML 檔案位於相同層級,service3
中則包含兩個版本的 YAML 檔案。
如為小型、簡易型專案,您可以將所有應用程式檔案存放於同一個目錄:
每一個 YAML 檔案都必須含有一個版本參數。如要定義預設服務,您可以明確納入 service: default
參數,或是將服務參數排除在檔案之外。
每個服務設定檔都會定義特定服務/版本的資源調度類型和執行個體類別。視指定的資源調度類型而定,您必須使用不同的資源調度參數。如果您未指定資源調度設定,預設值為自動調整資源配置。如需資源調度和執行個體類別設定的相關說明,請參閱 appengine-web.xml
參考資料部分。
您也可以針對各項服務指定設定,將網址要求對應至特定指令碼及識別靜態檔案,藉此提升伺服器的工作效率。這些設定也會包含在 yaml 檔案中,相關說明請見 appengine-web.xml
參考資料部分。
預設服務
每個應用程式均有一項預設服務。您可以在 appengine-web.xml
中使用 service: default
設定來定義預設服務,不過此為選用動作。凡是與服務有關的設定參數均可套用至預設服務。
選用設定檔
這些設定檔控制適用於應用程式中所有服務的選用功能:
dispatch.yaml
會根據網址中的路徑或主機名稱,將傳入要求傳送至特定服務,藉此覆寫轉送預設規則。queue.yaml
會同時設定發送佇列和提取佇列。- 如果應用程式使用 Datastore 查詢,
index.yaml
會指定應用程式需要哪些索引。 cron.yaml
會設定定期工作,依照指定的時間或間隔規律執行特定工作。
如要在 App Engine 中部署這些設定檔的更新內容,請在設定檔所在的目錄中執行以下指令:
gcloud app deploy [CONFIG_FILE]
範例
以下範例顯示了如何為具備兩項服務的應用程式設定 WAR 目錄結構中的各個檔案。這兩項服務分別為處理網路要求的預設服務,以及負責處理後端的「my-service
」服務。
假設頂層的 EAR 目錄是「my-application」,則您必須定義 my-application/META-INF/appengine-application.xml
檔案:
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<appengine-application xmlns="http://appengine.google.com/ns/1.0">
<application>my-application</application>
</appengine-application>
為 my-application/default
和 my-application/my-service
這兩項服務建立 WAR 目錄。
接著,請在每個 WAR 目錄中各建立一個 appengine-web.xml
檔案,以便指定服務的參數。該檔案中必須包含服務的版本名稱。如要定義預設服務,您可以明確納入 <service>default</service>
參數,也可以將其排除在檔案之外。以下是定義預設服務的 my-application/default/WEB-INF/appengine-web.xml
檔案:
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
<application>my-application</application>
<module>default</module>
<version>uno</version>
<threadsafe>true</threadsafe>
</appengine-web-app>
這個檔案 my-application/my-service/WEB-INF/appengine-web.xml
定義了處理背景要求的服務:
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
<application>my-application</application>
<module>my-service</module>
<version>uno</version>
<threadsafe>true</threadsafe>
<manual-scaling>
<instances>5</instances>
</manual-scaling>
</appengine-web-app>
最後,請定義列舉服務的 my-application/META-INF/application.xml
檔案。請注意,預設服務應為清單中的第一項服務。
<?xml version="1.0"
encoding="UTF-8"?>
<application
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/application_5.xsd"
version="5">
<description>GAE Java SuperFun app</description>
<display-name>SuperFun</display-name>
<!-- Services -->
<!-- The default service should be listed first -->
<module>
<web>
<web-uri>default</web-uri>
<context-root>default</context-root>
</web>
</module>
<module>
<web>
<web-uri>my-service</web-uri>
<context-root>my-service</context-root>
</web>
</module>
</application>
App Engine 會忽略 <context-root>
元素,因此 HTTP 用戶端在呼叫服務時,無須將其附加至網址路徑的最前方。