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.
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:
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:
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
{ "id":"/webapp", "aplicativos":[ { "id":"banco de dados", "cpus":4, "mem":4096, "instâncias":1, "contêiner":{ "tipo":"DOCKER", "docker":{ "imagem":"arungupta/couchbase:travel", "rede":"USUÁRIO" } }, "ipAddress":{ "networkName":"dcos" } }, { "id":"web", "dependencies" (dependências):[ "/webapp/database" ], "cpus":2, "mem":4096, "instâncias":1, "contêiner":{ "tipo":"DOCKER", "docker":{ "imagem":"arungupta/wildfly-couchbase-javaee:travel", "rede":"USUÁRIO", "portMappings":[ { "hostPort":0, "containerPort":8080, "protocolo":"tcp" } ] } }, "ipAddress":{ "networkName":"dcos" }, "env":{ "COUCHBASE_URI":"database-webapp.marathon.containerip.dcos.thisdcos.directory" }, "rótulos":{ "HAPROXY_0_VHOST":"DCOS-PublicSlaveLo-DD2EGGFVCJA0-1604955948.us-west-1.elb.amazonaws.com", "HAPROXY_GROUP":"externo" } } ] } |
Quais são os principais pontos dessa definição de aplicativo?
- O aplicativo tem dois contêineres:
banco de dados
eweb
. O contêiner da Web tem uma dependência do contêiner do banco de dados definido usandodependências
atributo. banco de dados
usos de contêineresarungupta/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êineresarungupta/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 usaCOUCHBASE_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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<plugin> <groupId>dcos</groupId> <artifactId>dcos-maven-plugin</artifactId> <version>0.2</version> <configuration> <dcosUrl>http://DCOS-ElasticLoadBa-1TH4TXIU5P783-1163025470.us-west-1.elb.amazonaws.com/</dcosUrl> <deployable>grupo</deployable> <ignoreSslCertificate>verdadeiro</ignoreSslCertificate> </configuration> <executions> <execution> <id>dcos:deploy</id> <phase>instalar</phase> <goals> <goal>implantação</goal> </goals> </execution> </executions> </plugin> |
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:
1 |
mvn instalar |
O seguinte resultado é exibido:
1 2 3 4 5 6 7 8 |
[INFORMAÇÕES] --- dcos-mentor-plug-in:0.2:implantação (dcos:implantação) @ dcos-java-banco de dados --- [INFORMAÇÕES] Sobre para executar DC/SO implantação [INFORMAÇÕES] aplicativo definição: /Usuários/arungupta/espaços de trabalho/dcos-java-banco de dados/aplicativo-definição.json [INFORMAÇÕES] dcos token: /Usuários/arungupta/espaços de trabalho/dcos-java-banco de dados/.dcos-token [INFORMAÇÕES] dcos url: http://DCOS-ElasticLoadBa-1TH4TXIU5P783-1163025470.us-west-1.elb.amazonaws.com/ [INFORMAÇÕES] ignorar ssl certificado: verdadeiro [INFORMAÇÕES] implementável: grupo [INFORMAÇÕES] Resposta de DC/SO [200] {"versão":"2017-03-07T13:27:49.970Z","deploymentId":"dbc80f96-28cb-4040-8d0d-78452e461ec1"} |
Aqui estão alguns dos resultados atualizados do console do DC/OS.
Primeira guia Services atualizada:
Dois aplicativos no serviço:
O aplicativo de banco de dados tem uma tarefa:
Status da tarefa do banco de dados:
Registros da tarefa do banco de dados:
Ele mostra a saída da API REST do Couchbase para configurar o servidor.
Status da tarefa na Web:
Registros de tarefas da Web:
Isso mostra que o aplicativo Java EE foi implantado com êxito.
Acesse o aplicativo:
1 |
enrolar http://DCOS-PublicSlaveLo-DD2EGGFVCJA0-1604955948.us-west-1.elb.amazonaws.com/airlines/resources/airline |
O endereço é o valor da chave ${PublicSlaveDnsAddress}
da saída do CloudFormation. Uma saída formatada, por exemplo, com jqparece:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
[ { "amostra de viagem": { "país": "Estados Unidos", "iata": "Q5", "indicativo": "MILE-AIR", "name" (nome): "40 milhas aéreas", "icao": "MLA", "id": 10, "tipo": "companhia aérea" } }, { "amostra de viagem": { "país": "Estados Unidos", . . . "icao": "RLA", "id": 1203, "tipo": "companhia aérea" } } ] |
É 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:
- Documentos do DC/OS
- Couchbase em contêineres
- Couchbase Portal do desenvolvedor
- Faça perguntas sobre Fóruns do Couchbase ou Estouro de pilha
- Baixar Couchbase
[...] Fonte: http://www.couchbase.com/service-discovery-java-database-dcos/ […]
[...] 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. [...]
[...] 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. [...]
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