Con App Engine, puoi creare applicazioni web che utilizzano l'infrastruttura e i servizi scalabili di Google. App Engine esegue l'applicazione web utilizzando una JVM Java 8. App Engine richiama le classi servlet della tua app per gestire le richieste e preparare le risposte in questo ambiente.
La piattaforma App Engine fornisce molti servizi API integrati che il tuo codice può chiamare. La tua applicazione può anche configurare attività pianificate che vengono 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 in Google Cloud CLI in
platform/google_appengine/google/appengine/tools/java/lib/impl/appengine-api.jar
rappresenta l'API App Engine per Java. Puoi accedere a questo file anche utilizzando il repository Maven, che elenca tutte le versioni.
Seleziona la versione dell'API utilizzata dalla tua applicazione includendo questo file JAR nella directory WEB-INF/lib/ dell'applicazione oppure utilizza 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'ultima API App Engine
(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 a un'applicazione di interferire con un'altra. Un'app App Engine non deve rispondere lentamente. Una richiesta web a un'applicazione deve essere gestita 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 consumeranno la memoria allocata alla tua istanza. I file
memorizzati in questa posizione sono disponibili solo per questa istanza e solo per la
durata di questa istanza specifica.
Il modo consueto per ottenere i file di risorse per la tua applicazione è quello di comprimere i file
su cui si basa la tua applicazione in WEB-INF, quindi caricarli dall'app
utilizzando Class.getResource(), ServletContext.getResource() o metodi simili.
Per impostazione predefinita, tutti i file nel WAR sono "file di risorse". Puoi escludere i file da questo set utilizzando il file appengine-web.xml.
Ordine dei file JAR del caricatore di classi
A volte potrebbe essere necessario ridefinire l'ordine in cui i file JAR vengono
scansionati per le classi per 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" viene inserito come primo file JAR in cui cercare le classi,
ad eccezione di quelle nella directory war/WEB-INF/classes/.
Se vengono assegnate priorità a più file JAR, verrà utilizzato l'ordine di caricamento originale (rispetto
l'uno all'altro). In altre parole, l'ordine degli elementi
<priority-specifier> non è importante.
Threads
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 farlo da un thread di richiesta o da un thread creato utilizzando
l'API ThreadManager.
Un'applicazione può
- Implementa
java.lang.Runnable. - Crea una factory di thread chiamando
com.google.appengine.api.ThreadManager.currentRequestThreadFactory(). - Chiama il metodo
newRequestThreaddella factory, passandoRunnable,newRequestThread(runnable)o utilizza l'oggetto factory restituito dacom.google.appengine.api.ThreadManager.currentRequestThreadFactory()con unExecutorService(ad es. chiamaExecutors.newCachedThreadPool(factory)).
Se crei un ThreadPoolExecutor con currentRequestThreadFactory(), allora
shutdown()
deve essere chiamato esplicitamente prima che la richiesta servlet venga completata. In caso contrario,
la richiesta non verrà completata e il server dell'app alla fine non funzionerà.
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 API App Engine simultanee.
Quando utilizzi i thread, utilizza oggetti di concorrenza di alto livello, come Executor e Runnable. Questi si occupano di molti dettagli sottili ma
importanti della concorrenza, come
interruzioni
e pianificazione e
contabilità.
Strumenti
IDE supportati
Cloud Tools for IntelliJ ti consente di eseguire ed eseguire il debug delle applicazioni App Engine all'interno di IntelliJ IDEA. Puoi eseguire il deployment dei tuoi progetti App Engine in produzione senza uscire dall'IDE.
Strumenti di compilazione supportati
Per velocizzare il processo di sviluppo, puoi utilizzare i plug-in App Engine per Apache Maven o Gradle:
Server di sviluppo locale
Il server di sviluppo esegue l'applicazione sul computer locale per lo sviluppo e il test. Il server simula i servizi Datastore. Il server di sviluppo può anche generare la configurazione per gli indici Datastore in base alle query eseguite dall'app durante il test.
Concorrenza e latenza
La latenza della tua applicazione ha il maggiore impatto sul numero di istanze necessarie per gestire il traffico. Se elabori le richieste rapidamente, una singola istanza può gestirne molte.
Le istanze single-thread possono gestire una richiesta in parallelo. Pertanto, esiste una relazione diretta tra la latenza e il numero di richieste che possono essere gestite sull'istanza al secondo. Ad esempio, una latenza di 10 ms equivale a 100 richieste/secondo/istanza.Le istanze multithread possono gestire molte richieste simultanee. Pertanto, esiste una relazione diretta tra la CPU consumata e il numero di richieste al secondo.
Le app Java supportano richieste simultanee, quindi una singola istanza può gestire nuove richieste mentre attende il completamento di altre richieste. La concorrenza riduce significativamente il numero di istanze richieste dalla tua app, ma devi progettare l'app per il multithreading.
Ad esempio, se un'istanza B4 (circa 2,4 GHz) consuma 10 Mcycles/richiesta, puoi elaborare 240 richieste/secondo/istanza. Se consuma 100 Mcycles/richiesta, puoi elaborare 24 richieste/secondo/istanza. Questi numeri rappresentano lo scenario ideale, ma sono abbastanza realistici in termini di ciò che puoi ottenere su un'istanza.
Release di Java per 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 compilazioned interno. Per maggiori dettagli, consulta il
repository GitHub.
Variabili di ambiente
Le seguenti variabili di ambiente vengono impostate dal runtime:
| Variabile di ambiente | Descrizione |
|---|---|
GAE_APPLICATION
|
L'ID della tua applicazione App Engine. Questo ID ha il prefisso "region code~", ad esempio "e~" per le applicazioni di cui è stato eseguito il deployment in Europa. |
GAE_DEPLOYMENT_ID |
L'ID del deployment corrente. |
GAE_ENV |
L'ambiente App Engine. Imposta su standard. |
GAE_INSTANCE |
L'ID dell'istanza su cui è attualmente in esecuzione il servizio. |
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, viene impostato su default. |
GAE_VERSION |
L'etichetta della versione attuale 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 riportati sopra non possono essere sostituiti.