You are on page 1of 18

12/07/2017 Criando micro servios com o Spring Boot | Ramos da Informtica

Livros de Programao e Informtica

Seja um Colaborador Contato Sobre ns Pesquisar Pesquisar

Banco de Dados Startup e Sucesso Notcias Programao Web Mobile

Home / Programao / Java / Criando micro servios com o Spring Boot


Pesquisar

Pesquisa personalizada

Procurar

Siga-nos os Bons!

Site Ramos da Informtica


219 curtidas

Curtir Pgina Compartilhar

Criando micro servios com o Spring Boot Seja o primeiro de seus amigos a curtir isso.

Posted on 29 de maio de 2015 by Ramos de Souza Janones in Java, Programao with 1 Comment

Compartilhe
Site Ramos da Informtica
Ontem s 04:45

O WhatsApp liberou um novo recurso


mm
Ramos De Souza Janones nesta semana que um golpe no e-mail
tradicional. O aplicativo agora permite
enviar qualquer formato de arquivo, com
O conceito de arquitetura de micro servios vem gradualmente encontrando o tamanho mximo de 100 MB. Em e-
seu espao no desenvolvimento de software. Como um sucessor da Arquitetura mails, normal que haja limite de
compartilhamento. No Gmail, por
Baseada em Servios (SOA Service Oriented Architecture), os micro servios
exemplo, o tamanho mximo por arquivo
podem ser categorizados como sistemas distribudos e usam muitos conceitos e de 25 megabytes. Os que so maiores
prticas do SOA. Eles se diferem, entretanto, no escopo da responsabilidade do que isso so compartilhados como
dada para cada servio individualmente. No SOA, um servio pode ser links pblicos do seu Google Drive, o
servio de armazenamento na nuvem do
responsvel por tratar diversas funcionalidades e domnios enquanto que uma Google, que atrelado ao Gmail. [ 132
regra geral para um micro servio que ele seja responsvel por gerenciar um more words ]
nico domnio e as funcionalidades que manipulam esse domnio. A abordagem http://www.ramosdainformatica.com.br/n
dos sistemas distribudos consistem em decompor a infraestrutura monoltica de ovo-recurso-do-whats/
um servio em subsistemas escalveis, organizados atravs de um corte vertical
envolvendo cada uma das camadas empilhadas do sistema e interconectadas por
uma camada de transporte comum.

Em uma infraestrutura monoltica os servios que compem um sistema so


organizados logicamente no mesmo cdigo fonte e unidade de instalao. Isso
permite a dependncia entre os servios que sero gerenciados dentro do
mesmo ambiente de execuo e tambm significa que modelos e recursos CURSO ONLINE:
comuns podem ser compartilhados entre os componentes do sistema. A SPRING MVC

http://www.ramosdainformatica.com.br/criando-micro-servicos-com-o-spring-boot/ 1/18
12/07/2017 Criando micro servios com o Spring Boot | Ramos da Informtica

conectividade entre subsistemas de uma infraestrutura monoltica significa que a


lgica de negcio e os dados do domnio podem ter alta reusabilidade em
abstraes e funes utilitrias, frequentemente muito acopladas, mas com uma
capacidade potencial de verificar como uma nica mudana pode afetar o
sistema inteiro. Essa vantagem vem com um preo de escalabilidade dos
componentes individuais da infraestrutura e significa que o crescimento de um
sistema se restringe aos componentes menos escalveis.

Um sistema distribudo decompe os componentes de um sistema monoltico em


unidades individuais de distribuio, capazes de evoluir com as suas prprias
exigncias de escalabilidade e independente dos outros subsistemas. Isso
significa que o impacto de um recurso no sistema como um todo pode ser
gerenciado de forma mais eficiente e a conexo entre componentes pode
compartilhar um contrato menos rgido, pois a dependncia no mais
gerenciada atravs de um ambiente de execuo. No SOA tradicional os servios
podem encapsular um conjunto de funcionalidades para uma determinada parte
do negcio, ao redor de vrios domnios. Uma arquitetura de micro servios une
o conceito de distribuio de sistemas com a promessa do gerenciamento de
uma nica regra para um nico modelo de negcio, facilitando muito a
compreenso do que um subsistema faz. Isso tambm significa que o escopo da
documentao e do teste podem ser gerenciados de forma mais fceis, ajudando
a obter uma cobertura maior nos dois casos. Curso online: Vendendo
Software 2017
Contedo relacionado de patrocinadores
Ol pessoal, estou vindo aqui atravs de
meu site, o Ramos da Informtica,
JVM e Java no QCon Rio: Modernizando o Mainstream atravs de inovaes e
apresentar uma nova proposta de um curso.
tendncias na plataforma Java e linguagens baseadas na JVM
A reformulao do Sucesso com Software,
Front-end Development no QCon Rio, explorando a web moderna em novo que agora passa a se chamar VENDENDO
patamar SOFTWARE. H o livro publicado em 2012
e de l pra c, muita coisa mudou, aprendi e
Desenvolvimento Poliglota no QCon Rio 2015: unindo foras de linguagens tive novas experincias e resolvi ao invs de
funcionais, dinmicas e hbridas atualizar o livro, criar o curso e manter ele
sempre atualizado. Quem me conhece, no
O maior QCon Rio j realizado: 15 tracks, 85 palestras, o dobro de tutoriais e
preciso de apresentao, mas caso seja
presena macia de palestrantes internacionais
novo, aqui vai um breve resumo(...) Leia
Explore no QCon Rio inovaes da computao como servio, sem abdicar de mais...
controle e segurana
Assinar o site por Email

Digite seu endereo de email para assinar este site e


Assim como no SOA, uma arquitetura de micro servios deve estar conectada receber noti caes de novas publicaes por email.

atravs de uma camada de transporte comum, e nos ltimos anos o HTTP tem
se mostrado uma tima opo para isso. Mas existem outras opes como Endereo de email

protocolos binrios de transporte ou os servios de mensageria, e a arquitetura


de micro servios no favorece e nem restringe nenhum mecanismo em Assinar
especial, exceto pela maturidade, acessibilidade e as bibliotecas que facilitam a
comunicao entre servidores. Sendo o HTTP um protocolo de transporte
maduro, com bibliotecas cliente para vrias linguagens e frameworks, isso o
torna uma excelente escolha para fazer a comunicao entre os servios. Um
ponto que a arquitetura de micro servios opina sobre o estado entre as
interaes de servios. Independente da camada de transporte, a comunicao
entre micro servios deveria ser feito sem manter informao de estado e que
sigam o paradigma RESTful. Isso significa que a requisio e a resposta de um
micro servio deve ter toda informao necessria para garantir o estado.
Simplificando, o servio no deve esperar que sejam enviadas informaes
baseadas em interaes anteriores. Implementando corretamente os servios
REST garante que o micro servio seja escalvel e que as atualizaes tenham
um mnimo de indisponibilidade.
Mais recentes
Entender os pontos que quebram um servio monoltico em micro servios pode
Novo recurso do WhatsApp um
ser difcil, especialmente em cdigo legado, com alto acoplamento e objetos de
golpe no e-mail tradicional
domnio que ultrapassam as fronteiras de servios. Como regra, uma partio 11 de julho de 2017
vertical na infraestrutura pode ser feita nas fronteiras de uma regra de negcio
em particular. Muitos micro servios podem trabalhar cooperativamente dentro Desa os no desenvolvimento de
APIs e IoT no mundo programvel
do contexto dessa partio vertical para completar uma regra de negcio.

http://www.ramosdainformatica.com.br/criando-micro-servicos-com-o-spring-boot/ 2/18
12/07/2017 Criando micro servios com o Spring Boot | Ramos da Informtica

Considere, por exemplo, a funcionalidade de um site de comrcio eletrnico que 11 de julho de 2017

define o negcio baseado em fluxo no qual o cliente acessa uma pgina de


entrada, interage com os produtos e finalmente faz a compra do produto. Esse
processo pode ser dividido na vertical para visualizar os detalhes dos produtos,
Como avaliar (e auxiliar) a sua
outra para fazer a incluso de um produto no carrinho de compras e mais uma
equipe com Entrega Contnua
para fechar o pedido para um ou mais produtos. No contexto de negcio de um 11 de julho de 2017

cliente olhando um produto, muitos micro servios podem ser envolvidos para
Resource fornece Servios de
coletar os dados usados para mostrar os detalhes de um produto em particular.
Gesto de Infraestrutura para o
Na pgina de entrada do site, por exemplo, os ttulos, figuras e preos podem Orlando City
ser mostrados para vrios produtos. A pgina pode coletar esses detalhes 10 de julho de 2017

atravs de dois micro servios de backend: um para fornecer detalhes do


Gartner anuncia que servios
produto e outro para o preo do produto. Quando um cliente escolhe um produto
mundiais de segurana baseados
em particular, o site pode adicionalmente, chamar dois outros micro servios em Nuvem crescero 21% em 2017
responsveis por obter a classificao do produto e os comentrios de clientes. 6 de julho de 2017

