Minicurso Microsservicos
Minicurso Microsservicos
Minicurso Microsservicos
net/publication/338989226
CITATIONS READS
0 1,528
3 authors, including:
Some of the authors of this publication are also working on these related projects:
All content following this page was uploaded by Luis Villaca on 09 February 2020.
1
Construindo Aplicações Distribuídas com
Microsserviços
Abstract
Resumo
• Deve fornecer os mesmos resultados para uma mesma entrada (isto é, ser sem es-
tado ou stateless);
Estes princípios podem ser relaxados de uma forma ou de outra para alcançar de-
terminados objetivos como, por exemplo, serviços compostos os quais não são atômicos,
pois utilizam outros serviços para realizar suas tarefas
Um serviço é implementado de acordo com um contrato, é exposto através de um
endpoint, é governado por políticas, recebe mensagens de requisição e envia mensagens
de resposta. Por outro lado, um cliente entende o contrato do serviço e estando aderente
às políticas do serviço, liga-se a ele através do endpoint do serviço, e envia mensagens de
requisição e recebe mensagens de resposta. Estes conceitos são ilustrados na Figura 1.1.
A principal tecnologia de implementação serviços é a de web services, apresentada na
Seção 1.2.2.
Figura 1.1. Um exemplo de troca de mensagens entre consumidor e provedor
Web service REST (Representational State Transfer) é uma alternativa mais simples a
web services SOAP. Esta tecnologia é mais fácil de utilizar. É um estilo de projeto de
aplicações mais coesas e menos acopladas que se baseia em recursos nomeados ao invés
1 https://www.w3.org/TR/xml/
2 https://www.w3.org/TR/xml/
3 https://www.w3.org/TR/soap12-part1/
4 https://www.w3.org/TR/wsdl/
Figura 1.3. Exemplo de implementação de web service SOAP em Java.
de mensagens. Nesta tecnologia, serviços são vistos como recursos e podem ser identifi-
cados unicamente por suas URLs.
REST foi introduzido em 2000 por Roy Fielding em sua tese de doutorado na
Universidade de Califórnica, Irvine [Fielding 2000]. Não atraiu muita atenção na época,
mas hoje é amplamente utilizado como, por exemplo, pelo Yahoo, Google e Facebook.
REST5 é apresentado pela W3C como sendo um subconjunto da Web baseado
em HTTP nos quais agentes proveem semântica de interface uniforme - essencialmente
criar, recuperar, atualizar e apagar - ao invés de interfaces arbitrárias ou específicas de
aplicação, e manipulam recursos apenas pela troca de representações. Além disso, as
interações REST são sem estado (stateless) no sentido de que o significado da mensagem
não depende do estado da conversação.
REST não impõe restrições no formato da mensagem, como SOAP para web ser-
vices SOAP, mas sim apenas no comportamento dos componentes envolvidos. Dessa
forma, o desenvolvedor tem maior flexibilidade em optar pelo formato de mensagem que
atenda melhor as suas necessidades. Os formatos mais comuns são JSON6 (Java Script
Object Notation), XML e texto puro, mas em teoria qualquer formato pode ser usado. A
principal característica de web services REST é usar explicitamente os métodos HTTP
(POST, GET, PUT, DELETE) para denotar a invocação de diferentes operações.
Web services REST se baseiam nos seguintes princípios: (i) Usar explicitamente
os métodos HTTP; (ii) Ser sem estado; (iii) Expor URIs como uma estrutura de diretório;
(iv) Transferir XML, JSON, ou ambos.
A Figura 1.4 apresenta um exemplo de implementação de web service REST em
5 https://www.w3.org/TR/ws-arch/\#relwwwrest
6 https://www.json.org/
Java. Nas linhas 3 e 4 temos os imports necessários para as anotações @Path e @GET.
O primeiro é utilizado (linha 7) para anotar a classe HelloResource como um web
service REST disponibilizado no caminho “\hello”. O segundo é utilizado (linha 10)
para anotar o método getInformation para ser invocado quando o método HTTP
GET for executado neste caminho.
1.2.3. GraphQL
A linguagem GraphQL7 foi elaborada pelo Facebook com o objetivo de viabilizar buscas
de dados, com um grau maior de flexibilidade e eficiência que o disponibilizado em ser-
viços REST e SOAP [Ghebremicael 2017]. A especificação GraphQL é de código aberto
desde 2015. Ela permite que o usuário solicite informações a partir de um esquema de-
nominado IDL (Interface Definition Language). Este esquema define um formato com os
parâmetros de requisição de informações.
A Figura 1.5 apresenta um exemplo de esquema, consulta e resultado em GraphQL.
O esquema inclui um tipo Projeto com os campos nome, slogan e uma lista de usuários
colaboradores. A consulta busca o projeto cujo nome é GraphQL e solicita o slogan deste
projeto como dado de retorno. Como resultado, obtem-se o slogan “Uma linguagem de
consultas para APIs”.
7 http://graphql.org
Consultas GraphQL não apenas acessam propriedades de um recurso, mas seguem
as referências entre eles. Por exemplo, enquanto uma API REST requer carregar dados
de múltiplas URLs, uma API GraphQL obtêm todos os dados em apenas uma requisição,
resultando em processamento mais eficiente.
GraphQL cria uma API uniforme sem estar atrelada a uma tecnologia de armaze-
namento específica. Dessa forma, sendo uma tecnologia diretamente aplicável ao acesso
em bancos de dados poliglotas.
1.2.4.1. Definição
Microsserviços são uma alternativa às grandes aplicações monolíticas. A Figura 1.6 apre-
senta um exemplo de arquitetura monolítica [Richardson 2015]. A aplicação, na parte
central, contém toda a lógica do negócio, a qual pode ser implementada através de módu-
los que definem serviços, objetos do negócio, e eventos. Esta aplicação se conecta a um
SGBD (Sistema de Gerenciamento de Banco de Dados) para consultas e armazenamento
de dados e a outros serviços externos como, por exemplo, serviço de consulta de CEP.
Apesar de ter uma arquitetura interna dividida em módulos, a aplicação é empa-
cotada e disponibilizada como uma aplicação monolítica, por exemplo, um WAR8 para
arquivos Java ou aplicações Java empacotadas como executáveis JAR.
Estes tipos de aplicações são fáceis de desenvolver por IDEs e outras ferramentas
focadas em construir uma única aplicação. Elas também são fáceis de serem testadas
8 Web application ARchive (WAR) é um formato de arquivo para distribuir, por exemplo, uma coleção de
JavaServer Pages, Servlets Java, classe Java para ser implantado em servidor de aplicação como o Tomcat
ou Glassfish.
e distribuídas. Inclusive elas podem ser escalonadas colocando-se múltiplas cópias em
múltiplos servidores e empregando balanceamento de carga.
1.2.4.3. Princípios
Há sete princípios atribuídos a microsserviços [Zimmermann 2016, Fowler and Lewis 2014,
Newman 2015]:
1.2.5. Contêineres
Contêiner é um termo que descreve uma alternativa mais leve às máquinas virtuais. Para
isso é feito o encapsulamento da aplicação em um ambiente virtual que contém apenas
os ativos necessários para o funcionamento. Os contêineres são isolados a nível de disco,
memória, processamento e rede. Essa separação permite uma grande flexibilidade, onde
ambientes distintos podem coexistir na mesma máquina hospedeira (host), sem causar
problemas.
Comparando contêiner com maquina virtual, temos que cada máquina virtual re-
quer um Sistema Operacional próprio além dos softwares e bibliotecas. Além disso uma
camada intermediária (chamada hypervisor) gerencia a comunicação de cada máquina
virtual com o sistema operacional hospedeiro. Já os contêineres acessam diretamente o
sistema operacional hospedeiro e seus recursos (por exemplo, disco, memória, rede) para
prover um ambiente virtual para as aplicações. Portanto, no ambiente de contêiner, é
necessário instalar os requisitos (softwares, arquivos etc.) que o microsserviço precisa
sem se preocupar com instalações de outro Sistema Operacional, além de não precisar do
hypervisor.
1.2.6. Docker
Docker9 é uma plataforma aberta criada utilizando o modelo de contêiner para “empa-
cotar” a aplicação, que após ser transformada em uma imagem Docker, poderá ser re-
produzida em plataforma de qualquer porte. O objetivo é facilitar o desenvolvimento,
implantação e execução de aplicações em ambientes isolados da forma mais rápida pos-
sível. O Docker permite gerenciar a infraestrutura da aplicação. O que agiliza o processo
de criação, manutenção e evolução.
O Dockerfile é um arquivo que descreve as instruções para criar uma imagem de
contêiner Docker. Uma imagem sempre deve partir de uma imagem base. Portanto, o
Dockerfile descreve de uma forma textual a diferença entre a imagem base e a imagem
que se deseja criar, isto é, o Dockerfile contém a sequência de instruções necessárias para
modificar a imagem base para que ela fique com as características desejadas.
A Figura 1.8 apresenta um exemplo de Dockerfile. A linha 2 corresponde ao
nome e a versão da imagem base. A linha 4 contém informações do mantenedor da
imagem base. A linha 6 define variáveis de ambiente. A linha 8 executa uma instrução
na linha de comando. Neste caso, é executado o apt-get10 para instalar a biblioteca
openjdk11 . A linha 10 executa o comando ADD que copia arquivo para diretório de
trabalho (WORKDIR) do contêiner. Neste caso, está sendo copiado o arquivo_test
da raiz para o diretório temp da raiz do WORKDIR.
• Rocket (rkt)15 : emprega o conceito de pod - uma coleção de uma ou mais aplica-
ções executando em um contexto compartilhado. Configurações podem ser feitas a
nível de pod ou a nível da aplicação. A arquitetura do rkt preconiza que cada pod
executa diretamente em um modelo de processo Unix (isto é, não existe daemon
central), em um ambiente auto-contido e isolado.
1.3.1. Definição
O termo “Persistência Poliglota” é usado para explicitar uma abordagem de persistência
híbrida[Sadalage and Fowler 2012], que propicia a utilização dos melhores mecanismos
projetados para armazenamento e recuperação das informações de acordo com a sua na-
tureza. Isso é ilustrado no cenário apresentado na Figura 1.10, no qual uma plataforma de
13 http://yaml.org/spec/
14 https://www.ubuntu.com/containers/lxd
15 https://coreos.com/rkt/
e-commerce consome quatro microsserviços, cada um com seu próprio SGBD (Sistema
de Gerenciamento de Banco de Dados). Dados de um carrinho de compra (por exemplo,
id de produto e quantidade) podem ser eficientemente resgatados a partir de um banco
chave-valor (key-value), e ordens de compra podem ser persistidas de forma agregada e
estruturada em um banco NoSQL Document, enquanto que um catálogo de produto pode
ser mantido por meio de um banco relacional (SGBDR) e informações cruzadas de com-
pra e clientes podem ser armazenadas em um grafo para inferir recomendações. Sendo
assim, para atender diferentes requisitos tecnologias apropriadas de banco de dados são
utilizadas.
Figura 1.10. Persistência Poliglota - Adaptada de: [Sadalage and Fowler 2012]
1.3.2. Problemas
Descentralizar a responsabilidade pela manutenção de dados em microsserviços tem im-
plicações no gerenciamento de atualizações dos dados e das consultas. Devido à com-
plexidade na implementação de transações distribuídas, as arquiteturas de microsserviço
enfatizam a coordenação em atualizações de serviço e delegações em consultas, de modo
que a consistência ou a disponibilidade nem sempre serão garantidas. Isso é uma ca-
racterística inerente a qualquer sistema distribuído que compartilha dados, conforme o
estabelecido no teorema CAP [Brewer 2000] (Consistency, Availability and Partition To-
lerance), pelo qual afirma-se que no máximo dois fatores - dentre tolerância a parti-
ção, consistência e disponibilidade - podem ser plenamente e simultaneamente atendidos.
Dado que partição de rede é inerante em uma arquitetura de microsserviços, nós temos
que balancear entre disponibilidade e consistência, os quais combinados com diferen-
tes tecnologias de persistência trazem novas demandas e requerem integrações comple-
xas [Fowler 2015].
Dentre seus aspectos positivos e negativos mais relevantes [Villaca et al. 2018]
destacamos:
• Prós
1. Desenvolvimento simplificado, uma vez que cada serviço dispõe de acesso
direto às fontes de informação;
2. Bons desempenho se o número de nós reduzido, dado que serviços podem efe-
tuar filtros e junções de uma maneira otimizada. O tráfego de rede é reduzido
devido à baixa necessidade de colaboração entre os serviços uma vez que o
banco de dados é compartilhado.
• Contras
CQRS preconiza a utilização de uma visão materializada dos bancos de dados transacio-
nais para fins de recuperação de informações de modo a isolar as operações de carga das
operações de consulta [Newman 2015, Richardson 2016]. Nesta estratégia, os modelos
devem ser divididos em duas partes (Figura 1.12): (i) command-side: responsável pela
atualização de informações; (ii) query-side: responsável pela execução de consultas.
No command-side as operações de alterações (i.e., inserções, atualizações e remo-
ções) são validadas e, se aceitas, são aplicadas ao seu modelo. Seus componentes emitem
eventos sempre que os dados são alterados, sinalizando alterações de estado. Esses even-
tos são publicados em uma fila ou armazenados em um meio como um banco de dados.
16 http://orion.cs.purdue.edu/
O query-side consome o fluxo de eventos emitidos para capturar os dados alte-
rados. Este módulo pode criar projeções a partir de eventos armazenados para montar
o estado de objetos de domínio (processo conhecido como event sourcing), ou simples-
mente atualizar um tipo diferente de armazenamento (como um data warehouse).
Essa separação permite diferentes tipos de escalonamento. As partes de comando
e consulta podem ser implantadas como serviços separados, em infraestruturas de hard-
ware separadas e com diferentes tipos de armazenamentos de dados [Newman 2015].
• Prós
• Contras
Event Data Pump é muito similar à estratégia CQRS, cuja definição é mais estrutural,
essa estratégia apresenta uma definição comportamental. Atualizações de informações de
serviços são capturadas e publicadas como uma série de eventos em uma plataforma (Fi-
gura 1.13) que permite seu consumo pelos demais serviços interessados [Newman 2015].
Esses serviços (receptores) são responsáveis por manter o estado atualizado de suas fontes
de dados, com base nas informações obtidas nos eventos que são do seu interesse.
• Prós
• Contras
A ideia dessa estratégia é extrair os dados necessários dos serviços de origem por meio
de chamadas API (Figura 1.15). Para produzir relatórios reunindo dados de dois ou mais
sistemas, são necessárias várias chamadas. No caso de precisarmos puxar grandes vo-
lumes de dados para compor uma visão de diferentes serviços, as consultas podem se
tornar muito lentas; portanto, é preciso implementar estratégias para atenuar esse pro-
blema [Newman 2015].
Figura 1.15. Data Retrieval via Service Call
• Prós
• Contras
1. APIs expostas podem não prever demandas de uso dos seus relatórios. O
desempenho pode ser afetado ao executar operações que coletam dados de
vários serviços (com diferentes meios de armazenamentos de dados). Além
disso, redundância ou ambiguidade podem ser introduzidas se os serviços não
forem cuidadosamente planejados, devido à autonomia.
2. Cada componente deve ser capaz de tolerar falha, indisponibilidade ou atraso
dos serviços que colaboram com o mesmo;
3. As evoluções devem ser planejadas de maneira coletiva a fim de minimizar os
impactos aos demais serviços.
Exemplo prático: Sheibel elaborou um caso de uso para este cenário [Scheibel 2016]
no contexto de dados de trajetória de objetos móveis. A quantidade de dados manipulados
por soluções nesta área é relevante - o tamanho da maior base de dados utilizada no
estudo foi estimado em 820 GB de armazenamento. A fim de abstrair cada aplicação
consumidora a partir de detalhes de quais microsserviços e informações do banco de
dados devem ser utilizados, um novo serviço (chamado de Catálogo de Trajetórias) foi
construído em uma camada acima de todos os microsserviços que lidam com repositórios.
O mesmo coleta dados como informações de estado das trajetórias e de seus repositórios,
propiciando o roteamento das solicitações para seus serviços específicos. Os resultados
são tratados com base nos metadados de serviço mantidos por esse componente.
1.3.3.5. Canonical Data Model
• Prós
• Contras
Exemplo prático: A proposta de Ghawi e Cullot [Ghawi and Cullot 2007] utiliza onto-
logias para a descrição semântica de fontes de informação usando uma ontologia híbrida
- em que cada fonte de informação tem sua ontologia local, e uma ontologia de domínio
global é usada para representar todo o domínio. Assim, cada ontologia relacionada à fonte
de dados pode ser desenvolvida independentemente das ontologias de outras fontes.
• Bancos de Dados: Fontes dos dados relacionados a cada divisão das entidades do
negócio.
– Mediador: Utiliza estratégia Data Retrieval Via Service Call, consumindo da-
dos via API dos Microsserviços de Dados e Processador de eventos.
– Processador de eventos: via Plataforma de Integração, usa a estratégia Event
Data Pump, por meio de mensagens subscritas a partir dessa plataforma. Ele
atualiza uma fonte de dados própria, consolidando e agregando novas infor-
mações (como métricas estatísticas) requisitadas em relatórios.
– Plataforma de Integração: Componente que mantém os eventos publicados, a
cada atualização das entidades de negócio, pelos Microsserviços de dados.
Um repositório Git17 público foi criado no Bitbucket18 para este trabalho disponibilizado
na seguinte URL19 , contendo: (i) readme explidando o repositório; (ii) A estrutura de
arquivos com o código fonte da arquitetura e dos exercício; (iii) Apresentação (slides) do
trabalho; (iv) Outros links e material de apoio.
Três componentes tecnológicos foram utilizados para a criação dos microsserviços desse
estudo.
17 https://git-scm.com/
18 https://git-scm.com/
19 https://luis-villaca@bitbucket.org/luis-villaca/tutorial_2018_sbsi.
git
Gradle20 : script de build utilizado para empacotar aplicações e componentes web,
traz uma série de facilidades como definição de atividade e mapeamento de dependências
de bibliotecas via Maven21 . O script Gradle é ainda utilizado para a execução das classes
de teste e de eventual geração de métricas (como verificação do percentual de cobertura de
código), build do artefato (caso o passo anterior não apresente erros) e posterior criação
da imagem e contêiner Docker.
SpringBoot22 : Permite a criação de aplicações autocontidas (com servidores web,
aplicação e mesmo com bancos de dados), propicia integração com ferramentas que pro-
vêm métricas de qualidade de software, permite a configuração da aplicação Gradle. Essa
tecnologia facilita a automatização na construção de pequenos serviços coesos e desaco-
plados.
Java823 : Dentre outras vantagens para versões anteriores, permite o processa-
mento paralelo ou sequencial de dados em uma coleção (via StreamAPI24 ), com uma
sintaxe mais clara e com maior desempenho do que a tradicional.
O site Spring IO provê um passo-a-passo25 para se criar uma imagem Docker com
SpringBoot e Gradle. Similar ao demonstrado no passo-a-passo, utilizaremos a estrutura
de pastas indicada na Figura 1.20 para a confecção dos artefatos com SpringBoot (através
do Gradle). Em determinados microsserviços essa configuração terá alguns pequenos
ajustes.
Três tecnologias com modelos distintos de persistência foram utilizadas para os cenários
segregados e são apresentadas a seguir. A maior motivação é demonstrar o cenário de
persistência poliglota, mas outros fatores, como flexibilidade para a manutenção de es-
trutura dos dados, desempenho e necessidade de garantia de integridade nas operações
transacionais devem ser considerados na escolha das tecnologias.
DB I - Catálogo de Produtos
java8-2100321.html
24 http://www.oracle.com/technetwork/pt/articles/java/
streams-api-java-8-3410098-ptb.html
25 https://spring.io/guides/gs/spring-boot-docker/
26 https://www.mongodb.com/
Figura 1.20. Estrutura de pastas (Microsserviços)
Para a criação do ambiente para o Mongo, é necessário baixar uma imagem padrão
e executar o comando de criação do contêiner na rede criada (Comando 2).
Para confirmar a execução basta criar uma sessão iterativa rodando o Comando 3.
Seguido de db (verifica base corrente) ou qualquer outro comando.
DB II - Carro de Compras
Para este domínio, optou-se pelo Redis27 , um banco NoSQL Chave-Valor, opção
escolhida devido ao acesso aos dados ser predominantemente via chave primária. A API
utilizada para o consumo de dados do Redis também permite a busca em valores em dados
serializados.
27 https://redis.io/
Comando 2 Comandos para baixar imagem padrão do MongoDB e criar container na
rede
docker pull mongo:3.7-jessie
Parâmetros indicam:
name: nome da imagem(redisdb);
p <porta externa>:<porta interna>: expõe a porta rodando no contêiner
na porta da máquina hospedeira
d: o modo de execução detached
network grupo_microsservicos: rede da qual o contêiner fará parte
mongo:3.7-jessie: nome da imagem docker baixada na máquina hospedeira
Montagem Para a criação do banco executar Comando 4 para baixar uma imagem
padrão do redes e executar o comando de criação do contêiner. Para confirmar a execução
basta rodar o Comando 5.
Comando 4 Comandos para baixar imagem padrão do redis e criar container na rede
docker pull redis:3.2.11
Para este domínio, optou-se pelo SGBD MySQL28 , que provê garantias de atomi-
cidade, consistência, isolamento e durabilidade (ACID) nas suas transações.
Montagem Para a criação do banco, executar Comando 6 para baixar uma imagem
padrão e criar contêiner na rede criada. observe a senha gerada usando docker logs
mysqldb. Conecte ao MySQL, crie um banco de dados e um usuário para a aplicação,
executando Comando 7.
28 https://www.mysql.com/
Comando 5 Iniciar sessão iterativa no redis
docker run -it --network grupo_microsservicos
--rm redis:3.2.11 redis-cli -h redisdb -p 6379
Parâmetros:
it: roda no modo iterativo;
network grupo_microsservicos: rede da qual o contêiner fará parte
rm: máquina “efêmera”- após a execução ou em eventual parada o contêiner é removido
redis:3.2.11: nome da imagem docker
redis-cli -h redisdb -p 6379: comando para instanciar cliente
Seguido de KEYS * (verifica chaves no servidor) ou qualquer outro comando
Comando 6 Comandos para baixar imagem padrão do MySQL e criar container na rede
docker pull mysql/sqlserver:5.7.22
MS I - Catálogo de Produtos
Esse microsserviço é responsável pelo acesso ao banco de dados de Catálogo de Produtos,
incluindo informações de Fornecedor. Este serviço foi desenvolvido empregando Spring
Boot e acesso ao MongoDB29 .
O script Gradle para este microsserviço inclui30 :
ms-produtos-script-gradle
Comando 7 Comandos para criar banco de dados e usuário no MySQL
docker exec -it mysqldb mysql -uroot -p<senha gerada>
ms-produtos-script-application-yml
32 https://bitbucket.org/luis-villaca/tutorial_2018_sbsi/wiki/
ms-produtos-docker-configuration
33 https://bitbucket.org/luis-villaca/tutorial_2018_sbsi/wiki/
ms-produtos-classes
• Domain: Contém as classes de domínio. Elas apresentam um quantidade de código
reduzida, facilitando o desenvolvimento e a legibilidade do código. O componente
Lombok foi utilizado nas anotações a fim de proporcionar esse ganho. Além disso,
anotações do Spring Data MongoDB também foram utilizadas para mapear os atri-
butos da classe com a estrutura Document persistida no banco.
• DAO: Contém a classe que provê acesso aos dados dos objetos de domínio, a qual
também apresenta um quantidade de código reduzida, facilitando o desenvolvi-
mento e a legibilidade.
MS II - Carro de Compras
Esse microsserviço é responsável pelo acesso ao banco de dados de Carros de Compra,
que contém referências ao campo identificador do Cliente e a campos identificadores dos
produtos escolhidos. Em especial, para este serviço, foi necessário configurar um artefato
com Spring Data e Redis34 .
Os scripts utilizados para o microsserviço de Carro de Compras35 são similares
aos scripts empregados na construção do microsserviço de Produtos.
O diagrama apresentado na Figura 1.22 indica os principais componentes e suas
respectivas dependências, os quais são descritos a seguir de acordo com os estereótipos a
eles atribuídos36 .
34 O site Baeldung provê um guia http://www.baeldung.com/
spring-data-redis-tutorial para se configurar um artefato com Spring Data e Redis.
35 https://bitbucket.org/luis-villaca/tutorial_2018_sbsi/wiki/
ms-carrodecompras-scripts
36 https://bitbucket.org/luis-villaca/tutorial_2018_sbsi/wiki/
ms-carrosdecompras-classes
• Boot: Contém a classe principal do SpringBoot, codificada apenas com a instância
da aplicação e com referências aos pacotes que auxiliarão no processamento das
operações providas pelo serviço.
ms-clientes-scripts
• Boot: Contém a classe principal do SpringBoot, codificada apenas com a instância
da aplicação e com referências aos pacotes que auxiliarão no processamento das
operações providas pelo serviço.
• Domain: Assim como no Microsserviço Catálogo de Produtos, as classes de domí-
nio apresentam um quantidade de código reduzida, com anotações Lombok e nesse
caso com Spring Data JPA para mapear os atributos do objeto a ser persistido.
• DAO: Contém a classe que provê acesso aos dados dos objetos de domínio. Anota-
ções Spring Data foram usadas para o provimento das funcionalidades CRUD.
• Service: Classe que implementa as chamadas REST (assim como no Microsser-
viço Catálogo de Produtos). Neste caso, ela provê um serviço de busca com filtro
customizado.
MS Integração I - Mediador
Esse microsserviço é responsável por prover uma visão GraphQL (Sessão 1.2.3) a
partir da API web dos Microsserviços de Dados. Nesse caso não há acesso direto a uma
base de dados. Os acessos são feitos via requisições REST aos microsserviços de dados,
e as instâncias das classes de negócios são mapeadas a partir de suas respostas. Utiliza-se
um Schema Graphql39 para mapear estruturas de dados dessas instâncias e assim compor
respostas às requisições.
39 https://bitbucket.org/luis-villaca/tutorial_2018_sbsi/wiki/
ms-mediador-esquema-graphql
Os scripts utilizados para o microsserviço Mediador40 são similares aos scripts
empregados na construção do microsserviço de Produtos.
O diagrama apresentado na Figura 1.24 indica os principais componentes e suas
respectivas dependências os quais são descritos a seguir de acordo com os estereótipos a
eles atribuídos41 .
• DAO: Classes que proveem acesso aos dados dos objetos de domínio atuam, nesse
caso, se conectando a um microsserviço de dados via chamadas REST.
40 https://bitbucket.org/luis-villaca/tutorial_2018_sbsi/wiki/
ms-mediador-scripts
41 https://bitbucket.org/luis-villaca/tutorial_2018_sbsi/wiki/
ms-mediador-classes
MS Integração II - Processador de Eventos
Esse serviço é proposto como um exercício a fim de que sejam praticados os con-
ceitos apresentados. Foi concebido a partir de um cenário em que surge um novo requisito:
trazer a média mensal de compras por país nos últimos 12 meses.
Na atual arquitetura há algumas limitações que devem ser consideradas:
O cenário proposto foi composto por nove componentes. A partir deles foi de-
monstrado algumas características buscadas em microsserviços, como pouco acoplamento
e alta coesão, facilitando o desenvolvimento individual dos componentes.
A integração via API, na estratégia Data Retrieval Via Service, apresenta limita-
ções, como a dificuldade de se estimar quão abrangente deve ser a exposição dos serviços.
O tratamento das operações que relacionam informações de diferentes bases de
dados, cujos serviços estão distribuídos na rede, pode demandar uma abordagem diferen-
ciada - como o caso da estratégia Event Data Pump.
A integração via Event Data Pump apresenta pontos positivos e negativos, assim
como a estratégia Data Retrieval Via Service Call, conforme apontado na Seção1.3.3.
Portanto, por meio da discussão dos conceitos de microsserviços e de sua aplica-
ção num cenário de persistência poliglota foi possível apresentar as alternativas que visam
resolver aspectos importantes na construção de sistemas distribuídos e para integração de
dados.
Referências
[Booths et al. 2004] Booths, D., Haas, H., McCabe, F., Newcomer, E., Champion, M.,
Ferris, C., and Orchard, D. (2004). Web services architecture. http://www.w3.
org/TR/ws-arch/. Acessado em 06/05/2018.
[Collins et al. 2002] Collins, S. R., Navathe, S., and Mark, L. (2002). Xml schema
mappings for heterogeneous database access. Information and Software Technology,
44(4):251–257.
[Di Francesco et al. 2017] Di Francesco, P., Malavolta, I., and Lago, P. (2017). Research
on architecting microservices: Trends, focus, and potential for industrial adoption. In
Software Architecture (ICSA), 2017 IEEE International Conference on, pages 21–30.
IEEE.
[Erl 2005] Erl, T. (2005). Service-oriented architecture: concepts, technology, and de-
sign. Pearson Education India.
[Evans 2004] Evans, E. (2004). Domain-driven design: tackling complexity in the heart
of software. Addison-Wesley Professional.
[Fehling et al. 2014] Fehling, C., Leymann, F., Retter, R., Schupeck, W., and Arbitter, P.
(2014). Cloud computing patterns: fundamentals to design, build, and manage cloud
applications. Springer Science & Business Media.
[Fielding 2000] Fielding, R. T. (2000). Rest: architectural styles and the design of
network-based software architectures. Doctoral dissertation, University of California.
[Gilpin 2015] Gilpin, M. (2015). From the field: The first annual canonical model
management forum. forrester blogs. https://go.forrester.com/blogs/
10-03-15-from_the_field_the_first_annual_canonical_model_
management_forum. Acessado em 06/05/2018.
[Gu and Lago 2007] Gu, Q. and Lago, P. (2007). A stakeholder-driven service life cycle
model for soa. In 2nd international workshop on Service oriented software enginee-
ring: in conjunction with the 6th ESEC/FSE joint meeting, pages 1–7. ACM.
[Humble and Farley 2010] Humble, J. and Farley, D. (2010). Continuous Delivery: Re-
liable Software Releases through Build, Test, and Deployment Automation (Adobe Re-
ader). Pearson Education.
[Josuttis 2007] Josuttis, N. M. (2007). SOA in practice: the art of distributed system
design. “O’Reilly Media, Inc.”.
[Marks and Bell 2008] Marks, E. A. and Bell, M. (2008). Service Oriented Architecture
(SOA): a planning and implementation guide for business and technology. John Wiley
& Sons.
[Mehta and Heineman 2002] Mehta, A. and Heineman, G. T. (2002). Evolving legacy
system features into fine-grained components. In Proceedings of the 24th international
Conference on Software Engineering, pages 417–427. ACM.
[Merkel 2014] Merkel, D. (2014). Docker: lightweight linux containers for consistent
development and deployment. Linux Journal, 2014(239):2.
[Messina et al. 2016] Messina, A., Rizzo, R., Storniolo, P., and Urso, A. (2016). A sim-
plified database pattern for the microservice architecture. The Eighth International
Conference on Advances in Databases, Knowledge, and Data Applications (DBKDA).
[Pautasso et al. 2008] Pautasso, C., Zimmermann, O., and Leymann, F. (2008). Restful
web services vs. big’web services: making the right architectural decision. In Procee-
dings of the 17th international conference on World Wide Web, pages 805–814. ACM.
[Rajkovic et al. 2013] Rajkovic, P., Jankovic, D., and Milenkovic, A. (2013). Using cqrs
pattern for improving performances in medical information systems. In Balkan Con-
ference in Informatics (BCI), volume 1036, pages 86–91.
[Sadalage and Fowler 2012] Sadalage, P. J. and Fowler, M. (2012). NoSQL distilled: a
brief guide to the emerging world of polyglot persistence. Pearson Education.
[Viennot et al. 2015] Viennot, N., Lécuyer, M., Bell, J., Geambasu, R., and Nieh, J.
(2015). Synapse: a microservices architecture for heterogeneous-database web ap-
plications. In Proceedings of the Tenth European Conference on Computer Systems,
page 21. ACM.
[Villaca et al. 2018] Villaca, L. H., Azevedo, L. G., and Baião, F. (2018). Query strategies
on polyglot persistence in microservices. In 2018 ACM SIGAPP. ACM.
[Vinoski 2002] Vinoski, S. (2002). Putting the"web"into web services. web services in-
teraction models, part 1. IEEE Internet Computing, 6(3):89–91.
[Wampler and Clark 2010] Wampler, D. and Clark, T. (2010). Multiparadigm program-
ming: guest editors’ introduction. IEEE Software, 27(5):2–7.