Con App Engine, puoi creare applicazioni web che utilizzano l'infrastruttura scalabile e i servizi di Google. App Engine esegue l'applicazione web utilizzando una JVM Java 8. App Engine richiama le classi servlet dell'app per gestire le richieste e preparare le risposte in questo ambiente.
La piattaforma App Engine offre molti servizi API integrati che il tuo codice può chiamare. L'applicazione può anche configurare attività pianificate eseguite a intervalli specificati.
Specifica del runtime Java 8 per la tua app
Per fare in modo che la tua app utilizzi il runtime Java 8, aggiungi la seguente riga al file appengine-web.xml
:
<runtime>java8</runtime>
Il file appengine-api.jar
incluso con Google Cloud CLI in platform/google_appengine/google/appengine/tools/java/lib/impl/appengine-api.jar
rappresenta l'API App Engine per Java. Puoi anche accedere a questo file utilizzando il repository Maven che elenca tutte le versioni.
Puoi selezionare la versione dell'API utilizzata dall'applicazione includendo questo JAR nella
directory WEB-INF/lib/
dell'applicazione oppure utilizzare Maven per gestire le dipendenze. Se viene rilasciata una nuova versione dell'ambiente di runtime Java che introduce modifiche non compatibili con le app esistenti, l'ambiente avrà un nuovo numero di versione principale.
Utilizzo di Maven per gestire le dipendenze
Puoi utilizzare Maven per gestire tutte le dipendenze. Ad esempio, questa vocepom.xml
include l'API App Engine più recente
(Rappengine-api-1.0-sdk
) disponibile da Maven Central:
<dependency> <groupId>com.google.appengine</groupId> <artifactId>appengine-api-1.0-sdk</artifactId> <version></version> </dependency>
La sandbox
Il runtime Java di App Engine distribuisce le richieste per le applicazioni su più server web e impedisce che un'applicazione interferisca con un'altra. Un'app App Engine non deve rispondere lentamente. Le richieste web inviate a un'applicazione devono essere gestite entro il limite di timeout della richiesta. I processi che superano questo limite di risposta vengono terminati per evitare di sovraccaricare il server web.Tieni presente che l'unica posizione in cui gli utenti possono scrivere file è la directory /tmp
.
I file in /tmp
occuperanno la memoria allocata all'istanza. I file archiviati in questa posizione sono disponibili solo per questa istanza e solo per la durata di questa specifica istanza.
Generalmente l'applicazione riceve i file di risorse pacchettizzando i file
che utilizzi nell'applicazione in WEB-INF
, per poi caricarli dall'app
utilizzando Class.getResource()
, ServletContext.getResource()
o metodi simili.
Per impostazione predefinita, tutti i file in WAR sono "file di risorse". Puoi escludere file da questo set utilizzando il file appengine-web.xml
.
Ordinazione JAR del caricatore di classi
A volte, potrebbe essere necessario ridefinire l'ordine in cui i file JAR vengono analizzati per le classi al fine di risolvere i conflitti tra i nomi delle classi. In
questi casi, la priorità di caricamento può essere concessa a file JAR specifici aggiungendo
un elemento <class-loader-config>
contenente elementi <priority-specifier>
nel
file appengine-web.xml
. Ad esempio:
<class-loader-config>
<priority-specifier filename="mailapi.jar"/>
</class-loader-config>
In questo modo, "mailapi.jar
" diventa il primo file JAR in cui eseguire la ricerca per i corsi, tranne quelli presenti nella directory war/WEB-INF/classes/
.
Se a più file JAR viene assegnata la priorità, verrà utilizzato il loro ordine di caricamento originale (rispetto agli altri). In altre parole, l'ordine degli
elementi <priority-specifier>
stessi non è importante.
Thread
Con il runtime Java 8, puoi creare thread utilizzando
l'API ThreadManager
di App Engine e le API integrate di Java, ad esempio new Thread()
.
Attualmente, se vuoi chiamare le API App Engine (com.google.appengine.api.*
), devi chiamare queste API da un thread di richiesta o da un thread creato utilizzando l'API ThreadManager.
Un'applicazione può
- Implementa
java.lang.Runnable
. - Crea un fabbrica di thread chiamando
com.google.appengine.api.ThreadManager.currentRequestThreadFactory()
. - Chiama il metodo
newRequestThread
di fabbrica, passandoRunnable
onewRequestThread(runnable)
oppure utilizza l'oggetto di fabbrica restituito dacom.google.appengine.api.ThreadManager.currentRequestThreadFactory()
conExecutorService
(ad esempio, chiamataExecutors.newCachedThreadPool(factory)
).
Se crei un ThreadPoolExecutor
con currentRequestThreadFactory()
, l'elemento
shutdown()
deve essere chiamato esplicitamente prima del completamento della richiesta servlet. In caso contrario, la richiesta non verrà completata e il server delle app non riuscirà.
Tieni presente che alcune librerie potrebbero creare ThreadPoolExecutor per te.
Un'applicazione può eseguire operazioni sul thread corrente, ad esempio thread.interrupt()
.
Ogni richiesta è limitata a 50 thread di richieste dell'API App Engine simultanei.
Quando utilizzi i thread, utilizza oggetti di contemporaneità di alto livello, come Executor
e Runnable
. Questi si occupano di molti dei dettagli discreti ma importanti della contemporaneità, come le interruzioni e la pianificazione e la tenuta della contabilità.
Strumenti
IDE supportati
Cloud Tools for Eclipse aggiunge nuove procedure guidate e configurazioni di debug al tuo IDE Eclipse per i progetti App Engine. Puoi eseguire il deployment dei tuoi progetti App Engine dal vivo in produzione da Eclipse.
Cloud Tools for IntelliJ consente di eseguire le applicazioni App Engine ed eseguirne il debug in IntelliJ IDEA. Puoi eseguire il deployment dei tuoi progetti App Engine in diretta in produzione senza uscire dall'IDE.
Strumenti di creazione supportati
Per velocizzare il processo di sviluppo, puoi utilizzare i plug-in App Engine per Apache Maven o Gradle:
- Plug-in Apache Maven basato su interfaccia a riga di comando gcloud
- Plug-in Gradle basato su interfaccia a riga di comando gcloud
Server di sviluppo locale
Il server di sviluppo esegue l'applicazione sul tuo computer locale per lo sviluppo e i test. Il server simula i servizi Datastore. Il server di sviluppo può generare la configurazione per gli indici Datastore anche in base alle query eseguite dall'app durante i test.
Contemporaneità e latenza
La latenza dell'applicazione ha l'impatto maggiore sul numero di istanze necessarie per gestire il traffico. Se elabori le richieste rapidamente, una singola istanza può gestire molte richieste.
Le istanze con thread singolo possono gestire una richiesta in parallelo. Esiste quindi una relazione diretta tra la latenza e il numero di richieste che possono essere gestite sull'istanza al secondo. Ad esempio, la latenza di 10 ms equivale a 100 richiesta/secondo/istanza.Le istanze multi-thread possono gestire molte richieste in parallelo. Pertanto, esiste una relazione diretta tra la CPU utilizzata e il numero di richieste al secondo.
Le app Java supportano richieste in parallelo, pertanto una singola istanza può gestire nuove richieste in attesa del completamento di altre. La contemporaneità riduce notevolmente il numero di istanze richieste dalla tua app, ma devi progettarla per il multi-threading.
Ad esempio, se un'istanza B4 (circa 2,4 GHz) consuma 10 MB di cicli/richiesta, puoi elaborare 240 richieste/secondo/istanza. Se consuma 100 Mcicli/richiesta, puoi elaborare 24 richieste/secondo/istanza. Queste cifre sono il caso ideale, ma sono abbastanza realistici in termini di ciò che puoi ottenere su un'istanza.
Release Java di App Engine
Tutti gli artefatti rilasciati che iniziano con la versione 2.x.x
utilizzano il meccanismo di rilascio
open source. Gli artefatti rilasciati che iniziano con la versione 1.9.9xx
o precedente utilizzano il
sistema di compilazione interno. Consulta il
repository GitHub
per ulteriori dettagli.
Variabili di ambiente
Le seguenti variabili di ambiente sono impostate dal runtime:
Variabile di ambiente | Descrizione |
---|---|
GAE_APPLICATION
|
L'ID della tua applicazione App Engine. Questo ID è preceduto dal prefisso "region code~", ad esempio "e~" per le applicazioni distribuite in Europa. |
GAE_DEPLOYMENT_ID |
L'ID del deployment corrente. |
GAE_ENV |
L'ambiente App Engine. Impostato su standard . |
GAE_INSTANCE |
L'ID dell'istanza su cui il servizio è attualmente in esecuzione. |
GAE_RUNTIME |
Il runtime specificato nel file app.yaml . |
GAE_SERVICE |
Il nome del servizio specificato nel file app.yaml . Se non viene specificato alcun nome del servizio, è impostato su default . |
GAE_VERSION |
L'etichetta della versione corrente del servizio. |
GOOGLE_CLOUD_PROJECT |
L'ID progetto Google Cloud associato alla tua applicazione. |
PORT |
La porta che riceve le richieste HTTP. |
Puoi definire variabili di ambiente aggiuntive nel file app.yaml
, ma i valori precedenti non possono essere sostituiti.