Este blog mostrará como um aplicativo Java simples pode se comunicar com um banco de dados ou banco de dados como serviço (DBaaS) usando a descoberta de serviços no DC/OS.

DC/OS logo

Por que o Service Discovery?

Um aplicativo geralmente consiste em vários componentes, como um servidor de aplicativos, um banco de dados, um servidor da Web, um servidor de cache e um servidor de mensagens. Normalmente, várias réplicas de cada componente seriam executadas com base nas necessidades de seu aplicativo. A implantação desse aplicativo usando uma estrutura de orquestração de contêineres significa que cada réplica seria executada como um contêiner. Portanto, um aplicativo é normalmente implantado como um aplicativo com vários contêineres.

Cada contêiner recebe um endereço IP exclusivo durante sua vida útil. Mas os contêineres são efêmeros e podem ser encerrados e reprogramados em um host diferente pela estrutura de orquestração. Nesse caso, um contêiner normalmente recebe um endereço IP diferente. Isso significa que um aplicativo implantado no servidor de aplicativos não pode confiar no endereço IP do banco de dados. É nesse ponto que a descoberta de serviços é necessária.

Portanto, várias réplicas de um componente recebem um nome lógico. Por exemplo, web para todos os contêineres do servidor de aplicativos e db para todos os contêineres de banco de dados. Agora, um aplicativo pode se comunicar com os contêineres de banco de dados usando o nome do serviço lógico. Isso permite que os contêineres de banco de dados sejam reprogramados em qualquer lugar do cluster e também sejam dimensionados dinamicamente para cima e para baixo.

Vamos ver como isso pode ser feito no DC/OS com uma única instância do servidor de aplicativos e do servidor de banco de dados. Este blog usará o WildFly como servidor de aplicativos e o Couchbase como banco de dados.

Cluster do Couchbase no Mesos com DC/OS fornecem mais detalhes sobre como configurar um Couchbase no DC/OS.

Este blog usará as seguintes etapas principais:

  • Configurar o cluster do DC/OS
  • Definição do aplicativo Marathon
  • Implantar o aplicativo

O código-fonte completo usado neste blog está em github.com/arun-gupta/dcos-java-database.

Muito obrigado a @unterstein por criar o plug-in Maven e me ajudar a entender o funcionamento interno do DC/OS.

Configurar o cluster do DC/OS

O cluster do DC/OS pode ser facilmente criado usando o Modelo do CloudFormation. Instruções detalhadas, incluindo requisitos do sistema, capturas de tela e configuração, estão disponíveis em Installing DC/OS on AWS.

A saída do CloudFormation tem a aparência mostrada:

DC/OS Cluster CloudFormation Output

Anote o valor mostrado para as teclas DnsAddress e PublicSlaveDnsAddress. O valor da primeira chave pode ser usado para acessar a GUI do DC/OS e tem a seguinte aparência:

DC/OS Cluster Console Default Output

Configure a CLI do DC/OS conforme explicado em CLI. Em resumo, são usados os seguintes comandos:

  • dcos config set core.dcos_url http://${DnsAddress} Substituir ${DnsAddress} com o valor correspondente da saída do CloudFormation.
  • login do dcos auth
  • dcos config show core.dcos_acs_token. Se ainda não tiver feito isso, clone o repositório de github.com/arun-gupta/dcos-java-database. Criar um novo arquivo.dcos-token e copie a saída do comando para esse arquivo.
  • dcos package install marathon-lb

Definição do aplicativo Marathon

A estrutura Marathon é usada para agendar contêineres no DC/OS. Um aplicativo de maratona pode ser definido fornecendo uma definição de aplicativo.

Conforme mencionado anteriormente, este blog mostrará como um aplicativo Java simples pode se comunicar com um banco de dados. Usaremos um aplicativo Java EE implantado no WildFly e usaremos o Couchbase como banco de dados. A definição do aplicativo tem a seguinte aparência:

Quais são os principais pontos dessa definição de aplicativo?

  • O aplicativo tem dois contêineres: banco de dados e web. O contêiner da Web tem uma dependência do contêiner do banco de dados definido usando dependências atributo.
  • banco de dados usos de contêineres arungupta/couchbase:travel Imagem do Docker. Essa imagem é criada a partir de github.com/arun-gupta/couchbase-javaee/tree/master/couchbase. Ele usa a imagem de base do Couchbase e usa API REST do Couchbase para pré-configurar o banco de dados. Um bucket de amostra também é carregado no banco de dados.
  • web usos de contêineres arungupta/wildfly-couchbase-javaee:travel imagem. Essa imagem é criada a partir de github.com/arun-gupta/couchbase-javaee/blob/master/Dockerfile. Este é um aplicativo Java EE 7 empacotado no WildFly. O aplicativo usa COUCHBASE_URI como uma variável de ambiente para se conectar ao banco de dados do Couchbase. O valor dessa variável de ambiente é configurado para usar a descoberta de serviço DNS e é derivado conforme explicado em Redes virtuais.

