
Olá Habr!
O discurso de Sebastian Dashner em um encontro em Java no escritório da IBM em Moscou (encontrou um
registro de desempenho semelhante) me levou a começar a conhecer meus servidores de aplicativos leves, em particular o OpenLiberty. E então eu pensei:
- Quais são os benefícios de um servidor de aplicativos leve?
- Como a especificidade do trabalho muda ao usá-los?
- Por que empacotar um servidor de aplicativos em um contêiner?
Respondendo a essas perguntas, notei que há pouca informação pública sobre esse tópico, então decidi coletá-las e sistematizá-las aqui.
Eu posto os resultados sob o corte.
Quais são os benefícios de um servidor de aplicativos leve?
Anteriormente, os servidores de aplicativos Java EE corporativos (como JBoss AS, Oracle WebLogic e IBM WebSphere AS) eram considerados um design pesado e pesado, especialmente quando falamos sobre tempos de inicialização e implantação. Mas a tecnologia em nuvem está capturando uma parte cada vez maior do setor e os requisitos do servidor de aplicativos estão mudando.
E agora, no lugar de servidores de aplicativos corporativos completos, vêm servidores de aplicativos pequenos, rápidos e modulares, focados em uma tarefa específica:
Thorntail ,
Payara Micro - os irmãos mais novos WildFly e Payara;
O Meecrowave é um servidor JAX-RS + CDI + JSON
leve , o
KumuluzEE é um servidor que permite estender o Java EE usando Node.js, Go e outros.
Esta lista também inclui o OpenLiberty - um servidor de aplicativos de código aberto (distribuído de acordo com EPL-1.0) que suporta os mais recentes padrões Java EE / Microprofile, nos quais o WebSphere Liberty é executado.
Resumo dos Recursos do EPL-1.0 (Licença Pública Eclipse Versão 1.0)O EPL 1.0 é baseado na CPL e não é compatível com a GPL, permite que você cumpra outras licenças e patentes usadas no trabalho e fornece o direito de licenciar o produto sob qualquer outra licença, uma cópia da licença deve ser incluída em todas as cópias do programa.
As adições ao produto principal podem ser licenciadas separadamente e até sob uma licença comercial. No entanto, alterações e adições que são trabalhos derivados devem ser licenciadas sob a mesma licença EPL, o que exige que você abra o código-fonte.
A associação de um projeto de software ao código protegido pela licença EPL (por exemplo, usando esse código como uma biblioteca), em geral, não torna este projeto um trabalho derivado e não impõe obrigações correspondentes.
Um Membro que inclua o Programa em uma cotação deve fazê-lo para evitar uma possível responsabilidade por outros Membros. (renuncia expressamente a qualquer garantia ou responsabilidade em nome de todos os autores)
Por exemplo: Um participante pode incluir o Programa em uma cotação, produto X. Então, esse participante é um participante Comercial. Se este comerciante fizer reivindicações sobre velocidade ou oferecer garantias de produto para X, essas reivindicações e ofertas são de responsabilidade pessoal do comerciante. Sob esta seção, o Membro Comercial deve proteger outros Membros de reclamações relacionadas a desempenho e garantias, e se o tribunal exigir que qualquer outro Membro pague qualquer dano resultante, o Membro Comercial deverá pagar essas perdas.
Vamos ver quais benefícios podemos obter ao implantar o aplicativo em um contêiner com o OpenLiberty. (Você deve ter qualquer versão do java instalada, etapas adicionais devem ser executadas enquanto estiver no diretório wlp)
Velocidade:
A velocidade é o indicador mais importante para um aplicativo em nuvem, porque, para que um aplicativo em nuvem seja escalado, gerencie e lide rapidamente com a carga crescente, ele deve ser iniciado em segundos. Um servidor de aplicativos leve pode fazer isso. Para verificar, faça o
download do servidor OpenLiberty e execute bin / server run (
lista completa de comandos ):
$ bin/server run defaultServer (Open Liberty 19.0.0.6/wlp-1.0.29.cl190620190617-1530) Java HotSpot(TM) 64-Bit Server VM 1.8.0_212-b10 (ru_US) [AUDIT ] CWWKE0001I: defaultServer . [AUDIT ] CWWKZ0058I: dropins . [AUDIT ] CWWKF0012I: : [el-3.0, jsp-2.3, servlet-3.1]. [AUDIT ] CWWKF0011I: defaultServer . defaultServer 1,709 .
Modularidade e flexibilidade
A maioria dos aplicativos não precisa do Java EE como um todo, mas requer um conjunto dedicado de padrões, usado com mais freqüência em aplicativos corporativos. Graças à OSGI, podemos escolher o conjunto de padrões Java EE e / ou MicroProfile que precisamos, ignorando todo o resto.
Por exemplo, declare JAX-RS do Java EE e mpHealth do Microprofile adicionando algumas linhas ao featureManager bloqueie usr / servers /
serverName /
serverName /server.xml
<?xml version="1.0" encoding="UTF-8"?> <server description="new server"> <!-- Enable features --> <featureManager> <feature>jsp-2.3</feature> <feature>mpHealth-1.0</feature> <feature>jaxrs-2.1</feature> </featureManager> <!-- To access this server from a remote client add a host attribute to the following element, eg host="*" --> <httpEndpoint id="defaultHttpEndpoint" httpPort="9080" httpsPort="9443" /> <!-- Automatically expand WAR files and EAR files --> <applicationManager autoExpand="true"/> </server>
Atualização dinâmica
Durante o desenvolvimento, o código e a configuração do programa mudam constantemente.
O servidor de aplicativos está configurado para monitorar alterações e, se necessário, reconfigura e implanta o aplicativo rapidamente. Por exemplo, uma reação a mudanças recentes:
[AUDIT ] CWWKG0016I: . [AUDIT ] CWWKG0017I: 0,475 . [AUDIT ] CWWKF0012I: : [cdi-2.0, jaxrs-2.1, jaxrsClient-2.1, jndi-1.0, json-1.0, jsonp-1.1, mpHealth-1.0, servlet-4.0]. [AUDIT ] CWWKF0013I: : [servlet-3.1]. [AUDIT ] CWWKF0008I: 0,476 .
Tamanho e montagem da imagem
Os tamanhos dos servidores de aplicativos diminuíram significativamente e agora permitem implantar
cada aplicativo em um servidor de aplicativos separado para embalá-los em contêineres, oferecendo a maior flexibilidade. Além disso, desde a imagem consiste em camadas, ao remontar e distribuir artefatos, apenas a camada do aplicativo é copiada, o SO, o tempo de execução e o servidor de aplicativos são armazenados em cache.
O Dockerhub possui imagens pré-construídas que contêm um servidor OpenLiberty pré-configurado. Usaremos um deles e criaremos um Dockerfile:
FROM open-liberty COPY usr/servers/defaultServer /opt/ol/wlp/usr/servers/defaultServer ENTRYPOINT ["/opt/ol/wlp/bin/server", "run"] CMD ["defaultServer"]
Vamos montar a imagem:
docker build -t app .
Execute-o como um contêiner:
docker run -d --name app -p 9080:9080 app
Verifique o resultado
http: // localhost: 9080 / health /
Para parar o contêiner:
docker stop app
Existem muitos outros cenários para o uso do contêiner e, em geral, esta é uma ocasião para artigos individuais, portanto, voltemos às perguntas.
Como a especificidade do trabalho está mudando?
Pacote
A imagem do contêiner deve ser coletada apenas uma vez e, em seguida, executada em todos os ambientes. Portanto, é recomendável coletar cada aplicativo junto com o servidor de aplicativos. Isso simplifica o ciclo de vida e a implantação de aplicativos e se encaixa perfeitamente no mundo moderno da tecnologia de contêineres.
Assembléia
Agora não é mais necessário agrupar blocos técnicos diferentes em arquivos separados. Toda a lógica de negócios, juntamente com serviços da Web e funcionalidade de ponta a ponta, é compactada em um único arquivo de guerra. Isso simplifica bastante a instalação do projeto, bem como o procedimento de montagem. Você não precisa mais compactar o aplicativo em vários níveis hierárquicos e descompactá-lo novamente em uma instância do servidor.
Lançamento
O servidor de aplicativos e o próprio aplicativo são adicionados à imagem durante o processo de construção. A configuração potencial de fontes de dados, unidades ou módulos de servidor também é especificada durante o processo de construção, adicionando arquivos de configuração especializados. Todas as diferenças na configuração devem ser gerenciadas não de dentro do aplicativo, mas de fora. Portanto, o aplicativo não deve ser implantado em um contêiner já em execução, mas deve ser adicionado a ele no estágio de montagem da imagem no diretório de implantação automática para iniciá-lo quando o contêiner for iniciado.
Extensão de funcionalidade
Contêineres, sistemas de implantação e dimensionamento, serviços de monitoramento e grades de serviço nos deram a oportunidade de configurar a detecção, o monitoramento, o gerenciamento, a autenticação, o dimensionamento, o rastreamento, a estabilidade no topo do aplicativo, transferindo de forma transparente uma grande quantidade de lógica para outro nível, facilitando o aplicativo e simplificando seu desenvolvimento.
Por que empacotar um servidor de aplicativos em um contêiner?
Primeiro, ao empacotar um servidor de aplicativos em um contêiner, você oferece a cada equipe a oportunidade de configurar independentemente seu servidor de aplicativos e se concentrar na implementação de funções, economizando tempo dos desenvolvedores em operações manuais, middleware e várias aprovações.
Como bônus, você tem a oportunidade de desfrutar plenamente dos benefícios dos contêineres e de todas as ferramentas criadas em torno deles. O aplicativo é fácil de gerenciar e dimensionar, atualizar e automatizar a montagem e a implantação de artefatos com tempo de inatividade zero.
Você encontrará mais prática aqui.Além da
documentação , o site do projeto possui um grande número de tutoriais: como criar aplicativos da web com maven / gradle, empacotar e implantar aplicativos, implantar e configurar microsserviços no kubernetes, gerenciar o tráfego com istio e implantar no
IBM Cloud de outros provedores de nuvem populares e muito mais
Sebastian Dashner (entusiasta de Java e OSS, Java Champion, IBMer, membro do JCP, colaborador do Jakarta EE) publica artigos úteis sobre como usar o OpenLiberty, como
monitorar o Open Liberty com Prometheus e Grafana , em seu
blog e em seu livro
Architecting Modern Java Aplicações EE foram usadas na preparação deste artigo.
O Liberty-maven-plugin (alternativa ao
gradle ) pode simplificar bastante o seu trabalho. A propósito, os manuais têm bons exemplos de seu uso.
Você também pode contribuir para o
projeto .