Há muito material sobre microsserviços, basta pesquisar no Google! Fiz uma apresentação sobre a refatoração de monólitos para microsserviços na Devoxx Bélgica há alguns anos e ela recebeu boas críticas:
Este blog mostrará como o Docker simplifica a criação e o desligamento de um microsserviço. Todo o código usado neste blog está em github.com/arun-gupta/couchbase-javaee.
Definição de microsserviço usando o Compose
O Docker 1.13 introduziu um v3 do Docker Compose. As alterações na sintaxe são mínimas, mas a principal diferença é a adição de implantação atributo. Esse atributo permite especificar réplicas, atualização contínua e política de reinicialização para o contêiner. Nosso microsserviço iniciará um servidor de aplicativos WldFly com um aplicativo Java EE pré-implantado. Esse aplicativo se comunicará com um banco de dados Couchbase para CRUD os dados do aplicativo. Aqui está a definição do Compose:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
versão: '3' serviços: web: imagem: arungupta/couchbase-javaee:viagens ambiente: - COUCHBASE_URI=db portos: - 8080:8080 - 9990:9990 depende_de: - db db: imagem: arungupta/couchbase:viagens portos: - 8091:8091 - 8092:8092 - 8093:8093 - 11210:11210 |
Nesse arquivo Compose:
- Dois serviços nesse Compose são definidos pelo nome
db
eweb
atributos - Nome da imagem para cada serviço definido usando
imagem
atributo - O
arungupta/couchbase:travel
inicia o servidor Couchbase, configura-o usando API REST do Couchbasee cargasamostra de viagem
com cerca de 32 mil documentos JSON. - O
arungupta/couchbase-javaee:travel
inicia o WildFly e implanta o arquivo WAR do aplicativo criado a partir do https://github.com/arun-gupta/couchbase-javaee. Clone esse projeto se quiser criar sua própria imagem. meio ambiente
define variáveis de ambiente acessíveis pelo aplicativo implantado no WildFly.COUCHBASE_URI
refere-se ao serviço de banco de dados. Isso é usado no código do aplicativo, conforme mostrado em https://github.com/arun-gupta/couchbase-javaee/blob/master/src/main/java/org/couchbase/sample/javaee/Database.java.- O encaminhamento de portas é obtido usando
portos
atributo -
depende_de
no arquivo de definição Compose garante a ordem de inicialização do contêiner. Mas a inicialização no nível do aplicativo precisa ser garantida pelos aplicativos executados dentro do contêiner. No nosso caso, o WildFly é iniciado rapidamente, mas o banco de dados leva alguns segundos para ser iniciado. Isso significa que o aplicativo Java EE implantado no WildFly não é capaz de se comunicar com o banco de dados. Isso descreve uma prática recomendada ao criar aplicativos de microsserviços: você deve codificar de forma defensiva e garantir, na inicialização do aplicativo, que os microsserviços dos quais você depende tenham sido iniciados, sem pressupor a ordem de inicialização. Isso é mostrado no código de inicialização do banco de dados em https://github.com/arun-gupta/couchbase-javaee/blob/master/src/main/java/org/couchbase/sample/javaee/Database.java. Ele realiza as seguintes verificações:- A caçamba existe
- O serviço de consulta do Couchbase está ativo e em execução
- A caçamba de amostras está totalmente carregada
Esse aplicativo pode ser iniciado usando docker-compose up -d
em um único host. Ou um cluster de mecanismos do Docker em modo de enxame usando implantação de pilha de docas
comando.
Configuração do modo Docker Swarm
Inicialize o modo Swarm usando o seguinte comando:
1 |
doca enxame inicial |
informações da plataforma
comando:
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 55 56 57 58 59 60 61 62 63 64 65 66 |
Contêineres: 0 Em execução: 0 Em pausa: 0 Parado: 0 Imagens: 17 Servidor Versão: 1.13.0 Armazenamento Motorista: sobreposição2 Apoio Sistema de arquivos: extfs Suportes d_type: verdadeiro Nativo Sobreposição Difícil: verdadeiro Registro em log Motorista: json-arquivo Grupo C Motorista: cgroupfs Plugins: Volume: local Rede: ponte hospedeiro ipvlan macvlan nulo sobreposição Enxame: ativo NodeID: 92mydh0e09ba5hx3wtmcmvktz É Gerente: verdadeiro ID do cluster: v68ikyaff7rdxpaw1j0c9i60s Gerentes: 1 Nós: 1 Orquestração: Tarefa Histórico Retenção Limite: 5 Jangada: Instantâneo Intervalo: 10000 Número de Antiga Instantâneos para Retenção: 0 Batimento cardíaco Carrapato: 1 Eleição Carrapato: 3 Despachante: Batimento cardíaco Período: 5 segundos CA Configuração: Expiração Duração: 3 meses Nó Endereço: 192.168.65.2 Gerente Endereços: 192.168.65.2:2377 Tempos de execução: runc Padrão Tempo de execução: runc Init Binário: doca-inicial contêineres versão: 03e5862ec0d8d3b3f750e19fca3ee367e13c090e runc versão: 2f7393a47307a16f8cee44a37b262e8b81021e3e inicial versão: 949e6fa Segurança Opções: seccomp Perfil: padrão Kernel Versão: 4.9.5-moby Operacional Sistema: Alpino Linux v3.5 OSType: linux Arquitetura: x86_64 CPUs: 4 Total Memória: 1.952 GiB Nome: moby ID: SGCM:KDRD:G3M7:PZHN:J4RL:VFFR:G2SR:EKD5:JV4J:RL3X:LF7T:XF6V Docker Raiz Dir: /var/lib/doca Depurar Modo (cliente): falso Depurar Modo (servidor): verdadeiro Arquivo Descritores: 31 Rotinas: 124 Sistema Tempo: 2017-01-27T08:25:58.032295342Z Ouvintes de eventos: 1 Não Proxy: *.local, 169.254/16 Nome de usuário: arungupta Registro: https://index.docker.io/v1/ Experimental: verdadeiro Inseguro Registros: 127.0.0.0/8 Ao vivo Restaurar Ativado: falso |
Esse cluster tem um nó, que é o gerenciador. Como alternativa, um cluster de vários hosts pode ser facilmente configurado usando Docker para AWS.
Implantar microsserviço
O microsserviço pode ser iniciado como:
1 |
doca pilha implantação --compor-arquivo=doca-compor.yml aplicativo da web |
Isso mostra o resultado:
1 2 3 |
Criação de rede webapp_default Criação de serviço webapp_web Criação de serviço webapp_db |
Verifique se os serviços do WildFly e do Couchbase estão em execução usando serviço docker ls
:
1 2 3 |
ID NOME MODO RÉPLICAS IMAGEM a9pkiziw3vgw webapp_db replicado 1/1 arungupta/couchbase:viagens hr5s6ue54kwj webapp_web replicado 1/1 arungupta/couchbase-javaee:viagens |
Registros de serviço do docker -f webapp_web
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
webapp_web.1.wby0b04t7bap@moby | ========================================================================= webapp_web.1.wby0b04t7bap@moby | webapp_web.1.wby0b04t7bap@moby | JBoss Bootstrap Meio ambiente webapp_web.1.wby0b04t7bap@moby | webapp_web.1.wby0b04t7bap@moby | JBOSS_HOME: /optar/jboss/mosca selvagem webapp_web.1.wby0b04t7bap@moby | webapp_web.1.wby0b04t7bap@moby | JAVA: /usr/lib/jvm/java/caixa/java webapp_web.1.wby0b04t7bap@moby | webapp_web.1.wby0b04t7bap@moby | JAVA_OPTS: -servidor -Xms64m -Xmx512m -XX:MetaspaceSize=96M -XX:MaxMetaspaceSize=256m -Djava.rede.preferirIPv4Stack=verdadeiro -Djboss.módulos.sistema.pkgs=org.jboss.byteman -Djava.awt.sem cabeça=verdadeiro webapp_web.1.wby0b04t7bap@moby | webapp_web.1.wby0b04t7bap@moby | ========================================================================= . . . webapp_web.1.wby0b04t7bap@moby | 23:14:15,811 INFORMAÇÕES [org.jboss.como.servidor] (Serviço de servidor Tópico Piscina -- 34) WFLYSRV0010: Implementado "airlines.war" (tempo de execução-nome : "airlines.war") webapp_web.1.wby0b04t7bap@moby | 23:14:16,076 INFORMAÇÕES [org.jboss.como] (Controlador Bota Tópico) WFLYSRV0060: Http gerenciamento interface audição em http://127.0.0.1:9990/management webapp_web.1.wby0b04t7bap@moby | 23:14:16,077 INFORMAÇÕES [org.jboss.como] (Controlador Bota Tópico) WFLYSRV0051: Administrador console audição em http://127.0.0.1:9990 webapp_web.1.wby0b04t7bap@moby | 23:14:16,077 INFORMAÇÕES [org.jboss.como] (Controlador Bota Tópico) WFLYSRV0025: WildFly Completo 10.1.0.Final (WildFly Núcleo 2.2.0.Final) iniciado em 98623ms - Iniciado 443 de 691 serviços (404 serviços são preguiçoso, passivo ou em-demanda) |
Certifique-se de aguardar a exibição da última declaração de registro.
Microsserviço de acesso
Obter 10 companhias aéreas do microsserviço:
1 |
enrolar -v http://localhost:8080/airlines/resources/airline |
Isso mostra os resultados como:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
* Tentando ::1... * Conectado para localhost (::1) porto 8080 (#0) > OBTER /companhias aéreas/recursos/companhia aérea HTTP/1.1 > Anfitrião: localhost:8080 > Usuário-Agente: enrolar/7.43.0 > Aceitar: */* > < HTTP/1.1 200 OK < Conexão: manter-vivo < X-Alimentado-Por: Undertow/1 < Servidor: WildFly/10 < Conteúdo-Tipo: aplicativo/octeto-fluxo < Conteúdo-Comprimento: 1402 < Data: Sex, 03 fevereiro 2017 17:02:45 GMT < * Conexão #0 para o host localhost permaneceu intacto [{"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","iata":"TQ","indicativo":"TXW","name" (nome):"Texas Wings" (Asas do Texas),"icao":"TXW","id":10123,"tipo":"companhia aérea"}}, {"amostra de viagem":{"país":"Estados Unidos","iata":"A1","indicativo":"atifly","name" (nome):"Atifly","icao":"A1F","id":10226,"tipo":"companhia aérea"}}, {"amostra de viagem":{"país":"Reino Unido","iata":nulo,"indicativo":nulo,"name" (nome):"Jc royal.britannica","icao":"JRB","id":10642,"tipo":"companhia aérea"}}, {"amostra de viagem":{"país":"Estados Unidos","iata":"ZQ","indicativo":"LOCAIR","name" (nome):"Locair","icao":"LOC","id":10748,"tipo":"companhia aérea"}}, {"amostra de viagem":{"país":"Estados Unidos","iata":"K5","indicativo":"SASQUATCH","name" (nome):"SeaPort Airlines","icao":"SQH","id":10765,"tipo":"companhia aérea"}}, {"amostra de viagem":{"país":"Estados Unidos","iata":"KO","indicativo":"ACE AIR","name" (nome):"Alaska Central Express","icao":"AER","id":109,"tipo":"companhia aérea"}}, {"amostra de viagem":{"país":"Reino Unido","iata":"5W","indicativo":"FLYSTAR","name" (nome):"Astraeus","icao":"AEU","id":112,"tipo":"companhia aérea"}}, {"amostra de viagem":{"país":"França","iata":"UU","indicativo":"REUNIÃO","name" (nome):"Air Austral","icao":"REU","id":1191,"tipo":"companhia aérea"}}, {"amostra de viagem":{"país":"França","iata":"A5","indicativo":"AIRLINAIR","name" (nome):"Airlinair","icao":"RLA","id":1203,"tipo":"companhia aérea"}}] |
Workshop Docker para desenvolvedores Java é um laboratório prático e individualizado que permite que você comece a usar o Docker com facilidade. Obtenha um único recurso:
1 |
enrolar -v http://localhost:8080/airlines/resources/airline/137 |
Criar um novo recurso:
1 |
enrolar -v -H "Content-Type: application/json" -X POST -d '{"país":"França","iata":"A5","indicativo":"AIRLINAIR","name" (nome):"Airlinair","icao":"RLA","tipo":"companhia aérea"}' http://localhost:8080/airlines/resources/airline |
Atualizar um recurso:
1 |
enrolar -v -H "Content-Type: application/json" -X PUT -d '{"país":"França","iata":"A5","indicativo":"AIRLINAIR","name" (nome):"Airlin Air","icao":"RLA","tipo":"companhia aérea","id": "19810"}' http://localhost:8080/airlines/resources/airline/19810 |
Excluir um recurso:
1 |
enrolar -v -X DELETE http://localhost:8080/airlines/resources/airline/19810 |
A saída detalhada de cada um desses comandos está em github.com/arun-gupta/couchbase-javaee.
Excluir microsserviço
O microsserviço pode ser removido usando o comando pilha de docas rm webapp
:
1 2 3 |
Remoção serviço webapp_web Remoção serviço webapp_db Remoção rede webapp_default |
Quer começar a usar o Couchbase? Dê uma olhada em Kits iniciais do Couchbase. Deseja saber mais sobre como executar o Couchbase em contêineres?