Assim, para acomodar a partio vertical da arquitetura responsvel pelos


Gartner anuncia Conferncia
detalhes de visualizao de produtos, essa partio deve fazer uso de quatro
Segurana & Gesto de Riscos 2017
micro servios de backend. 1 de julho de 2017

Cada micro servio da vertical de produto planejado para ajudar a criar (ISC) divulga programao do
diferentes vises do domnio do produto, sendo cada uma escalvel e disponvel Security Congress Latin America
conforme os requisitos do sistema. Pode-se assumir, por exemplo, que os 2017
28 de junho de 2017
servios responsveis por gerar os dados de uma pgina principal do site de
comrcio eletrnico precisa atender uma quantidade maior de requisies do que Grupo New Space discute fraudes
uma pgina que mostra os detalhes de um produto individualmente. Esses micro em solues de Point of Sale (PoS)
servios tambm pode ser construdos com base em diversas decises tcnicas no (ISC) Security Congress Latin
America 2017
como estratgias de cache, que no tem aplicao vlida nos servios que 28 de junho de 2017
mostram avaliaes de produtos e avaliaes feitas pelos clientes. Permitir que
cada micro servio possa ter suas caractersticas tcnicas atendidas conforme a Rockwell Collins adota a plataforma
sua funo permite que a utilizao dos recursos sejam feitas de forma mais 3DEXPERIENCE da Dassault
Systmes
eficiente. Em uma arquitetura monoltica os servios de classificao do produto 27 de junho de 2017
e avaliao dos clientes fica preso aos requisitos de escalabilidade e
disponibilidade dos servios de detalhes do produto e precificao. Gartner indica que executivos de
dados esto em ascenso
27 de junho de 2017

A complexidade de um micro servio no reflete na quantidade de linhas da sua Verint anuncia os vencedores do
implementao. Um equvoco comum que a quantidade de cdigo de um micro Engage Americas Partner Awards
servio tambm seja micro, mas isso no faz muito sentido quando considerada 2017
26 de junho de 2017
a meta que uma arquitetura de micro servios tem como objetivo atender. A
meta enderea a decomposio de servios em um sistema distribudo e a Verint anuncia os vencedores do
complexidade da sua implementao pode ser feita com o cdigo do tamanho Engage Americas Partner Awards
que for necessrio. A nomenclatura micro expressa o padro de 2017
23 de junho de 2017
responsabilidade atravs dos diferentes subsistemas, no o cdigo fonte. Dado
que a responsabilidade de um micro servio limitado uma nica fatia vertical
Software grtis do Google permite
de um sistema, o seu cdigo frequentemente conciso, de fcil compreenso e que voc treine inteligncia arti cial
possibilita a sua instalao com pequenas publicaes. Um padro positivo dos com seu PC.
22 de junho de 2017
micro servios que eles so instalados com todos os recursos necessrios para
que sejam executados. Isso significa eles possuem todo o ambiente de execuo Dynatrace apresenta como realizar
embarcado e podem ser acessados de forma autnoma, simplificando de forma a jornada de transformao para
drstica o custo associado com a sua distribuio e instalao. Cloud e tendncias de
monitoramento no AWS Summit
Histricamente, a publicao das aplicaes Web construdas em Java um 21 de junho de 2017

conto de volume, servidores de aplicao pr-configurados que recebem um


Grupo Plusoft oferece SAC 3.0 para
arquivo WAR especfico que extrado no ambiente prescrito e frequentemente atendimento ao cliente
com informao de estado. Esses servidores de aplicaes podem levar dezenas 20 de junho de 2017

de minutos para extrair o contedo do arquivo Web at comear a servir o novo


contedo da aplicao, tornando difcil de iterar nas mudanas e pouco atraente
Os mais Lidos
para ter mltiplas aplicaes de um sistema. Com o passar do tempo os
frameworks evoluram para facilitar o desenvolvimento de micro servios, assim Repensando o desenvolvimento de
como o processo de empacotamento desses artefatos para publicao. software
Atualmente, as aplicaes Web de micro servios Java so capazes de facilmente 29 de fevereiro de 2012

embarcar todo o seu ambiente de execuo em um arquivo executvel.


Manual de nitivo para desenvolver
Ambientes de execuo embarcados, como Tomcat e Jetty, so verses leves de
aplicativos mveis de sucesso
seus predecessores servidores de aplicao e geralmente capazes de iniciar em 29 de setembro de 2015
segundos. Qualquer sistema com Java instalado ento capaz de fazer a
Como comprar dlares ou fazer compras no
publicao, simplificando o processo de distribuio de novas funcionalidades.
Exterior: SEM pagar IOF + IGPM

http://www.ramosdainformatica.com.br/criando-micro-servicos-com-o-spring-boot/ 3/18
12/07/2017 Criando micro servios com o Spring Boot | Ramos da Informtica
21 de dezembro de 2015
Spring Boot
Turbinando o Delphi com
Um framework que tem evoludo consideravelmente para o desenvolvimento de
CnWizzards
micro servios Java o Spring Boot. O Spring Boot construdo em cima do 29 de fevereiro de 2012

Spring Framework, e com isso ele obtm os benefcios de sua maturidade,


escondendo a sua complexidade com instalaes opinativas que auxiliam no Lista com mais de 200 sites da Deep Web para
voc explorar
desenvolvimento de micro servios. Muito do Spring Boot foi construdo pensado
12 de agosto de 2015
na produtividade do desenvolvedor, tornando conceitos como RESTful HTTP e
ambientes de execuo de aplicaes Web embarcados fceis de conectar e usar. Curso grtis de Desenvolvimento Android para
Em muitos aspectos ele tambm atua como um micro-framework, permitindo Iniciantes e avanado do Google.
22 de julho de 2016
aos desenvolvedores escolherem quais partes do framework que precisam, sem
a necessidade de sobrecarregar o ambiente de execuo com dependncias. Isso Um guia para o Google Authorship
tambm permite que aplicaes feitas com o Spring Boot sejam empacotadas 28 de julho de 2014

em unidades menores para publicao, alm de ser capaz de usar sistemas de


SOA
montagem (build) para gerar instalveis como arquivos Java executveis (JAR). 13 de janeiro de 2016

A equipe do Spring Boot criou um site conveniente para iniciar a construo de


Criando micro servios com o Spring Boot
aplicaes, conhecido como Spring Initializr. O propsito desse site gerar a 29 de maio de 2015
configurao inicial para uma aplicao Web baseada no Spring Boot e permitir
Re exes sobre EAD Minhas experincias
que desenvolvedores escolham quais bibliotecas eles precisam em seus projetos.
como aluno e professor
Passando algumas informaes sobre o projeto e as dependncias, o site capaz 22 de julho de 2014
de gerar um arquivo ZIP do projeto baseado no Spring Boot tanto para Maven
quanto para Gradle. Isso fornece uma estrutura bsica para comear e um Oracle e Delphi
22 de dezembro de 2014
excelente ponto de partida para iniciantes do framework.

Como framework, o Spring Boot construdo como um agregado de mdulos SEO 5 passos para aumentar o trafego de seu
conhecidos como starters. Esses starters so composies de verses site
31 de julho de 2014
interoperveis de bibliotecas que podem ser usadas para fornecer alguma
funcionalidade para a aplicao. Eles tambm formam a estrutura que permitem Blue Ocean: o que a estratgia do
ao Spring Boot fazer a configurao da aplicao seguindo o modelo de oceano azul?
conveno sobre configurao, utilizado para acomodar uma arquitetura de 19 de setembro de 2015

micro servios e expondo funcionalidades chaves para os desenvolvedores de


Conhea os cursos on-line gratuitos
aplicaes. Um micro servio RESTful HTTP pode ser feito no Spring Boot oferecidos pelo ITA
incluindo os mdulos atuadores e de starters web. O starter web fornece o 8 de maio de 2016

ambiente de execuo embarcado e as funcionalidade que permitem construir a


Quais as diferenas entre
API do micro servio em cima de controladores RESTful HTTP. O mdulo atuador
integrao contnua, deploy e
serve para operacionalizar os micro servios fornecendo a estrutura e os entrega contnua
endpoints RESTful HTTP, expondo mtricas, parmetros de configurao e 2 de maro de 2017

mapeamento de componentes internos, que so teis para depurao.

Alm disso tudo que o Spring Boot fornece como framework de micro servio ele
tambm fornece um ferramental para projetos baseados no Maven e no Gradle. CURSO ONLINE:
necessrio muito pouca configurao dos plugins dessas ferramentas para SPRING MVC
empacotar o projeto em um arquivo leve e executvel. O cdigo apresentado na
Listagem 1 mostra o script de montagem Gradle, que pode ser usado como um
ponto de partida para o micro servio com o Spring Boot. A verso mais verbosa Assinar Site por Email
utilizando o Maven POM pode ser escolhido no site do Spring Initializr e revela a
necessidade de informar ao plugin a localizao da classe de inicializao da Digite seu endereo de email para assinar este site e
receber noti caes de novas publicaes por email.
aplicao. Essa configurao no necessria com o Gradle, pois o plugin
descobrir a localizao dessa classe. Junte-se a 44 outros assinantes

