Os contêineres, os microsserviços e o NoSQL formam um trio incrível para criar seus aplicativos modernos. Esses aplicativos precisam ser ágeis, atender às demandas dos clientes em constante evolução, ser difundidos e funcionar em plataformas móveis, da Web e de IoT.
Este blog explicará uma pilha simples de microsserviços usando Enxame WildFly, Dockere Couchbase. O código completo e as instruções deste blog estão documentados em: github.com/arun-gupta/wildfly-swarm-couchbase.
Primeiro, vamos entender os principais componentes dessa pilha!
Enxame WildFly permite empacotar e executar aplicativos JavaEE, empacotando-os com apenas o suficiente do tempo de execução do servidor para
java -jar
seu aplicativo. Com a descoberta de serviços incorporada, logon único usando o Keycloak, monitoramento usando o Hawkulare muitos outros recursos, o WildFly Swarm fornece todos os componentes necessários para desenvolver seu microsserviço.
Docker para Mac oferece suporte nativo para a execução de contêineres do Docker no Mac OSX. Ele se baseia em Hypervisor.framework
no OSX. O mecanismo do Docker é executado em uma distribuição do Alpine Linux em cima de um xhyve
Máquina virtual, e até mesmo a VM é gerenciada pelo Docker. Não há necessidade de usar o Docker Machine ou o VirtualBox, e ele se integra ao modelo de sandbox de segurança do OSX. A DockerCon 2016 removeu a restrição da versão beta privada do Docker para Mac e, portanto, está disponível para todos agora.
NoSQL oferece a agilidade e a flexibilidade dos bancos de dados sem esquema. Isso permite que o aplicativo evolua de forma independente e rápida sem passar por migrações complicadas de banco de dados. O Couchbase oferece um verdadeiro dimensionamento horizontal com arquitetura homogêneaem oposição à arquitetura mestre/escravo não escalável. Ele também oferece auto-sharding, Linguagem de consulta semelhante a SQL para JSON (N1QL), banco de dados móvel e sincronização com o servidor de back-end, e muito mais. O aplicativo de amostra completo deste blog está em: github.com/arun-gupta/wildfly-swarm-couchbase.
Aplicativo WildFly Swarm
Vamos dar uma olhada no endpoint REST do Java EE:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
pacote com.couchbase.mosca selvagem.enxame; . . . @Caminho("companhia aérea") público classe Recursos de companhias aéreas { @Injetar Banco de dados banco de dados; @OBTER público Cordas getAll() { N1qlQuery consulta = N1qlQuery.simples("SELECT * FROM `travel-sample` LIMIT 10"); N1qlQueryResult resultado = banco de dados.getBucket().consulta(consulta); retorno resultado.todas as linhas().toString(); } . . . } |
Ele usa a anotação JAX-RS padrão para converter um POJO em um endpoint REST. API Java do Couchbase fornecem uma API fluente e usam a instrução N1QL para consultar os documentos e retornar os resultados. A instrução N1QL retorna os primeiros 10 elementos do resultado da consulta. Saiba mais sobre a sintaxe N1QL neste tutorial interativo. A abstração do banco de dados é definida como:
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 |
pacote com.couchbase.mosca selvagem.enxame; . . . @Singleton @Inicialização público classe Banco de dados { CouchbaseCluster agrupamento; Balde balde; público CouchbaseCluster getCluster() { se (nulo == agrupamento) { Cordas couchbaseURI = Sistema.getenv("COUCHBASE_URI"); se (nulo == couchbaseURI) { Sistema.erro.println("WARING: Nenhum COUCHBASE_URI especificado, padrão para localhost"); couchbaseURI = "localhost:8093"; } Sistema.fora.println("Ponto de extremidade do Couchbase: " + Sistema.getenv("COUCHBASE_URI")); agrupamento = CouchbaseCluster.criar(couchbaseURI); } retorno agrupamento; } público Balde getBucket() { se (nulo == balde) { balde = getCluster().openBucket("amostra de viagem"); } retorno balde; } } |
Esse é um EJB singleton que é inicializado com antecedência. Ele usa SDK Java do Couchbase para se conectar ao Couchbase. O endpoint do banco de dados pode ser especificado usando o parâmetro COUCHBASE_URI
variável de ambiente. O próximo passo é pom.xml
para configurar o WildFly Swarm e Cliente Java do Couchbase:
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 |
org.mosca selvagem.enxame bomba ${versão.mosca selvagem-enxame} pom importação javax javaee-web-API 7.0 fornecido org.mosca selvagem.enxame jaxrs-cdi org.mosca selvagem.enxame ejb com.couchbase.cliente java-cliente 2.2.5 |
Ele usa a "lista de materiais" do WildFly Swarm para extrair todas as dependências. Somente as dependências específicas necessárias para a compilação são especificadas em . Em seguida, eles são empacotados no "fat jar". O plug-in Maven do WildFly Swarm é usado para empacotar e executar o aplicativo:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
org.mosca selvagem.enxame mosca selvagem-enxame-plug-in ${versão.mosca selvagem-enxame} pacote ${COUCHBASE_URI} |
COUCHBASE_URI
é usado para ler o host de onde o servidor de banco de dados do Couchbase está sendo executado.
Executar o Couchbase Server
Execute o servidor Couchbase usando o Docker para Mac:
1 |
doca executar -d --nome db -p 8091-8093:8091-8093 -p 11210:11210 arungupta/couchbase |
O arungupta/couchbase
é construído sobre o imagem padrão do Couchbase e usa API REST do Couchbase para configurar o servidor. Aguarde alguns minutos para que o bucket de amostra seja preenchido com os documentos JSON. Invoque o Ferramenta CLI do Couchbase cbq criar um índice primário no bucket de amostra:
1 |
doca executar -ele --link db:db arungupta/couchbase cbq -u Administrador -p senha -motor http://db:8093 -s "create primary index `travel-sample-primary-index` on `travel-sample`;" |
Isso mostrará a saída como:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Conectado para : http://Digite Ctrl-D ou QUIT para sair. Caminho para histórico arquivo para o casca : /raiz/.cbq_histórico { "requestID": "d0b2e4dd-b702-49e2-971c-a4c640ddb498", "assinatura": nulo, "resultados": [ ], "status": "sucesso", "métricas": { "elapsedTime" (tempo decorrido): "3.154540272s", "executionTime": "3.154493281s", "resultCount": 0, "resultSize": 0 } } |
Essa saída mostra que o resultado da criação do índice foi bem-sucedido. Uma das vantagens de executar o Docker para Mac é que todos os contêineres podem ser acessados em localhost
. Isso significa que Console da Web do Couchbase pode ser acessado em localhost:8091.
Essa tela garante que o Couchbase esteja configurado corretamente.
Executar o microsserviço WildFly Swarm
Empacote e execute o microsserviço autônomo como:
1 |
mvn mosca selvagem-enxame:executar |
Se o Couchbase estiver sendo executado em um host diferente, o comando será alterado para:
1 |
mvn -DCOUCHBASE_URI= mosca selvagem-enxame:executar |
Ele mostra a saída como:
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 |
[INFORMAÇÕES] Digitalização para projetos... [INFORMAÇÕES] [INFORMAÇÕES] ------------------------------------------------------------------------ [INFORMAÇÕES] Edifício nosql-microsserviços 1.0-FOTOGRAFIA [INFORMAÇÕES] ------------------------------------------------------------------------ [INFORMAÇÕES] . . . 2016-06-27 22:21:47,170 AVISO [org.jboss.como.dependência.privado] (MSC serviço linha 1-6) WFLYSRV0018: Implantação "deployment.nosql-microservices.war" é usando a privado módulo ("org.jboss.jts:main") que pode ser alterado ou removido em futuro versões sem aviso. 2016-06-27 22:21:47,203 INFORMAÇÕES [org.jboss.solda.implantador] (MSC serviço linha 1-1) WFLYWELD0003: Processamento solda implantação nosql-microsserviços.guerra 2016-06-27 22:21:47,542 INFORMAÇÕES [org.hibernar.validador.interno.util.Versão] (MSC serviço linha 1-1) HV000001: Hibernar Validador 5.2.3.Final 2016-06-27 22:21:47,600 INFORMAÇÕES [org.jboss.como.ejb3.implantação] (MSC serviço linha 1-1) WFLYEJB0473: JNDI vínculos para sessão feijão nomeado "Banco de dados em implantação unidade 'implantação "nosql-microservices.war"' são como segue: java:global/nosql-microsserviços/Banco de dados!com.couchbase.mosca selvagem.enxame.Banco de dados java:aplicativo/nosql-microsserviços/Banco de dados!com.couchbase.mosca selvagem.enxame.Banco de dados java:módulo/Banco de dados!com.couchbase.mosca selvagem.enxame.Banco de dados java:global/nosql-microsserviços/Banco de dados java:aplicativo/nosql-microsserviços/Banco de dados java:módulo/Banco de dados 2016-06-27 22:21:47,731 INFORMAÇÕES [org.jboss.solda.implantador] (MSC serviço linha 1-3) WFLYWELD0006: Início Serviços para CDI implantação: nosql-microsserviços.guerra 2016-06-27 22:21:47,758 INFORMAÇÕES [org.jboss.solda.Versão] (MSC serviço linha 1-3) SOLDA-000900: 2.3.2 (Final) 2016-06-27 22:21:47,780 INFORMAÇÕES [org.mosca selvagem.extensão.submergir] (MSC serviço linha 1-1) WFLYUT0018: Anfitrião padrão-hospedeiro início 2016-06-27 22:21:47,788 INFORMAÇÕES [org.jboss.solda.implantador] (MSC serviço linha 1-8) WFLYWELD0009: Início solda serviço para implantação nosql-microsserviços.guerra 2016-06-27 22:21:48,180 INFORMAÇÕES [saída] (Serviço de servidor Tópico Piscina -- 10) Couchbase ponto final: 2016-06-27 22:21:48,275 INFORMAÇÕES [com.couchbase.cliente.núcleo.CouchbaseCore] (Serviço de servidor Tópico Piscina -- 10) CouchbaseEnvironment: {sslEnabled=falso, sslKeystoreFile='null', sslKeystorePassword='null', queryEnabled=falso, queryPort=8093, bootstrapHttpEnabled=verdadeiro, bootstrapCarrierEnabled=verdadeiro, bootstrapHttpDirectPort=8091, bootstrapHttpSslPort=18091, bootstrapCarrierDirectPort=11210, bootstrapCarrierSslPort=11207, ioPoolSize=8, computationPoolSize=8, responseBufferSize=16384, requestBufferSize=16384, kvServiceEndpoints=1, viewServiceEndpoints=1, queryServiceEndpoints=1, searchServiceEndpoints=1, ioPool=NioEventLoopGroup, coreScheduler=Agendador principal, eventBus=DefaultEventBus, packageNameAndVersion (nome do pacote e versão)=couchbase-jvm-núcleo/1.2.5 (git: 1.2.5), dcpEnabled=falso, retryStrategy=BestEffort, maxRequestLifetime=75000, retryDelay=ExponentialDelay (Atraso Exponencial){crescerPor 1.0 MICROSSEGUNDOS, poderes de 2; inferior=100, superior=100000}, reconnectDelay=ExponentialDelay (Atraso Exponencial){crescerPor 1.0 MILISSEGUNDOS, poderes de 2; inferior=32, superior=4096}, observeIntervalDelay=ExponentialDelay (Atraso Exponencial){crescerPor 1.0 MICROSSEGUNDOS, poderes de 2; inferior=10, superior=100000}, keepAliveInterval=30000, autoreleaseAfter=2000, bufferPoolingEnabled=verdadeiro, tcpNodelayEnabled=verdadeiro, mutationTokensEnabled=falso, socketConnectTimeout=1000, dcpConnectionBufferSize=20971520, dcpConnectionBufferAckThreshold=0.2, tempo limite de consulta=75000, viewTimeout=75000, kvTimeout=2500, connectTimeout=5000, tempo limite de desconexão=25000, dnsSrvEnabled=falso} 2016-06-27 22:21:48,829 INFORMAÇÕES [com.couchbase.cliente.núcleo.nó.Nó] (cb-io-1-1) Conectado para Nó localhost 2016-06-27 22:21:49,035 INFORMAÇÕES [com.couchbase.cliente.núcleo.configuração.Provedor de configuração] (cb-cálculos-1) Aberto balde viagens-amostra 2016-06-27 22:21:49,415 INFORMAÇÕES [org.jboss.fácil.resteasy_jaxrs.i18n] (Serviço de servidor Tópico Piscina -- 10) RESTEASY002225: Implementação javax.ws.rs.núcleo.Aplicativo: classe com.couchbase.mosca selvagem.enxame.MyApplication 2016-06-27 22:21:49,438 INFORMAÇÕES [org.mosca selvagem.extensão.submergir] (Serviço de servidor Tópico Piscina -- 10) WFLYUT0021: Registrado web contexto: / 2016-06-27 22:21:49,457 INFORMAÇÕES [org.jboss.como.servidor] (principal) WFLYSRV0010: Implementado "nosql-microservices.war" (tempo de execução-nome : "nosql-microservices.war") |
Agora o aplicativo pode ser acessado como:
1 |
enrolar http://localhost:8080/webresources/airline |
E a saída formatada é semelhante:
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 |
[ { "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": "França", "iata": "A5", "indicativo": "AIRLINAIR", "name" (nome): "Airlinair", "icao": "RLA", "id": 1203, "tipo": "companhia aérea" } } ] |
Então você criou um microsserviço simples usando o WildFly Swarm acessando um banco de dados Couchbase em execução como um contêiner do Docker. Agora, idealmente, esse serviço do WildFly Swarm deve ser empacotado como uma imagem do Docker e, em seguida, essa imagem do Docker serviria como o serviço. Um perfil Maven com o nome doca
já está adicionado ao pom.xml
mas edição #3 está fazendo com que esse cenário fracasse.