2014-04-15 8 views
14

Sto notando un sacco di progetti (DropWizard, Grails, ecc.) Che iniziano ad abbracciare la nozione di un JAR "grasso" (utilizzando un server Web incorporato come Jetty o Tomcat) rispetto alla tradizionale distribuzione di WAR. Entrambi i metodi implicano un singolo processo JVM (ad esempio, indipendentemente dal numero di WAR distribuiti su Tomcat, è lo stesso processo JVM).Distribuire WAR o "JAR grasso"?

In quali circostanze è preferibile l'altro metodo di implementazione rispetto all'altro?

+0

I WAR-to-Tomcat tradizionali vanno bene per le app interne (utilizzate da utenti interni/dipendenti) che in realtà non hanno esigenze di gestione di ridimensionamento/configurazione. Nel momento in cui hai un componente (app web o REST, ecc.) Che deve essere pubblico, devi ridimensionare quel componente alla sua velocità e devi (beh, * dovrebbe *) automatizzare la configurazione dei nodi quel componente sopravvive (vedi Ansible/Chef/Puppet/Salt/etc.).Scalabilità e automazione CM sono quasi impossibili da realizzare su nodi eterogenei che contengono diverse combinazioni di file WAR ... – smeeb

+0

... ad esempio: se si hanno 10 nodi Tomcat e 30 file WAR (che rappresentano 30 diversi componenti), allora per ottenere CM automatizzati è necessario definire * tipi * di nodi (nodo DB, nodo app, nodo Microservice, nodo cache, ecc.) e distribuire lo stesso sottoinsieme dei 30 componenti per ogni tipo di nodo. Ma poi avrai problemi di ridimensionamento, perché inevitabilmente i componenti condivisi su ciascuna istanza di Tomcat avranno requisiti di ridimensionamento diversi. Quindi si riduce a: cosa stai distribuendo e quali sono i suoi requisiti? – smeeb

+0

Componenteria interna va bene come WAR-to-Tomcat. La componentistica della scala Web ha bisogno di omogeneità, e questo può essere solo ** pulito ** compiuto con questi cosiddetti JAR grassi. – smeeb

risposta

11

Ecco alcuni motivi:

A favore di JAR:

  1. Semplice da costruire e distribuire.
  2. I server integrati come Jetty sono facili da utilizzare.
  3. Le applicazioni sono facili da avviare per gli utenti e possono essere eseguite anche sui loro personal computer, perché sono leggere.
  4. L'avvio e l'arresto di applicazioni richiedono meno conoscenze rispetto alla gestione dei server Web.

per la guerra o l'orecchio:

  1. Il server fornirà funzionalità come l'implementazione, il riavvio, la sicurezza e così via per più applicazioni web contemporaneamente.
  2. Forse un team di distribuzione separato può gestire l'avvio e l'arresto delle app.
  3. Se i supervisori amano seguire le regole, saranno felici di scoprire che non li infrangono.

Detto questo, è sempre possibile fornire 2 o 3 tipi di eseguibili per soddisfare tutte le esigenze. Qualsiasi strumento di costruzione rende tutto questo facile.

5

La distribuzione di un'applicazione con un server Web incorporato consente l'installazione standalone e l'esecuzione semplicemente chiamando java -jar application.jar.

Tuttavia, potrebbero esserci utenti che desiderano controllare il server Web utilizzato o che desiderano distribuire più applicazioni in un singolo server web (ad es. Per evitare conflitti di porte soprattutto con le porte 80 e 8080). In tal caso un vaso "grasso" potrebbe causare problemi o almeno un codice non necessario e quindi un ingombro di memoria maggiore.

IMHO l'approccio migliore per questi due casi sarebbe quello di fornire due artefatti: un jar "grasso" per l'installazione autonoma (più semplice) e un war/ear di sola applicazione per coloro che desiderano distribuire l'applicazione nel proprio contenitore .

3

Sto pensando alla prospettiva dell'utente. È possibile avvolgere questo jar contenente un solo sé all'interno di un file .exe o .dmg e installarlo senza la necessità di avere istruzioni aggiuntive su come distribuire. Inoltre, dal momento che si sta facendo la distribuire solo per un determinato server, si potrebbe approfittare di quel particolare server