1 <span style="font-family: verdana, geneva, sans-serif; font-size: 12pt;">buildscript {


2 repositories { Endereo de email
3 jcenter()
4 }
5 dependencies { Assinar
6 classpath 'org.springframework.boot:spring-boot-gradle-plugin:1.2.0.RELEASE'
7 }
8 }
9 apply plugin: 'spring-boot'
10 repositories {
11 jcenter()
12 }
13 dependencies {
14 compile "org.springframework.boot:spring-boot-starter-actuator"
15 compile "org.springframework.boot:spring-boot-starter-web"
16 }
17 </span>

Listagem 1 Script de montagem do Gradle.

Com o Spring Initializr possvel gerar um projeto e verificar a sua estrutura



geral, que segue basicamente a estrutura convencional de layout baseado no

http://www.ramosdainformatica.com.br/criando-micro-servicos-com-o-spring-boot/ 4/18
12/07/2017 Criando micro servios com o Spring Boot | Ramos da Informtica

Maven. O cdigo fonte deve ficar no diretrio src/main/java para ser compilado
corretamente. O projeto deve fornecer um ponto de entrada da aplicao. No
projeto gerado pelo Spring Initializr h o arquivo DemoApplication.java que
funciona como esse ponto de entrada. O nome dessa classe indiferente e
chamando-a de Main suficiente. O exemplo na Listagem 2.2 mostra o mnimo
de cdigo necessrio para iniciar o desenvolvimento de um micro servio.

1 <span style="font-family: verdana, geneva, sans-serif; font-size: 12pt;">import org.springframework


2 import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
3 @EnableAutoConfiguration
4 public class Main {
5 public static void main(String[] args) {
6 SpringApplication.run(Main.class);
7 }
8 }
9 </span>

Listagem 1.1 Ponto de entrada da aplicao Spring Boot.

Na Listagem 1.1 notamos o uso da anotao @EnableAutoConfiguration que


instrui o Spring Boot a inicializar, configurar e executar a aplicao. Para
inicializar a aplicao ele utiliza o modelo de conveno sobre configurao,
procurando na classes do classpath tudo que os micro servios precisam ter. No
exemplo anterior os micro servios incluram os mdulos atuador e web, ento o
framework determinar que o projeto um micro servio e iniciar um continer
Tomcat embarcado e comea a servir os endpoints pr-configurados. O cdigo
no exemplo anterior no faz muita coisa, mas ao execut-lo sero revelados os
endpoints operacionais expostos pelo atuador. Importando o projeto em
qualquer IDE permitir que o micro servio seja inicializado executando a classe
Main. Alternativamente, a aplicao pode ser executada a partir da linha de
comando, executando o comando gradle bootRun do Gradle ou mvn spring-
boot:run do Maven, conforme a configurao escolhida para o projeto.

Trabalhando com Dados

Com base na fatia vertical de produto citado anteriormente, considere o servio


de detalhe de produto que, junto do servio de precificao, fornece os detalhes
que sero mostrados nessa pgina. Em termos das responsabilidades dos micro
servios, seu domnio ser um subconjunto de atributos do produto, mais
especificamente seu nome, descrio curta, descrio completa e um id. Esse
detalhes pode ser modelados como o JavaBean apresentado na Listagem 1.2.

1 <span style="font-family: verdana, geneva, sans-serif; font-size: 12pt;">import javax.persistence


2 import javax.persistence.Id;
3 @Entity
4 public class ProductDetail {
5 @Id
6 private String productId;
7 private String productName;
8 private String shortDescription;
9 private String longDescription;
10 private String inventoryId;
11 public String getProductId() {
12 return productId;
13 }
14 public void setProductId(String productId) {
15 this.productId = productId;
16 }
17 public String getProductName() {
18 return productName;
19 }
20 public void setProductName(String productName) {
21 this.productName = productName;
22 }
23 public String getShortDescription() {
24 return shortDescription;
25 }
26 public void setShortDescription(String shortDescription) {
27 this.shortDescription = shortDescription;
28 }
29 public String getLongDescription() {
30 return longDescription;
31 }
32 public void setLongDescription(String longDescription) {
33 this.longDescription = longDescription;
34 }
35 public String getInventoryId() {
36 return inventoryId;
37 }
38 public void setInventoryId(String inventoryId) {
39 this.inventoryId = inventoryId;
40 }
41 }
42 </span>

http://www.ramosdainformatica.com.br/criando-micro-servicos-com-o-spring-boot/ 5/18
12/07/2017 Criando micro servios com o Spring Boot | Ramos da Informtica

Listagem 1.2 POJO de produto.

importante perceber que o JavaBean ProductDetail usa as anotaes do JPA


para indicar que ele uma entidade. O Spring Boot fornece um starter para
trabalhar com entidades JPA e fontes de dados para bancos de dados relacionais.
Considerando o script da Listagem 1, podemos adicionar na seo
dependencies os mdulos Spring Boot Starter para trabalhar com Datasets
persistentes, como mostrado na Listagem 1.3.

1 <span style="font-family: verdana, geneva, sans-serif; font-size: 12pt;">dependencies {


2 compile "org.springframework.boot:spring-boot-starter-actuator"
3 compile "org.springframework.boot:spring-boot-starter-web"
4 compile "org.springframework.boot:spring-boot-starter-data-jpa"
5 compile 'com.h2database:h2:1.4.184'
6 }
7 </span>

Listagem 1.3 Dependncias do Spring Boot no script de montagem.

Com essas dependncias o projeto agora tambm inclui o banco de dados H2


embarcado. O mecanismo de autoconfigurao do Spring Boot identificar que o
H2 est no classpath e ir gerar a estrutura de tabela necessria para a entidade
ProductDetail. Nos bastidores o Spring Boot est orientando o Spring Data a
usar o seu Mapeamento Objeto Relacional da mesma forma que podemos
influenciar as suas convenes e mecanismos para trabalhar com bancos de
dados. Uma abstrao conveniente do Spring Data o conceito de repositrio,
que essencialmente um Data Access Object (DAO) configurado e disponvel
para ser acessado via injeo. Para obter uma funcionalidade de CRUD para a
entidade ProductDetail necessrio somente criar uma interface e estend-la de
CrudRepository do Spring Data, como mostrado na Listagem 1.4.

1 <span style="font-family: verdana, geneva, sans-serif; font-size: 12pt;">import org.springframework


2 import org.springframework.stereotype.Repository;
3 @Repository
4 public interface ProductDetailRepository extends CrudRepository &lt;productdetail, string
5 }
6 </span>

Listagem 1.4 Data Access Object (Spring Data Repository) de Product


Detail.

A anotao @Repository na interface informa ao Spring que deve ser respeitado


nessa classe o seu papel especializado de DAO. A anotao tambm serve como
um mecanismo pelo qual podemos informar ao framework para
automaticamente configur-lo no micro servio permitindo que ele seja acessado
pela injeo de dependncia. Para que essa funcionalidade esteja disponvel no
Spring necessrio usar a anotao @ComponentScan na classe principal da
Listagem 1.1. Quando o micro servio inicializado, o Spring buscar no
classpath da aplicao pelos componentes e os deixar disponveis para a
injeo de dependncia dentro da aplicao.

Para demonstrar as novas capacidades do micro servio, considere o cdigo da


Listagem 1.5 que utiliza o ApplicationContext do Spring dentro do mtodo main.

1 <span style="font-family: verdana, geneva, sans-serif; font-size: 12pt;">import org.springframework


