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.