Conselhos sobre como implantar arquivos war vs jar executável com contêiner integrado

89

Parece haver uma tendência atual no espaço java de deixar de implantar aplicativos da web java para um recipiente de servlet java (ou servidor de aplicativos) na forma de um arquivo war (ou arquivo ear) e, em vez disso, empacotar o aplicativo como um jar executável com um servidor servlet / HTTP embutido como jetty. E quero dizer isso mais na forma como os novos frameworks estão influenciando como novos aplicativos são desenvolvidos e implantados, em vez de como os aplicativos são entregues aos usuários finais (porque, por exemplo, eu entendo por que o Jenkins usa um contêiner integrado, muito fácil de pegar e usar ) Exemplos de estruturas que adotam a opção jar executável: Dropwizard , Spring Boot e Play (bem, não é executado em um contêiner de servlet, mas o servidor HTTP está embutido).

Minha pergunta é, vindo de um ambiente onde implantamos nossos (até este ponto principalmente Struts2) aplicativos em um único servidor de aplicativos tomcat, quais mudanças, melhores práticas ou considerações precisam ser feitas se planejamos usar uma abordagem de contêiner integrado ? Atualmente, temos cerca de 10 aplicativos criados internamente em execução em um único servidor Tomcat e, para esses aplicativos pequenos, a capacidade de compartilhar recursos e ser gerenciados em um servidor é ótima. Nossos aplicativos não se destinam a ser distribuídos aos usuários finais para serem executados em seus ambientes. No entanto, no futuro, se decidirmos aproveitar uma estrutura Java mais recente, essa abordagem deve mudar? A mudança para jars executáveis ​​é estimulada pelo uso crescente de implantações em nuvem (por exemplo, Heroku)?

Se você já teve experiência no gerenciamento de vários aplicativos no estilo Play de implantação versus implantação de arquivo war tradicional em um único servidor de aplicativos, compartilhe sua visão.

Brice Roncace
fonte

Respostas:

82

Uma pergunta interessante. Esta é apenas a minha opinião sobre o assunto, então leve tudo com cautela. Ocasionalmente, implantei e gerenciei aplicativos usando contêineres de servlet e servidores integrados. Tenho certeza de que ainda há muitos bons motivos para usar contêineres de servlet, mas tentarei me concentrar apenas em por que eles são menos populares hoje.

Versão curta: os contêineres de servlet são ótimos para gerenciar vários aplicativos em um único host, mas não parecem muito úteis para gerenciar apenas um único aplicativo. Com ambientes de nuvem, um único aplicativo por máquina virtual parece preferível e mais comum. Estruturas modernas querem ser compatíveis com a nuvem, portanto, a mudança para servidores incorporados.


Portanto, acho que os serviços em nuvem são o principal motivo para abandonar os contêineres de servlet. Assim como os contêineres de servlet permitem que você gerencie aplicativos, os serviços em nuvem permitem que você gerencie máquinas virtuais, instâncias, armazenamento de dados e muito mais. Isso parece mais complicado, mas com ambientes de nuvem, houve uma mudança para máquinas de aplicativos únicos. Isso significa que muitas vezes você pode tratar a máquina inteira como se fosse o aplicativo. Cada aplicativo é executado em uma máquina com tamanho apropriado. As instâncias de nuvem podem aparecer e desaparecer a qualquer momento, o que é ótimo para escalonamento. Se um aplicativo precisa de mais recursos, você cria mais instâncias.

Os servidores dedicados, por outro lado, geralmente são poderosos, mas com um tamanho fixo, portanto, você executa vários aplicativos em uma única máquina para maximizar o uso dos recursos. Gerenciar dezenas de aplicativos - cada um com suas próprias configurações, servidores web, rotas e conexões etc. - não é divertido, portanto, usar um contêiner de servlet ajuda você a manter tudo gerenciável e você mesmo são. É mais difícil de escalar. Os contêineres de servlet na nuvem não parecem muito úteis. Eles teriam que ser configurados para cada pequena instância, sem fornecer muito valor, uma vez que gerenciam apenas um único aplicativo.

Além disso, as nuvens são legais e o que não é nuvem é enfadonho (se ainda acreditarmos no hype). Muitos frameworks tentam ser escalonáveis ​​por padrão, para que possam ser facilmente implantados nas nuvens. Os servidores incorporados são rápidos de implantar e executar, por isso parecem uma solução razoável. Os contêineres de servlet geralmente ainda são suportados, mas exigem uma configuração mais complicada.

Alguns outros pontos:

  • O servidor embutido poderia ser otimizado para a estrutura ou está melhor integrado com as ferramentas da estrutura (como o console de jogo, por exemplo).
  • Nem todos os ambientes de nuvem vêm com imagens de máquina personalizáveis. Em vez de escrever scripts de inicialização para baixar e configurar contêineres de servlet, usar software dedicado para implementações de aplicativos em nuvem é muito mais simples.
  • Ainda não encontrei uma configuração do Tomcat que não o receba com um erro de espaço permanente cada poucas reimplantações do seu aplicativo. Demorar um pouco mais para (re) iniciar servidores incorporados não é problema quando você pode alternar quase que instantaneamente entre as instâncias de teste e produção sem qualquer tempo de inatividade.
  • Conforme já mencionado na pergunta, é muito conveniente para o usuário final apenas executar o aplicativo.
  • Os servidores integrados são portáteis e convenientes para o desenvolvimento. Hoje tudo é rápido , protótipos e MVPs precisam ser criados e entregues o mais rápido possível. Ninguém quer gastar muito tempo configurando um ambiente para cada desenvolvedor.
Kapex
fonte
1
Obrigado por responder, você fez alguns pontos positivos. A nuvem é o fator determinante! Em nossa situação, eu me sentiria mais confortável possuindo um servidor em nuvem como o modelo Amazon Web Services (Infraestrutura como Serviço) em vez de implantar apenas o aplicativo como Google App Engine (Plataforma como Serviço), mas suponho que seja a velha escola de pensamento. Portanto, a conclusão: a menos que planejemos alavancar a nuvem em uma plataforma como forma de serviço, as implantações de guerra são o caminho a percorrer, em vez de gerenciar vários aplicativos da web Java autônomos em um único servidor. Obrigado novamente por sua contribuição.
Brice Roncace
3
Apenas 2cc: você pode executar vários aplicativos jar em uma única máquina com algum servidor HTTP leve como proxy, ou seja: nginx, pode ser usado adicionalmente para o tráfego da web típico, como CDN personalizado, balanceador de carga, firewall, etc. Portanto, é razoável considerar usá-lo ao planejar um grande tráfego (tem melhor desempenho e, em seguida, manipula todas as solicitações - mesmo para recursos estáticos por meio de seu aplicativo principal).
biesior