Tayeb Chlyah é um arquiteto líder em Java com sólida experiência em aplicativos de desempenho em larga escala, microsserviços e bancos de dados NoSQL. Ele desenvolveu algumas bibliotecas Java de código aberto para o Couchbase.
Introdução
Todo desenvolvedor bem-sucedido precisa se manter atualizado com as novas tecnologias de ponta e as tendências emergentes, experimentando-as, brincando com elas, verificando se elas podem se encaixar em um projeto e como podem melhorá-las.
Mas como é possível conseguir isso em um mundo em rápida mudança, onde novas tecnologias e estruturas surgem diariamente?
Se você é um desenvolvedor Java full-stack, tem muita sorte: o JHipster é a solução para aprender rapidamente novas tecnologias da melhor maneira. Ele é um Gerador YeomanO Spring Boot é um sistema de andaimes que ajuda você a gerar aplicativos completos combinando uma das melhores estruturas de desenvolvimento da Web: back-end Spring Boot e front-end Angular ou React.
É claro que você pode usar Inicialização do SpringNo entanto, implementar essas combinações com sucesso não é nada trivial. Você precisa dedicar muito tempo ao estudo de cada conceito e, em seguida, tentar colar tudo, sem esquecer os testes, o que pode ser muito caro e propenso a erros. E, acima de tudo, isso pode desencorajá-lo ou, na melhor das hipóteses, obrigá-lo a se concentrar em uma das estruturas.
O JHipster cria aplicativos totalmente testados de forma rápida e fácil, usando práticas recomendadas, metodologias e estratégias. Ele propõe várias opções (Arquitetura - monólito ou microsserviços; banco de dados - SQL ou NoSQL; segurança - autenticação por sessão, JWT ou OAuth2; Outros - WebSocket, caches, Docker, Kubernetes...), que podem ajudá-lo a experimentar as melhores tecnologias disponíveis e escolher as combinações mais adequadas para o seu caso de uso.
Hoje, vamos nos concentrar em alguns dos novos conceitos de arquitetura mais importantes: microsserviços e NoSQL com o Couchbase.
Por que o Couchbase?
O Couchbase é um banco de dados NoSQL orientado a documentos. Com os bancos de dados de documentos, você tem um design sem esquema que permite alterar seus dados de forma livre e fácil. Também é possível armazenar toda a estrutura em um único documento, evitando muitas junções desnecessárias, o que significa operações de leitura e gravação naturalmente mais rápidas.
O Couchbase expõe um rápido armazenamento de valores-chave e um mecanismo de consulta avançado, juntamente com indexadores integrados para consultar dados com N1QL, uma linguagem semelhante a SQL para documentos JSON. Com sua arquitetura distribuída sem mestre, ele é muito fácil de dimensionar. Ele pode fornecer milhões de operações por segundo sem a necessidade de um cache de terceiros para executar. O Couchbase também vem com pesquisa de texto completo integrada, um mecanismo de análise e uma solução móvel completa.
Por que microsserviços?
A arquitetura de microsserviços é um padrão de desenvolvimento de sistemas de software que se concentra na criação de aplicativos como um conjunto de serviços pequenos, modulares e fracamente acoplados, permitindo uma entrega contínua mais fácil, melhor testabilidade, escalabilidade e melhor isolamento de falhas. Cada serviço pode ser escrito em diferentes linguagens e pode usar diferentes técnicas de armazenamento de dados, o que permite a capacidade de organizar o desenvolvimento em várias equipes de recursos.
Mas os microsserviços trazem alguns desafios: a decomposição do aplicativo em serviços pode ser muito complicada e é uma arte. Os desenvolvedores também precisam lidar com a complexidade adicional de um sistema distribuído.
O JHipster lida com a maioria das complexidades dos microsserviços: Descoberta e configuração de serviços com o Cônsul ou Registro JHipster (Netflix Eureka, Servidor de configuração do Spring Cloude painel de monitoramento), balanceamento de carga com Fita da Netflixtolerância a falhas com Netflix Hystrixe registro e monitoramento centralizados com jhipster-console (pilha personalizada Elasticsearch, Logstash e Kibana) e muito mais.
Criação de um microsserviço de cervejaria
Pré-requisitos:
- Instalar Mecanismo Docker
- Instalar JDK 8
- Instalar a versão LTS de 64 bits em Node.js
- Instalar Fios
- Instalar JHipster:
yarn global add generator-jhipster
Gerar um gateway de API
Para acessar nossos diferentes serviços em uma arquitetura de microsserviço, precisaremos de um Gateway de API. É a entrada para seus microsserviços. Ele fornece roteamento HTTP (Netflix Zuul) e balanceamento de carga (Fita da Netflix), qualidade dos serviços (Netflix Hystrix), segurança (Segurança do Spring) e a documentação da API (Swagger) para todos os microevices.
Em uma janela de terminal:
1 2 3 4 5 |
mkdir couchbase-jhipster-microsserviços-exemplo cd couchbase-jhipster-microsserviços-exemplo mkdir portal cd portal jhipster |
O JHipster pergunta sobre o tipo de aplicativo que você deseja criar e quais recursos deseja incluir. Você pode encontrar todos os detalhes sobre as opções disponíveis em Site da JHipster. Use as respostas a seguir para gerar um gateway com suporte ao Couchbase.
Gerar um aplicativo de microsserviço de cervejaria
Em couchbase-jhipster-microservices-example, crie um cervejaria e, em seguida, execute o jhipster para gerar um microsserviço com o banco de dados Couchbase com as seguintes respostas:
Gerar entidades de cervejaria
Criar um arquivo cervejaria.jh em couchbase-jhipster-microservices-example com o seguinte JDL (Linguagem de domínio do JHipster):
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 |
entidade Cerveja { nome Cordas necessário, categoria Cordas necessário, descrição Cordas, estilo Cordas, cervejaria Cordas, abv Flutuação, ibu Inteiro, srm Inteiro, upc Inteiro, atualizado LocalDate } entidade Cervejaria { nome Cordas necessário, descrição Cordas, endereço Cordas necessário comprimento máximo(200), cidade Cordas, código Cordas, país Cordas, telefone Cordas padrão(/[0-9- .]+/), estado Cordas, site Cordas, atualizado LocalDate } |
paginar Cerveja com paginador
Paginar a Brewery com rolagem infinita
Em uma janela de terminal, execute os seguintes comandos:
1 2 3 4 5 |
cd cervejaria jhipster importação-jdl ../cervejaria.jh cd ../portal jhipster entidade cervejaria jhipster entidade cerveja |
Quando solicitado a substituir arquivos, sempre responda a.
Executar a arquitetura de microsserviço
Para executar nossa arquitetura, precisamos iniciar o seguinte:
- Registro JHipster
- Chaveiro: uma solução de gerenciamento de identidade e acesso de código aberto
- Servidor Couchbase
- Microsserviço de cervejaria
- Gateway
Felizmente, o JHipster tem uma Subgerador do docker-compose que iniciará todos os serviços necessários sem dor de cabeça. Mas, primeiro, precisamos criar nossos aplicativos. Em couchbase-jhipster-microservices-example:
1 2 3 4 5 6 |
cd portal ./mvnw pacote -Pprod arquivo de encaixe:construir -DskipTests cd ../cervejaria ./mvnw pacote -Pprod arquivo de encaixe:construir -DskipTests cd .. mkdir doca-compor && cd doca-compor |
Agora, podemos gerar docker-compose.yml usando o comando e as respostas a seguir:
1 |
jhipster doca-compor |
Para que nosso aplicativo funcione com um keycloak local, precisamos adicionar ao seu arquivo hosts (Windows: C:\Windows\System32\drivers\etc\hosts, Mac/Linux: /etc/hosts) a seguinte linha:
1 |
127.0.0.1 keycloak |
Antes de iniciar tudo, verifique se você configurou o Docker com memória e CPUs suficientes e, em seguida, execute:
1 |
doca-compor para cima |
Quando tudo terminar de iniciar, abra um navegador para Gateway (http://localhost:8080/), clique em conta e, em seguida, faça login.
Você deve ser redirecionado para keycloakFaça login usando administrador para usuário e senha.
Você retornará ao gateway, onde poderá ver as interfaces de administração, alterar o idioma, visualizar e editar suas entidades...
Registro do JHipster
Agora, abra seu navegador para http://localhost:8761/. Você será automaticamente conectado, pois já fez isso no keycloak, que é a mágica da autenticação oauth2.
Além de ser a espinha dorsal de seu aplicativo de microsserviço, como é um servidor de descoberta com Eureka que lida com roteamento, balanceamento de carga e escalabilidade, e um servidor de configuração com Servidor de configuração do Spring Cloud que fornece a configuração do tempo de execução de seus aplicativos, Registro JHipster também é um servidor de administração, onde é possível visualizar as instâncias, a integridade, as métricas e os registros do aplicativo.
Como isso funciona?
Acesso ao banco de dados
Primeiro, você precisa acessar a instância do brewery-couchbase. Para isso, atualize docker-compose/docker-compose.yml para publicar sua porta de interface de administração com o seguinte:
1 2 3 4 5 6 7 8 |
cervejaria-couchbase: construir: contexto: ../cervejaria/src/principal/doca arquivo de encaixe: couchbase/Couchbase.Dockerfile ambiente: - BUCKET=cervejaria portos: - 8091:8091 |
Vamos aplicar nossas alterações, em docker-compose diretório:
1 |
doca-compor para cima -d |
Quando tudo estiver pronto, abra a interface de administração do Couchbase em http://localhost:8091/e, em seguida, faça login usando Administrador como usuário e senha como senha. Abrir documentos de balde da cervejaria.
Couchmove
Como você pode ver, seu bucket já está preenchido com alguns documentos: O JHipster preenche os documentos de bootstrap usando Couchmoveuma biblioteca de migração de dados Java para o Couchbase, amplamente inspirada em Flywaypois favorece muito mais a simplicidade e a convenção do que a configuração.
Você pode dar uma olhada nos arquivos changelog em
1 |
cervejaria/src/principal/recursos/configuração/movimento do sofá/changelog diretório: |
- V0.1__initial_setup diretório: contém documentos de usuário e de autoridade, usados por Segurança do Spring para autenticar usuários.
- V0__create_indexes.n1qlcria os índices necessários.
Como Flyway ou liquibase para bancos de dados SQL, Couchmove mantém changelog documentos, mantendo o controle dos registros de alterações executados.
Spring Boot e Spring Data Couchbase
O JHipster gera um Spring Boot 2 aplicativo e usos Dados do Spring para acessar bancos de dados relacionais e não relacionais. No nosso caso, ele está usando Dados do Spring Couchbase para fornecer integração com o banco de dados do Couchbase Server. Mas ele vai muito além, personalizando o seu funcionamento:
Por padrão, o Spring Data Couchbase usa N1qlCouchbaseRepository.java que utiliza o N1QL apenas para paginação ou classificação findAll operações. Todas as outras operações estão usando visualizações como você pode ver na implementação do SimpleCouchbaseRepository.java. Como os índices de visualização são sempre acessados do disco, eles não são tão eficaz.
Vamos ver como o JHipster melhora esse comportamento:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
@Configuração @Perfil("!" + JHipsterConstants.NUVEM_DE_PERFIL_DA_MOLA) @EnableCouchbaseRepositories (Ativar repositórios doouchbase)(repositoryBaseClass = CustomN1qlCouchbaseRepository.classe, basePackages = "com.couchbase.example.brewery.repository") @Importação(valor = CouchbaseAutoConfiguration.classe) @EnableCouchbaseAuditing (Ativar auditoria de base de dados)(auditorAwareRef = "springSecurityAuditorAware") público classe DatabaseConfiguration { ... @Feijão público Couchmove movimento do sofá(Balde couchbaseBucket) { registro.depurar("Configuração do Couchmove"); Couchmove couchMove = novo Couchmove(couchbaseBucket, "config/couchmove/changelog"); couchMove.migrar(); retorno couchMove; } ... } |
DatabaseConfiguration configura e inicia as migrações do Couchmove e também ativa os repositórios do Couchbase, mas com uma classe base personalizada: CustomN1qlCouchbaseRepository
1 2 3 4 5 6 7 8 |
público classe CustomN1qlCouchbaseRepository<T, ID se estende Serializável> se estende N1qlCouchbaseRepository<T, ID> { ... @Substituir público <S se estende T> S salvar(S entidade) { retorno super.salvar(populateIdIfNecessary(entidade)); } ... } |
Essa classe estende o repositório padrão para gerar automaticamente o ID do documento antes de salvá-lo e permite o uso do N1QL para todas as operações implementando CustomN1qlRespository interface:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
@NoRepositoryBean público interface N1qlCouchbaseRepository<T, ID se estende Serializável> se estende CouchbasePagingAndSortingRepository<T, ID> { @Consulta("#{#n1ql.selectEntity} WHERE #{#n1ql.filter}") Lista<T> findAll(); @Consulta("SELECT count(*) FROM #{#n1ql.bucket} WHERE #{#n1ql.filter}") longo contagem(); @Consulta("DELETE FROM #{#n1ql.bucket} WHERE #{#n1ql.filter} returning #{#n1ql.fields}") T removeAll(); padrão vazio deleteAll() { removeAll(); } } |
Os IDs são gerados automaticamente usando Valor Gerado com um prefixo usando IdPrefix que, por padrão, é o nome da classe, separado por __ delimitador.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
@Documento público classe Cervejaria implementa Serializável { privado estático final longo serialVersionUID = 1L; público estático final Cordas PREFIXO = "cervejaria"; @Suprimir avisos("não utilizado") @IdPrefix privado Cordas prefixo = PREFIXO; @Id @Valor Gerado(estratégia = ÚNICO, delimitador = ID_DELIMITER) privado Cordas id; ... } |
Testes
Dissemos anteriormente que os aplicativos gerados pelo JHipster são totalmente testados com testes unitários e testes de integraçãomas como isso funciona para os de integração?
Para o Couchbase, ele usa Contêineres de teste do Couchbaseque é um módulo que estende contêineres de testeuma biblioteca Java que facilita o lançamento de qualquer contêiner Docker durante os testes JUnit, para iniciar automaticamente uma instância do Couchbase Server e configurá-lo com os serviços, usuários, buckets e índices necessários.
Para executar os testes, execute o seguinte comando em uma janela de terminal:
1 |
./mvnw limpo teste |
Preencher alguns dados
Para preencher alguns dados, aproveitaremos as vantagens do Baldes de amostra do Couchbase. Abrir Configurações guia, Baldes de amostrae, em seguida, selecione beer-sample (amostra de cerveja) e clique em Carregar dados de amostra.
Você precisa modelar os dados em Dados do Spring Couchbase formato de serialização. Para isso, abra a guia Query (Consulta) e execute as seguintes consultas:
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 |
INSERIR PARA cervejaria (CHAVE k, VALOR v) SELECIONAR tipo || "__" || meta().id como k, { "name" (nome): nome, "category" (categoria): categoria, "description" (descrição): descrição, "estilo": estilo, "cervejaria": brewery_id, "abv": abv, "ibu": ibu, "srm": srm, "upc": upc, "atualizado": STR_TO_MILLIS(atualizado), "_class" : "com.couchbase.example.brewery.domain.Beer" } como v DE `cerveja-amostra` ONDE tipo = "cerveja; INSERIR PARA cervejaria (CHAVE k, VALOR v) SELECIONAR tipo || "__" || meta().id como k, { "name" (nome): nome, "description" (descrição): descrição, "endereço": endereço[0], "país": país, "website": site, "código": código, "cidade": cidade, "telefone": telefone, "estado": estado, "atualizado": STR_TO_MILLIS(atualizado), "_class" : "com.couchbase.example.brewery.domain.Brewery" } como v DE `cerveja-amostra` ONDE tipo = "cervejaria; |
Aqui está um exemplo de um documento de cerveja inserido:
Agora vamos ver como o JHipster lida com documentos recém-inseridos. Navegue até Gateway, Entidadese, em seguida, abra Cervejaria. O JHipster carrega primeiro 20 cervejarias e, se você rolar a tela para baixo, ele carrega mais! Ele propõe a navegação na página para Cerveja porque escolhemos esse comportamento ao gerar entidades com cervejaria.jh JDL.
1 2 |
paginar Cerveja com pager paginar Cervejaria com infinito-rolagem |
Código-fonte
O código-fonte dos aplicativos gerados está disponível em tchlyah/couchbase-jhipster-microservices-example.
O que vem a seguir?
O JHipster, com a ajuda do Elasticsearch, propõe uma opção que adiciona recursos de pesquisa sobre o banco de dados. Mas o Couchbase tem um recurso pronto para uso Pesquisa de texto completo que oferece amplos recursos para consultas em linguagem natural. Por que não implementar esse suporte no JHipster? Se você puder ajudar, não hesite em contribuir!
Se você tiver alguma dúvida, envie-me um tweet para @tchlyah ou deixe um comentário abaixo.