Certifique-se de alterar o valor de HAPROXY_0_VHOST para corresponder ao valor de ${PublicSlaveDnsAddress} da saída do CloudFormation. O rótulo HAPROXY_0_VHOST instrui o Marathon-LB a expor o contêiner do Docker, o servidor de aplicativos WildFly no nosso caso, no balanceador de carga externo com um host virtual. O 0 na chave do rótulo corresponde ao índice do servicePort, começando em 0. Se você tivesse várias definições de servicePort, você as iteraria como 0, 1, 2 e assim por diante. A implantação de um aplicativo com balanceamento de carga interno e externo com o marathon-lb fornece mais detalhes sobre como configurar o marathon-lb.

A descoberta de serviço e o balanceamento de carga fornecem mais detalhes sobre a descoberta de serviço e o balanceamento de carga no DC/OS.

Implantar o aplicativo usando o Maven

O aplicativo pode ser implantado usando dcos-maven-plugin.

O plug-in tem a mesma aparência:

Os principais pontos desse fragmento são:

  • A versão do plug-in é 0.2. Isso indica que o plug-in ainda está nos estágios iniciais de desenvolvimento.
  • dcosUrl é o valor de ${DnsAddress} da saída do CloudFormation. Esse endereço é usado para a implementação do aplicativo.
  • <deployable> permite diferentes tipos de implantação - aplicativo, grupo ou pods. Esse elemento é uma dica para o plug-in e provavelmente deverá desaparecer em uma versão futura, à medida que a API do Marathon se consolidar. Seguir #11 para obter mais detalhes.

Outros detalhes e configurações sobre o plug-in estão em dcos-maven-plugin.

Implemente o aplicativo:

O seguinte resultado é exibido:

Aqui estão alguns dos resultados atualizados do console do DC/OS.

Primeira guia Services atualizada:
DC/OS Cluster Web Application

Dois aplicativos no serviço:
DC/OS Cluster Web Application

O aplicativo de banco de dados tem uma tarefa:
DC/OS Cluster Web Application

Status da tarefa do banco de dados:Database Service Discovery

Registros da tarefa do banco de dados:
DC/OS Cluster Web Application

Ele mostra a saída da API REST do Couchbase para configurar o servidor.

Status da tarefa na Web:
DC/OS Cluster Web Application

Registros de tarefas da Web:
DC/OS Cluster WildFly Output

Isso mostra que o aplicativo Java EE foi implantado com êxito.

Acesse o aplicativo:

O endereço é o valor da chave ${PublicSlaveDnsAddress} da saída do CloudFormation. Uma saída formatada, por exemplo, com jqparece:

É isso aí!

Conforme mencionado anteriormente, o código-fonte completo usado neste blog está em github.com/arun-gupta/dcos-java-database.

Este blog mostrou como um aplicativo Java simples pode se comunicar com um banco de dados usando a descoberta de serviços no DC/OS.

Para obter mais informações, confira:

 

Autor

Postado por Arun Gupta, vice-presidente de defesa do desenvolvedor, Couchbase

Arun Gupta é o vice-presidente de defesa do desenvolvedor na Couchbase. Ele criou e liderou comunidades de desenvolvedores por mais de 10 anos na Sun, Oracle e Red Hat. Ele tem grande experiência na liderança de equipes multifuncionais para desenvolver e executar estratégias, planejamento e execução de conteúdo, campanhas de marketing e programas. Antes disso, liderou equipes de engenharia na Sun e é membro fundador da equipe Java EE. Gupta é autor de mais de 2.000 postagens em blogs sobre tecnologia. Ele tem uma vasta experiência em palestras em mais de 40 países sobre diversos tópicos e é um JavaOne Rock Star há três anos consecutivos. Gupta também fundou o capítulo Devoxx4Kids nos EUA e continua a promover a educação tecnológica entre as crianças. Autor de vários livros sobre tecnologia, corredor ávido, viajante do mundo inteiro, campeão de Java, líder de JUG, membro do NetBeans Dream Team e capitão do Docker, ele pode ser facilmente acessado em @arungupta.

4 Comentários

  1. [...] Service Discovery with Java and Database application in DC/OS explica por que a descoberta de serviços é um aspecto importante para um aplicativo de vários contêineres. Esse blog também explicou como isso pode ser feito no DC/OS. [...]

  2. [...] Service Discovery with Java and Database application in DC/OS explica por que a descoberta de serviços é um aspecto importante para um aplicativo de vários contêineres. Esse blog também explicou como isso pode ser feito no DC/OS. [...]

  3. Oi Arun.

    Perguntei-me por que não podemos simplesmente usar um balanceador de carga como o haproxy para fazer o registro do serviço. Ele publica um nome de serviço lógico que encaminharia a solicitação para um dos serviços disponíveis no cs/os. Por que tanta preocupação com o registro de serviços? Ele é dinâmico, dimensionável e transparente em termos de tecnologia.

    Atenciosamente, Alexander

Deixar uma resposta