2 import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
3 import org.springframework.context.ApplicationContext;
4 import org.springframework.context.annotation.ComponentScan;
5 @ComponentScan
6 @EnableAutoConfiguration
7 public class Main {
8 public static void main(String[] args) {
9 ApplicationContext ctx = SpringApplication.run(Main.class);
10 ProductDetail detail = new ProductDetail();
11 detail.setProductId("ABCD1234");
12 detail.setProductName("O livro de Dan sobre a escrita");
13 detail.setShortDescription("Um livro sobre como escrever livros.");
14 detail.setLongDescription("Neste livro Dan apresenta ao leitor tcnicas sobre como escrever livros."
15 detail.setInventoryId("009178461");
16 ProductDetailRepository repository = ctx.getBean(ProductDetailRepository.class)
17 repository.save(detail);
18 for (ProductDetail productDetail : repository.findAll()) {
19 System.out.println(productDetail.getProductId());
20 }
21 }
22 }
23 </span>

Listagem 1.5 Demonstrao de acesso a dados.

http://www.ramosdainformatica.com.br/criando-micro-servicos-com-o-spring-boot/ 6/18
12/07/2017 Criando micro servios com o Spring Boot | Ramos da Informtica

Nesse exemplo um objeto ProductDetail preenchido com alguns dados, o


ProductDetailRepository usado para salvar os detalhes e em seguida ele
usado novamente para consultar os detalhes no banco de dados. Alm disso,
nenhuma configurao adicional necessria para fazer o micro servio
funcionar com persistncia. Podemos usar o cdigo de prottipo na Listagem 1.5
como base para definir o contrato da API RESTful HTTP atravs do mecanismo
@RestController do Spring.

Definindo a API

Para o micro servio de product detail suficiente expor algumas capacidades


simples de CRUD, mas ele tambm poder fornecer algumas funcionalidades
estendidas, como paginao e filtros. A API de produtos pode ser iniciada com
um simples controlador que o Spring utilizar para mapear a rota HTTP. A
Listagem 1.6 mostra um cdigo que serve como ponto de partida e expe os
mtodos create e findAll e demonstra a funcionalidade que foi prototipada no
exemplo anterior.

1 <span style="font-family: verdana, geneva, sans-serif; font-size: 12pt;">import org.springframework


2 import org.springframework.web.bind.annotation.*;
3 @RestController
4 @RequestMapping("/products")
5 public class ProductDetailController {
6 private final ProductDetailRepository repository;
7 @Autowired
8 public ProductDetailController(ProductDetailRepository repository) {
9 this.repository = repository;
10 }
11 @RequestMapping(method = RequestMethod.GET)
12 public Iterable findAll() {
13 return repository.findAll();
14 }
15 @RequestMapping(method = RequestMethod.POST)
16 public ProductDetail create(@RequestBody ProductDetail detail) {
17 return repository.save(detail);
18 }
19 }
20 </span>

Listagem 1.6 Controlador de produtos.

A anotao @RestController do Spring informa que ele deve fazer a serializao


e a vinculao (binding) de parmetros. Adicionalmente, para os servios de
criao necessrio anotar os parmetros com @RequestBody, como no mtodo
create, para que o Spring os preencha automaticamente. O objeto ProductDetail
pode ento ser salvo com o ProductDetailRepository injetado. O Spring Boot
decora essas funcionalidades com alguns conversores de dados que usam o
Jackson para converter os objetos de ProductDetail em JSON para os
consumidores da API do microservio. Baseado no exemplo no Controlador da
Listagem 1.6, se o servio receber um contedo JSON, como mostrado na
Listagem 1.7, no endpoint /products, o detalhe do produto ser criado.

1 <span style="font-family: verdana, geneva, sans-serif; font-size: 12pt;">{


2 "productId": "DEF0000",
3 "productName": "MakerBot",
4 "shortDescription": "Um produto que faz outros produtos",
5 "longDescription": "Esta uma descrio completa para um MarkerBot, que basicamente um produto que faz outros produtos."
6 "inventoryId": "00854321"
7 }
8 </span>

Listagem 1.7 JSON representando a estrutura do Produto.

Fazendo uma requisio GET no controlador de produtos ser mostrado o


produto recm criado.

Vincular os dados aos parmetros e persistir uma entidade posteriormente pode


ser o nico caso de uso para um funcionalidade e criao de um micro servio.
mais provvel, contudo, que o servio precise executar alguma regra de negcio
para garantir que os dados fornecidos so consistentes. Isso pode ser feito com
o framework de validao interna do Spring que garante que os detalhes do
produto em relao lgica de negcios do micro servio so consistentes
durante a vinculao. O cdigo da Listagem 1.8 mostra a implementao do
validador de ProductDetail, que usa outro micro servio para determinar a
validade do ID fornecido.

1 <span style="font-family: verdana, geneva, sans-serif; font-size: 12pt;">import org.springframework


2 import org.springframework.stereotype.Component;
3 import org.springframework.validation.*;

http://www.ramosdainformatica.com.br/criando-micro-servicos-com-o-spring-boot/ 7/18
12/07/2017 Criando micro servios com o Spring Boot | Ramos da Informtica
4 @Component
5 public class ProductDetailValidator implements Validator {
6 private final InventoryService inventoryService;
7 @Autowired
8 public ProductDetailValidator(InventoryService inventoryService) {
9 this.inventoryService = inventoryService;
10 }
11 @Override
12 public boolean supports(Classclazz) {
13 return ProductDetail.class.isAssignableFrom(clazz);
14 }
15 @Override
16 public void validate(Object target, Errors errors) {
17 ProductDetail detail = (ProductDetail)target;
18 if (!inventoryService.isValidInventory(detail.getInventoryId())) {
19 errors.rejectValue("inventoryId", "inventory.id.invalid", "ID de Estoque invlido"
20 }
21 }
22 }
23 </span>

Listagem 1.8 Validador do produto.

O InventoryService nesse exemplo est bem superficial, mas ele pode ser visto
como um mecanismo para fazer validao de dados que flexvel e capaz de
consultar outros micro servios que possuem conhecimento a respeito de algum
subconjunto do domnio de dados.

Para usar o ProductDetailValidator em tempo de vinculao necessrio


registr-lo com o DataBinder do Spring, no contexto do controlador. O cdigo do
controlador alterado mostrado na Listagem 1.9, com o validador sendo
injetado e ento registrado na sequncia com o DataBinder atravs do mtodo
initBinder. A anotao @InitBinder nesse mtodo informa ao Spring que
queremos personalizar o DataBinder padro para essa classe. Adicionalmente,
perceba a anotao @Valid que agora aplicada ao objeto ProductDetail no
mtodo create. Essa anotao informa o DataBinder que desejamos fazer a
validao do contedo da requisio durante a vinculao dos dados. O validador
padro do Spring tambm fornecer validao em atributos segundo as JSR-303
e JSR 349 (Bean Validation).

1 <span style="font-family: verdana, geneva, sans-serif; font-size: 12pt;">import org.springframework


2 import org.springframework.web.bind.WebDataBinder;
3 import org.springframework.web.bind.annotation.*;
4 import javax.validation.Valid;
5 @RestController
6 @RequestMapping("/products")
7 public class ProductDetailController {
8 private final ProductDetailRepository repository;
9 private final ProductDetailValidator validator;
10 @Autowired
11 public ProductDetailController(ProductDetailRepository repository, ProductDetailValidator
12 this.repository = repository;
13 this.validator = validator;
14 }
15 @InitBinder
16 protected void initBinder(WebDataBinder binder) {
17 binder.addValidators(validator);
18 }
19 @RequestMapping(method = RequestMethod.GET)
20 public Iterable findAll() {
21 return repository.findAll();
22 }
23 @RequestMapping(method = RequestMethod.POST)
24 public ProductDetail create(@RequestBody @Valid ProductDetail detail) {
25 return repository.save(detail);
26 }
27 }
28 </span>

Listagem 1.9 Controlador de produtos atualizado com o validador.

Se um consumidor da API mandar um POST contendo um JSON com um ID de


inventrio invlido, o Spring identificar a falha de validao e devolver ao
consumidor um cdigo HTTP 400 (Bad Request). Uma vez que o controlador est
anotado com @RestController, o Spring poderia tambm serializar
apropriadamente a falha de validao em uma estrutura que o consumidor
estivesse esperando. Como desenvolveres de micro servios, no precisamos
fazer nenhuma configurao adicional para termos acesso essa funcionalidade.

No exemplo do site de comrcio eletrnico, o micro servio de detalhes de


produtos com uma API REST de CRUD simples no de grande valor. O servio
tambm precisar fornecer a habilidade de paginao e ordenao da lista de
produtos, bem como fornecer alguma capacidade de busca. Para disponibilizar
essas funcionalidades, o mtodo findAll no controlador ProductDetailController

http://www.ramosdainformatica.com.br/criando-micro-servicos-com-o-spring-boot/ 8/18
12/07/2017 Criando micro servios com o Spring Boot | Ramos da Informtica

pode ser modificado para aceitar parmetros na requisio que limitam a


consulta. Para essa tarefa pode ser usado o PagingAndSortingRepository do
Spring Data que fornecer essas habilidades de paginao e ordenao durante
a chamada do findAll no repositrio. O ProductDetailRepository precisa ser
modificado para herdar seu novo tipo, como mostrado na Listagem 1.10.

1 <span style="font-family: verdana, geneva, sans-serif; font-size: 12pt;">import org.springframework


2 import org.springframework.stereotype.Repository;
3 import java.util.List;
4 @Repository
5 public interface ProductDetailRepository extends PagingAndSortingRepository&lt;productdetail
6 }
7 </span>

Listagem 1.10 ProductDetailRepository atualizado com suporte a


paginao e ordenao.

O cdigo na Listagem 1.11 mostra a ao findAll do controlador usando as novas


habilidades de paginao e ordenao do repositrio. Uma requisio feita no
endpoint /products da API, fornecendo os parmetros page=0 e count=20
devolver os primeiros 20 produtos do banco de dados. Nesse exemplo, o cdigo
utiliza um padro do Spring que permite especificar valores padres para
parmetros de consulta, tornando a maioria deles opcional.

1 <span style="font-family: verdana, geneva, sans-serif; font-size: 12pt;">@RequestMapping


2 public Iterable findAll(@RequestParam(value = "page", defaultValue = "0", required = false
3 @RequestParam(value = "count", defaultValue = "10", required = false) int count,
4 @RequestParam(value = "order", defaultValue = "ASC", required = false) Sort.Direction
5 @RequestParam(value = "sort", defaultValue = "productName", required = false) String
6 Page result = repository.findAll(new PageRequest(page, count, new Sort(direction, sortProperty
7 return result.getContent();
8 }
9 </span>

Listagem 1.11 findAll atualizado na ProductDetailController, agora


com paginao e ordenao.

Quando um usurio do site de comrcio eletrnico chega em uma pgina de


entrada, ela pode trazer 10 ou 20 produtos e posteriormente carregar mais 50
aps a rolagem da pgina ou aps algum tempo. Disponibilizando a
funcionalidade de paginao permite ao consumidor controlar a quantidade de
dados devolvida durante uma determinada requisio. A verso completa de
ProductDetailController apresentada na Listagem 1.12.

1 <span style="font-family: verdana, geneva, sans-serif; font-size: 12pt;">import com.fasterxml


2 import org.springframework.beans.MutablePropertyValues;
3 import org.springframework.beans.factory.annotation.Autowired;
4 import org.springframework.data.domain.*;
5 import org.springframework.http.*;
6 import org.springframework.validation.DataBinder;
7 import org.springframework.web.bind.WebDataBinder;
8 import org.springframework.web.bind.annotation.*;
9 import javax.servlet.http.HttpServletRequest;
10 import javax.validation.Valid;
11 import java.io.IOException;
12 @RestController
13 @RequestMapping("/products")
14 public class ProductDetailController {
15 private final ProductDetailRepository repository;
16 private final ProductDetailValidator validator;
17 private final ObjectMapper objectMapper;
18 @Autowired
19 public ProductDetailController(ProductDetailRepository repository, ProductDetailValidator
20 this.repository = repository;
21 this.validator = validator;
22 this.objectMapper = objectMapper;
23 }
24 @InitBinder
25 protected void initBinder(WebDataBinder binder) {
26 binder.addValidators(validator);
27 }
28 @RequestMapping(method = RequestMethod.GET)
29 public Iterable findAll(@RequestParam(value = "page", defaultValue = "0", required
30 @RequestParam(value = "count", defaultValue = "10", required = false) int count,
31 @RequestParam(value = "order", defaultValue = "ASC", required = false) Sort.Direction
32 @RequestParam(value = "sort", defaultValue = "productName", required = false) String
33 Page result = repository.findAll(new PageRequest(page, count, new Sort(direction
34 return result.getContent();
35 }
36 @RequestMapping(value = "/{id}", method = RequestMethod.GET)
37 public ProductDetail find(@PathVariable String id) {
38 ProductDetail detail = repository.findOne(id);
39 if (detail == null) {
40 throw new ProductNotFoundException();
41 } else {
42 return detail;
43 }
44 }
45 @RequestMapping(method = RequestMethod.POST)
46 public ProductDetail create(@RequestBody @Valid ProductDetail detail) {

http://www.ramosdainformatica.com.br/criando-micro-servicos-com-o-spring-boot/ 9/18
12/07/2017 Criando micro servios com o Spring Boot | Ramos da Informtica
47 return repository.save(detail);
48 }
49 @RequestMapping(value = "/{id}", method = RequestMethod.PUT)
50 public HttpEntity update(@PathVariable String id, HttpServletRequest request) throws
51 ProductDetail existing = find(id);
52 ProductDetail updated = objectMapper.readerForUpdating(existing).readValue(request
53 MutablePropertyValues propertyValues = new MutablePropertyValues();
54 propertyValues.add("productId", updated.getProductId());
55 propertyValues.add("productName", updated.getProductName());
56 propertyValues.add("shortDescription", updated.getShortDescription());
57 propertyValues.add("longDescription", updated.getLongDescription());
58 propertyValues.add("inventoryId", updated.getInventoryId());
59 DataBinder binder = new DataBinder(updated);
60 binder.addValidators(validator);
61 binder.bind(propertyValues);
62 binder.validate();
63 if (binder.getBindingResult().hasErrors()) {
64 return new ResponseEntity&lt;&gt;(binder.getBindingResult().getAllErrors(),
65 } else {
66 return new ResponseEntity&lt;&gt;(updated, HttpStatus.ACCEPTED);
67 }
68 }
69 @RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
70 public HttpEntity delete(@PathVariable String id) {
71 ProductDetail detail = find(id);
72 repository.delete(detail);
73 return new ResponseEntity&lt;&gt;(HttpStatus.ACCEPTED);
74 }
75 @ResponseStatus(HttpStatus.NOT_FOUND)
76 static class ProductNotFoundException extends RuntimeException {
77 }
78 }
79 </span>

Listagem 1.12 Verso completa de ProductDetailsController.

Alm de paginao e ordenao, o site de comrcio eletrnico precisar expor


alguma funcionalidade parecida com um motor de busca. Como cada micro
servio fatiado verticalmente mantm seu prprio subconjunto de dados do
domnio, faz sentido que eles gerenciem as prprias buscas. Ele tambm permite
aos consumidores que as buscas sejam feitas assincronamente por vrias
propriedades do domnio de dados.

O Spring Data permite que consultas personalizadas sejam associadas s


assinaturas de mtodos anexadas interface do repositrio. Isso significa que o
repositrio pode ter uma consulta JPA que busca um subconjunto de
propriedades de cada detalhe de produto salvo no banco, permitindo ao micro
servio executar algumas buscas primitivas. O ProductDetailRepository
modificado na Listagem 1.13 para incorporar um mtodo search, que recebe um
termo de busca e tenta combin-lo com o nome do produto ou a descrio
longa. Uma lista de resultados devolvida ao consumidor.

1 <span style="font-family: verdana, geneva, sans-serif; font-size: 12pt;">import org.springframework


2 import org.springframework.data.repository.PagingAndSortingRepository;
3 import org.springframework.stereotype.Repository;
4 import java.util.List;
5 @Repository
6 public interface ProductDetailRepository extends PagingAndSortingRepository&lt;productdetail
7 @Query("select p from ProductDetail p where UPPER(p.productName) like UPPER(?1) or "
8 "UPPER(p.longDescription) like UPPER(?1)")
9 List search(String term);
10 }
11 </span>

Listagem 1.13 Consulta personalizada no ProductDetailRepository.

Para disponibilizar essa funcionalidade de busca, podemos construir outro


RestController e mape-lo ao endpoint /search, como mostrado na Listagem
1.14.

1 <span style="font-family: verdana, geneva, sans-serif; font-size: 12pt;">import org.springframework


2 import org.springframework.web.bind.annotation.*;
3 import java.util.ArrayList;
4 import java.util.List;
5 @RestController
6 @RequestMapping("/search")
7 public class ProductDetailSearchController {
8 private final ProductDetailRepository repository;
9 @Autowired
10 public ProductDetailSearchController(ProductDetailRepository repository) {
11 this.repository = repository;
12 }
13 @RequestMapping(method = RequestMethod.GET)
14 public List search(@RequestParam("q") String queryTerm) {
15 List productDetails = repository.search("%"+queryTerm+"%");
16 return productDetails == null ? new ArrayList&lt;&gt;() : productDetails;
17 }
18 }
19 </span>

http://www.ramosdainformatica.com.br/criando-micro-servicos-com-o-spring-boot/ 10/18
12/07/2017 Criando micro servios com o Spring Boot | Ramos da Informtica

Listagem 1.14 Controlador de busca para ProductDetails.

Uma evoluo futura no ProductDetailSearchController pode ser a


implementao de paginao e ordenao da mesma forma que
ProductDetailController faz.

Configurao

As configuraes do Spring Boot permitem aos micro servios ir muito longe e


em alguns casos sem a necessidade de sobrescrever absolutamente nada.
Quando um servio tiver que ir para produo, certas propriedade, como a porta
que o continer embarcado usar, pode precisar ser derivada no ambiente de
execuo ou baseada em alguma influncia externa. O Spring Boot fornece aos
desenvolvedores de micro servios vrias maneiras de sobrescrever suas
configuraes padres, e o framework entende que a configurao pode vir de
muitas fontes.

Relacionado configurao dos micro servios importante considerar o


ambiente de execuo. Se ele for instalado em uma infraestrutura esttica,
ento correto pr-definir certas configuraes. Considere o exemplo anterior
que o Datasource do micro servio era uma instncia do H2. Em um ambiente de
produo o micro servio pode apontar para uma fonte de dados persistente,
como um banco de dados MySQL ou Oracle, de forma que aplicao dever ser
configurada com a URL de conexo apropriada, usurio, senha e com o driver
JDBC apropriado. Com uma infraestrutura esttica esses valores podem ser pr-
definidos e empacotados com a aplicao. O Spring Boot pode carregar essas
configuraces de arquivos de propriedade, arquivos XML de configurao ou
YAML, e procurar por arquivos de configurao na raiz do classpath, em
arquivos com o nome application.properties, application.xml ou application.yml
(application.yaml), respectivamente. Para uma configurao pr-definida, o
arquivo de propriedades na Listagem 1.15 mostra a configurao que
sobrescrever a configuraco padro.

1 <span style="font-family: verdana, geneva, sans-serif; font-size: 12pt;">spring.datasource


2 spring.datasource.username=root
3 spring.datasource.password=
4 spring.datasource.driver-class-name=com.mysql.jdbc.Driver
5 </span>

Listagem 1.15 Arquivo de configurao para uma fonte de dados.

Uma habilidade importante no mecanismo de configurao do Spring Boot que


as configuraes podem ser sobrescritas pelas propriedades de sistema do Java,
fornecidas na inicializao. Qualquer configurao fornecida na inicializao da
JVM ir sobrepor a que foi definida no arquivos application.properties encontrado
no classpath. Isso significa que o ambiente de execuo pode definir a
configurao baseada em aspectos desconhecidos durante o empacotamento do
micro servio. Por exemplo, se o micro servio est sendo executado em um
ambiente mais dinmico, como na nuvem, a mquina de banco de dados pode
ser definida conforme a localizao da VM ou do continer. Isso pode ficar
acessvel aplicao atravs de variveis de ambiente. Essas variveis de
ambiente podem ser consumidas e expostas facilmente atravs de parmetros
de inicializao da JVM ou diretamente junto da configurao. Nesse ltimo caso,
a notao do Spring para acessar propriedades pode ser usada para obter essas
configuraes. O arquivo de configurao mostrado na Listagem 1.16 uma
verso modificada da Listagem 1.15, mas desta vez utilizando a notao do
Spring com valor padro.

1 <span style="font-family: verdana, geneva, sans-serif; font-size: 12pt;">spring.datasource


2 spring.datasource.username=${JDBC_USER:root}
3 spring.datasource.password=${JDBC_PASS:}
4 spring.datasource.driver-class-name=com.mysql.jdbc.Driver
5 </span>

Listagem 1.16 Arquivo de configurao atualizado para utilizar


variveis de ambiente com valores padres.

O Spring Boot procura no sistema de arquivos um diretrio chamado config,


relativo ao diretrio de inicializao. Nesse diretrio ele procura pela mesma
sequncia de arquivos de configurao e se encontrar ele carregar essas
configuraes primeiro, antes de aplicar qualquer configurao encontrada no

http://www.ramosdainformatica.com.br/criando-micro-servicos-com-o-spring-boot/ 11/18
12/07/2017 Criando micro servios com o Spring Boot | Ramos da Informtica

classpath. A propriedade Java de sistema spring.config.location tambm pode


ser usada para informar ao Spring o arquivo de configurao. Por exemplo, se as
configuraes do micro servio estiverem em /etc/spring/boot.yml, especificando
-Dspring.config.location=/etc/spring/boot.yml far com que o Spring carregue
as configuraes desse arquivo. Recursos no classpath podem ser carregador
pelo mesmo mecanismo, somente adicionando o prefixo classpath: no valor da
propriedade.

A porta do servidor embarcado pode tambm ser configurado pelo mesmo


mecanismo, atravs da propriedade server.port. Essa possibilidade de extrema
importncia quando executa em um ambiente PaaS, como Heroku, que mapeia
faixas de portas e as expem atravs de variveis de ambiente. Diretivas de
configurao como essas mostradas na Listagem 1.16 podem ser usadas para
mapear a varivel de ambiente PORT. Listagem 1.17 mostra essa configurao.

1 <span style="font-family: verdana, geneva, sans-serif; font-size: 12pt;">server.port=${PORT


2 </span>

Listagem 1.17 Configurao usada para mapear a porta conforme a


varivel de ambiente.

Empacotamento

Uma vez que o micro servio est pronto para ser instalado, o ferramental do
Spring Boot ajuda a gerar um artefato leve e executvel. Como citado
anteriormente, o Spring Boot fornece plugins para ambos Gradle e Maven, que
permitem criar um arquivo JAR executvel para distribuio. Usando o mesmo
script de construo do Gradle mostrado nas listagens anteriores, o arquivo JAR
pode ser construdo executando o seguinte comando: gradle build. O Spring
Boot intercepta a tarefa jar e reempacota o artefato gerado como um novo
arquivo contendo todas as dependncias, chamado de gordo ou uber JAR.
Com o Maven, a meta goal ser interceptada pelo plugin do Spring Boot e
executar a mesma operao.

O plugin do Gradle para o Spring Boot tem um benefcio adicional que a


integrao com o plugin da aplicao, que gera um arquivo tar com todas as
dependncia empacotadas e com scripts de inicializao para variantes Unix a
Windows. Esse mtodo de empacotamento ideal para fazer a instalao porque
todos os scripts de inicializao j estaro escritos para o micro servio. O
arquivo tar pode ser extrado no servidor destino e o micro servio iniciado
atravs do script com o nome do projeto no diretrio bin.

Embora a instalao de forma autnoma a forma preferida e geralmente a


melhor unidade instalvel aceita para um micro servio, nada especifica
estritamente que eles devem ser executados de forma autnoma. As aplicaes
do Spring Boot tambm podem ser empacotadas com arquivos WAR e instalados
em um continer. O script de construo do Gradle precisar ser modificado para
usar o plugin war, como mostrado na Listagem 1.18. Similar ao anterior, a
tarefa build produzir o artefato web.

1 <span style="font-family: verdana, geneva, sans-serif; font-size: 12pt;">buildscript {


2 repositories {
3 jcenter()
4 }
5 dependencies {
6 classpath 'org.springframework.boot:spring-boot-gradle-plugin:1.2.0.RELEASE'
7 }
8 }
9 apply plugin: 'spring-boot'
10 apply plugin: 'war'
11 repositories {
12 jcenter()
13 }
14 dependencies {
15 compile "org.springframework.boot:spring-boot-starter-actuator"
16 compile "org.springframework.boot:spring-boot-starter-web"
17 compile "org.springframework.boot:spring-boot-starter-data-jpa"
18 compile 'mysql:mysql-connector-java:5.1.34'
19 }
20 </span>

Listagem 1.18 Script de montagem do Gradle com os plugins do Spring


Boot e o War usados.

http://www.ramosdainformatica.com.br/criando-micro-servicos-com-o-spring-boot/ 12/18
12/07/2017 Criando micro servios com o Spring Boot | Ramos da Informtica

No projeto Maven, o empacotamento pode ser feito mudando a configurao de


empacotamento do pom.xml do projeto. O trecho de cdigo na Listagem 1.19
mostra a configurao modificada.

1 <span style="font-family: verdana, geneva, sans-serif; font-size: 12pt;">&lt;?xml version


2 &lt;project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
4 &lt;modelVersion&gt;4.0.0&lt;/modelVersion&gt;
5 &lt;groupId&gt;com.infoq&lt;/groupId&gt;
6 &lt;artifactId&gt;sb-microservices&lt;/artifactId&gt;
7 &lt;version&gt;0.1.0&lt;/version&gt;
8 &lt;packaging&gt;war&lt;/packaging&gt;
9 &lt;!-- ...o restante foi omitido para manter a brevidade ... --&gt;
10 &lt;/project&gt;
11 </span>

Listagem 1.19 Inicio do pom.xml do Maven configurado para


empacotar o projeto como war.

API de Gateway

Os passos para construo do micro servio de detalhes do produto que foi


explorado em detalhes nas sees anteriores podem ser aplicado de forma
similar a outros servios em cada uma das fatias verticais do site de comrcio
eletrnico. Uma vez que os componentes foram decompostos em colees de
micro servios, o sistema ento visto como sendo completamente distribudo
com uma infraestrutura de micro servios. Contudo, isso apresenta algumas
complicaes para os consumidores externos, tal como a pgina de entrada do
site que precisa consumir dados vindos de diversos micro servios diferentes.
Sem nenhum mecanismos para recompor os servios em uma API
aparentemente monoltica, o nus de acessar os dados separadamente e
recomp-los em estruturas usveis estaria em cada consumidor da API. Isso
pode ser muito custoso aos consumidores que podem precisar estabelecer
potencialmente dezenas de conexes HTTP para agregar alguns conjuntos de
dados. Isso tambm significa que se algum dos servios esto indisponveis e
cabe a cada consumidor fazer um tratamento especfico para esse caso.

Um padro emergente para a infraestrutura de micro servios traz a ideia de um


servio de API de Gateway que opera na frente dos diversos servios de backend
para fornecer uma API compreensiva e facilmente consumvel. Seguindo pelo
exemplo do site de comrcio eletrnico, quando um visitante do site decide
visualizar os detalhes de um produto h quatro servios envolvidos para se obter
todos os dados da visualizao. Ao invs do servio responsvel por gerar a
pgina chamar cada um desses servios, ele poderia acessar um endpoint da
API de Gateway e ela, por sua vez, faria as chamadas e combinaria os
resultados para a pgina. Da perspectiva da pagina Web, somente uma chamada
feita e tudo que for necessrio para obter os dados fica fora do seu escopo.

Um ganho adicional nessa estratgia que o dado trafegado entre o consumidor


e o servio de backend se torna mais apropriado. Por exemplo, o servio de
Gateway pode ter alguma lgica em sua camada de servio para reconhecer
quando um grande volume de requisies est sendo feita para os detalhes de
um produto especfico e, ao invs de chamar o micro servio de detalhes do
produto em cada requisio, ele pode decidir servir o dado a partir de um cache
por algum perodo de tempo pr-definido. Esse efeito pode melhorar
dramaticamente o desempenho e reduzir a carga de rede.

Outro ponto igualmente importante a abstrao da disponibilidade de servios


de backend. O Gateway de servios pode ser capaz de tomar decises
inteligentes sobre qual dado servir na situao de um servio backend no estar
acessvel. H diversas opes para fazer isso, mas talvez o mecanismo mais
interessante para garantir a durabilidade de sistemas distribudos no Gateway de
servios uma biblioteca do Netflix chamada Hystrix. H muitas funcionalidades
no Hystrix que garantem a tolerncia a falhas e fornecem otimizaes para altos
volumes de requisies, mas talvez a sua funcionalidade mais interessante seja
o padro de circuit breaker. Especificamente, o Hystrix verifica quando um link
para um servio de backend est inacessvel e, ao invs de bombardear o
servio indisponvel com um trfego de rede e esperar por timeouts, ele abre o
circuito do servio, delegando chamadas subsequentes a um mtodo de
contingncia. Em detalhes, o Hystrix periodicamente verifica a conexo para

http://www.ramosdainformatica.com.br/criando-micro-servicos-com-o-spring-boot/ 13/18
12/07/2017 Criando micro servios com o Spring Boot | Ramos da Informtica

saber se o servio de backend voltou a um estado operacional e caso isso tenha


acontecido reestabelece a conexo.

Quando o circuito est aberto, o Gateway de servio pode devolver qualquer


resposta que ele escolha como apropriada para os consumidores. Isso pode
incluir o ltimo dado consistente, talvez uma resposta vazia com algum
cabealho indicando ao consumidores que o circuito do backend est aberto ou
talvez alguma combinao dos dois. A resilincia que o Hystrix fornece um
componente crtico em qualquer sistema distribudo no trivial. Para entender
um pouco melhor o Hystrix, considere novamente o fatiamento vertical de
produto do site de comrcio eletrnico, com seus quatro servios que devem ser
chamados para obter os detalhes de um produto em uma pgina. A Listagem
1.20 mostra uma possvel implementao do ProductService dentro da API de
servios do Gateway.

1 <span style="font-family: verdana, geneva, sans-serif; font-size: 12pt;">import com.netflix


2 import org.springframework.beans.factory.annotation.Autowired;
3 import org.springframework.cache.annotation.Cacheable;
4 import org.springframework.stereotype.Service;
5 import java.util.*;
6 import java.util.concurrent.*;
7 @Service
8 public class ProductService {
9 private static final String GROUP = "products";
10 private static final int TIMEOUT = 60000;
11 private final ProductDetailService productDetailService;
12 private final ProductPricingService productPricingService;
13 private final ProductRatingService productRatingService;
14 private final ProductReviewService productReviewService;
15 @Autowired
16 public ProductService(ProductDetailService productDetailService, ProductPricingService
17 ProductRatingService productRatingService, ProductReviewService
18 this.productDetailService = productDetailService;
19 this.productPricingService = productPricingService;
20 this.productRatingService = productRatingService;
21 this.productReviewService = productReviewService;
22 }
23 public Map&lt;string, object=""&gt;&gt; getProductSummary(String productId) {
24 List&gt; callables = new ArrayList&lt;&gt;();
25 callables.add(new BackendServiceCallable("details", getProductDetails(productId
26 callables.add(new BackendServiceCallable("pricing", getProductPricing(productId
27 return doBackendAsyncServiceCall(callables);
28 }
29 public Map&lt;string, object=""&gt;&gt; getProduct(String productId) {
30 List&gt; callables = new ArrayList&lt;&gt;();
31 callables.add(new BackendServiceCallable("details", getProductDetails(productId
32 callables.add(new BackendServiceCallable("pricing", getProductPricing(productId
33 callables.add(new BackendServiceCallable("ratings", getProductRatings(productId
34 callables.add(new BackendServiceCallable("reviews", getProductReviews(productId
35 return doBackendAsyncServiceCall(callables);
36 }
37 private static Map&lt;string, object=""&gt;&gt; doBackendAsyncServiceCall(List&gt;
38 ExecutorService executorService = Executors.newFixedThreadPool(4);
39 try {
40 List&gt; futures = executorService.invokeAll(callables);
41 executorService.shutdown();
42 executorService.awaitTermination(TIMEOUT, TimeUnit.MILLISECONDS);
43 Map&lt;string, object=""&gt;&gt; result = new HashMap&lt;&gt;();
44 for (Future future : futures) {
45 AsyncResponse response = future.get();
46 result.put(response.serviceKey, response.response);
47 }
48 return result;
49 } catch (InterruptedException|ExecutionException e) {
50 throw new RuntimeException(e);
51 }
52 }
53 @Cacheable
54 private HystrixCommand
55 <map>&lt;string, object=""&gt;&gt; getProductDetails(String productId) {
56 return new HystrixCommand
57 <map>&lt;string, object=""&gt;&gt;(
58 HystrixCommand.Setter
59 .withGroupKey(HystrixCommandGroupKey.Factory.asKey(GROUP))
60 .andCommandKey(HystrixCommandKey.Factory.asKey("getProductDetails"
61 .andCommandPropertiesDefaults(
62 HystrixCommandProperties.Setter()
63 .withExecutionIsolationThreadTimeoutInMilliseconds
64 )
65 ) {
66 @Override
67 protected Map&lt;string, object=""&gt; run() throws Exception {
68 return productDetailService.getDetails(productId);
69 }
70 @Override
71 protected Map getFallback() {
72 return new HashMap&lt;&gt;();
73 }
74 };
75 }
76 private HystrixCommand
77 <map>&lt;string, object=""&gt;&gt; getProductPricing(String productId) {
78 // ... veja getProductDetails() ...
79 }
80 private HystrixCommand
81 <map>&lt;string, object=""&gt;&gt; getProductRatings(String productId) {

http://www.ramosdainformatica.com.br/criando-micro-servicos-com-o-spring-boot/ 14/18
12/07/2017 Criando micro servios com o Spring Boot | Ramos da Informtica
82 // ... veja getProductDetails() ...
83 }
84 private HystrixCommand
85 <map>&lt;string, object=""&gt;&gt; getProductReviews(String productId) {
86 // ... veja getProductDetails() ...
87 }
88 private static class AsyncResponse {
89 private final String serviceKey;
90 private final Map&lt;string, object=""&gt; response;
91 AsyncResponse(String serviceKey, Map&lt;string, object=""&gt; response) {
92 this.serviceKey = serviceKey;
93 this.response = response;
94 }
95 }
96 private static class BackendServiceCallable implements Callable {
97 private final String serviceKey;
98 private final HystrixCommand
99 <map>&lt;string, object=""&gt;&gt; hystrixCommand;
100 public BackendServiceCallable(String serviceKey, HystrixCommand
101 <map>&lt;string, object=""&gt;&gt; hystrixCommand) {
102 this.serviceKey = serviceKey;
103 this.hystrixCommand = hystrixCommand;
104 }
105 @Override
106 public AsyncResponse call() throws Exception {
107 return new AsyncResponse(serviceKey, hystrixCommand.execute());
108 }
109 }
110 }
111 </map>
112 &lt;string,&gt;
113 </map>
114 &lt;string,&gt;
115 </map>
116 &lt;string,&gt;
117 </map>
118 &lt;string,&gt;
119 </map>
120 &lt;string,&gt;
121 </map>
122 &lt;string,&gt;
123 </map></span>

<string,>

LEIA TAMBM: 7 coisas simples em PHP que alguns ainda


complicam

Powered byInline Related Posts

Listing 1.20 Exemplo do servio da API de Gateway assncrona e


usando Hystrix.

Os servios apresentados nos exemplos devem ser considerados clientes RESTful


HTTP, possivelmente construdos em cima do RestTemplate do Spring ou
qualquer outro cliente HTTP, como o Retrofit. O getProductSummary() faz uma
chamada assncrona aos servios de backend necessrios para obter os detalhes
do produto na pgina de entrada do site. Similarmente, o getProduct() chama
assncronamente todos os servios do backend para obter os detalhes de um
produto e devolve essa informao para os consumidores da API. Nesse
exemplo, os detalhes sobre um produto raramente sero alterados, e por essa
razo faz sentido para o servio de Gateway reduzir o volume de chamadas aos
servios de backend quando possvel, ento o mtodo getProductDetails() usa a
anotao @Cacheable do Spring para garantir que o resultado dessas chamadas
sero armazenadas no cache por um perodo de tempo apropriado. O servio de
Gateway devolve os dados atravs de um RestController que mapeia para
/products. Endpoints similares poderiam ser construdos para todas as fatias
verticais da arquitetura de micro servios e os consumidores da API do sistema
poderiam ser capazes de acess-la da mesma forma que eles faziam em uma
aplicao monoltica tradicional.

Concluso

O Spring Boot reconhece desde o incio os benefcios de decompor servios


monolticos em micro servios distribudos. Ele foi projetado para tornar o
desenvolvimento e a construo de micro servios centrado em recursos e no
desenvolvedor. Fornecendo mdulos pr-definidos que possibilitam a
autoconfigurao dentro do framework, permite que as aplicaes se liguem a
um poderoso subconjunto de funcionalidades que de outra forma precisariam de
configuraes explcitas e feita programaticamente. Esses mdulos
autoconfigurados podem servir como base para uma infra-estrutura
compreensiva de micro servios, incluindo uma API de Gateway de servios.

http://www.ramosdainformatica.com.br/criando-micro-servicos-com-o-spring-boot/ 15/18
12/07/2017 Criando micro servios com o Spring Boot | Ramos da Informtica

Sobre o autor

Daniel Woods especialista e entusiasta de tecnologicas JEE,


Groovy e Grails. Ele trabalha com desenvolvimento de software h
aproximadamente uma dcada, construindo software para a JVM e compartilha a
sua experincia em projetos de cdigo aberto como Grailse Ratpack. Dan foi
palestrante nas conferncias Gr8conf e SpringOne 2GX, nas quais ele mostrou a
sua experincia em arquiteturas de aplicaes corporativas para JVM.

Ah, se gostou deste artigo, vai adorar este livro:

Livro do curso: Marketing para Empresas e Pro ssonas


de Software
capalivro Esta obra tem como objetivo levar o leitor
a pensar sobre todas as estratgias de
mercado a m de se destacar da
concorrncia no setor de software,
aumentando suas chances de vendas.

Em todos os captulos do livro h estudos


de casos, contedos complementares e
dicas de ferramentas que tornam a obra
completa, levando o leitor a uma re exo
de todo seu negcio e tornando-o
competitivo e lucrativo.

Mais sobre o livro.

Compartilhe isso:

Imprimir Compartilhar 1 Share 2 Tweetar Compartilhar 1

Curtir isso:

Carregando...

Relacionado

SOA Gartner identi ca as 10


Atualmente, fala-se muito em Principais Tendncias
necessidade de alinhamento Tecnolgicas Estratgicas para
da Tecnologia da 2017
Informao(TI) com as Analistas apresentam as
estratgias de negocio, e o principais tendncias da
paradigma de orientao a indstria no simpsio do O que programao
Gartner/ITxpo 2016 O Gartner, orientada a agentes?
Inc., lder mundial em pesquisa
e aconselhamento imparcial
Tagged Desenvolvimento java spring

Previous Next
O futuro do C#: Tuplas e estruturas annimas Saia da zona de conforto antes que voc seja
chutado fora dela!

Compartilhe.

Compartilhar 1 Tweetar 1 Share 2

Related Posts

http://www.ramosdainformatica.com.br/criando-micro-servicos-com-o-spring-boot/ 16/18
12/07/2017 Criando micro servios com o Spring Boot | Ramos da Informtica

Como Manipular
Datas com PHP
Como criar arquivos PESQUISA: Torne-se
ZIP em PHP e extra- um Parceiro de nossa
los loja Virtual vendendo
para Desenvolvedores
de Software

Planilhas Excel Prontas


Planilhas feitas por Consultores Teste Gratuitamente. Cadastre-se luz.vc/Planilhas-Empresariais

0 Comentrios Ramos da Informtica


1 Entrar

Ordenar por Mais votados


Recomendar Compartilhar

Iniciar a discusso...

FAZER LOGIN COM

OU REGISTRE-SE NO DISQUS ?

Nome

Seja o primeiro a comentar.

TAMBM EM RAMOS DA INFORMTICA

Lista com mais de 200 sites da Deep Curso grtis de Desenvolvimento


Web para voc explorar Android para Iniciantes e avanado do
2 comentrios um ano atrs 2 comentrios um ano atrs
Robert Pereira alguem me add em ramosinfo Muito bom!
grupos da deep web 7199415566 por favor

Como comprar dlares ou fazer compras Repensando o desenvolvimento de


no Exterior: SEM pagar IOF + IGPM software
1 comentrio um ano atrs 1 comentrio um ano atrs
twitter/@CaioUechi Ramos, fiz varias Silvio Delgado Quer gerenciar
comparaes e essa conta no fecha. No gratuitamente e de forma gil e fcil seus
adianta nada no pagar as taxas do projetos? www.meuscrum.com

Mais Recentes Assinar Site por Email Banco de Dados Mais Lidos
- Firebird
Novo recurso do Digite seu endereo de email para Repensando o
WhatsApp um golpe assinar este site e receber noti caes de desenvolvimento de
- MySQL
no e-mail tradicional novas publicaes por email. software
11 de julho de 2017 - Oracle 29 de fevereiro de 2012
Endereo de email
Desa os no - SQL Server Manual de nitivo para
desenvolvimento de desenvolver
APIs e IoT no mundo Assinar Startup e Sucesso aplicativos mveis de
programvel sucesso
- Marketing Digital
11 de julho de 2017 29 de setembro de 2015

- Carreira
Como avaliar (e Como comprar dlares ou fazer
auxiliar) a sua equipe - Sucesso com Software compras no Exterior: SEM pagar
com Entrega Contnua IOF + IGPM
11 de julho de 2017 - Vida & Produtividade 21 de dezembro de 2015

Resource fornece Notcias Turbinando o Delphi


Servios de Gesto de com CnWizzards
Infraestrutura para o - Livros 29 de fevereiro de 2012

Orlando City
- Destaques
10 de julho de 2017 Lista com mais de 200 sites da
Deep Web para voc explorar
- Downloads
Gartner anuncia que 12 de agosto de 2015
servios mundiais de
Programao
segurana baseados

http://www.ramosdainformatica.com.br/criando-micro-servicos-com-o-spring-boot/ 17/18
12/07/2017 Criando micro servios com o Spring Boot | Ramos da Informtica
em Nuvem crescero - .Net Curso grtis de Desenvolvimento
21% em 2017
Android para Iniciantes e avanado
6 de julho de 2017 - Delphi
do Google.
22 de julho de 2016
Gartner anuncia - Engenharia
Conferncia
Um guia para o Google Authorship
Segurana & Gesto - Java
28 de julho de 2014
de Riscos 2017
1 de julho de 2017 - Agile
SOA
13 de janeiro de 2016
(ISC) divulga Web

programao do
- SEO Criando micro servios com o
Security Congress
Spring Boot
Latin America 2017 - Segurana 29 de maio de 2015
28 de junho de 2017
- Linux Re exes sobre EAD Minhas
Grupo New Space
experincias como aluno e
discute fraudes em Mobile
professor
solues de Point of
22 de julho de 2014
Sale (PoS) no (ISC) - Android

Security Congress Oracle e Delphi


- iOS
Latin America 2017 22 de dezembro de 2014
28 de junho de 2017
- Ionic Framework

Rockwell Collins adota - Intel XDK


a plataforma
3DEXPERIENCE da
Dassault Systmes
27 de junho de 2017

Gartner indica que


executivos de dados
esto em ascenso
27 de junho de 2017

Verint anuncia os
vencedores do Engage
Americas Partner
Awards 2017
26 de junho de 2017

Seja um Colaborador

Contato

Sobre ns

2013 Ramos da Informtica. Todos os direitos reservados. Por que Timon & Pumba um desenho multiplataforma? Porque tem JAVAli. ;OP

CURSO ONLINE: SPRING MVC No perca tempo e aprenda a


desenvolver do zero, passo a passo.
cafe.algaworks.com

http://www.ramosdainformatica.com.br/criando-micro-servicos-com-o-spring-boot/ 18/18

You might also like