Spring Cloud: arquitetura utilizando Service Discovery - Parte 1

Marcelo Villas Bôas Magrinelli
Equals Lab
Published in
5 min readMay 31, 2020

Durante toda a minha carreira como desenvolvedor de software, sempre utilizei Spring Boot + Java. Tenho um pensamento que para melhorar o meu trabalho e a qualidade dele, preciso realizar estudos e consequentemente compartilhá-los para que eu possa ser mais produtivo e fixar mais ainda aquilo que aprendi.

Após todo este tempo estudando e praticando da maneira que for possível, vi que precisaria sair do projeto Spring Boot e começar a utilizar um outro projeto que traz facilidade para o desenvolvimento de aplicações em nuvem, o Spring Cloud.

Neste artigo, estarei demonstrando um pouco do meu estudo com Spring Cloud e como realizei e criei uma arquitetura onde as aplicações se registram em um Service Discovery, realizam a busca de suas propriedade em um server e a criação de um gateway para centralizar as comunicações com nossos microserviços.

Service Discovery

Estarei utilizando neste projeto como Service Discovery o projeto Spring Cloud Netflix, este projeto nos disponibiliza o Eureka, uma aplicação que tem a capacidade de centralizar todos os outros serviços e com isso informar para os demais a sua localização de forma fácil.

O trabalho de um Service Discovery é extremamente importante quando sua arquitetura está voltada para microsserviço e não estão localizados em um mesmo host. Quando temos tudo em único lugar é simples realizar a comunicação entre eles, sempre saberemos o host e apenas mudaremos a porta que será usada. Em um ambiente cloud, quando algumas de nossas aplicações começam a se espalhar, precisamos sempre saber a sua localização para que a comunicação entre os serviços seja efetiva (o host — IP pode ser diferente).

Quando utilizamos uma aplicação para identificar estas informações na gestão da comunicação entre os serviços, nosso trabalho se torna mais rápido e fácil. É aí que entra o Eureka!

Eureka Instances Dashboard

Na imagem anterior, podemos ver o dashboard do Eureka informando que há uma aplicação registrada. Na tabela que lista as aplicações, temos as seguintes informações:

  • Application: Esta informação é retirada do valor inserido na propriedade "spring.application.name" inserida na aplicação.
  • AMIs: É uma abreviação Amazon Machine Image.
  • Availability Zones: São as regiões onde estão localizados os datacenters da cloud.
  • Status: Informar a saúde da aplicação, juntamente com seu IP, Nome da aplicação e a porta que está utilizando.

Outros dados também são demonstrados no dashboard do Eureka, porém iremos nos focar principalmente neste ponto apenas.

Criando um Service Discovery com Spring

Para criar nosso Service Discovery, o primeiro passo será acessar o site Spring Initializr, que é um serviço do Spring para a criação de projetos de forma rápida.

Spring Initializr

Após selecionar todas as dependências que você deseja e inserir ou escolher as informações do projeto, é preciso apertar o botão "Generate" e o projeto será criado e download iniciado de maneira automática. Após isso é apenas exportar e utilizar a sua IDE de preferência para realizar as configurações necessárias.

Configurando Server

Com o projeto em mãos, precisa realizar as configurações necessárias para que ele seja o Service Discovery que desejamos, para isso precisamos fazer os seguintes passos.

Para habilitar nossa aplicação como um Eureka server, precisamos inserir a anotação @EnableEurekaServer em nossa classe principal.

Essa anotação faz com que toda a nossa aplicação comece a ter um comportamento de um server e tenha todas as funcionalidades de um Service Discovery. Apenas esta configuração é necessária para já começar a utilizar a aplicação? Não, não é. Vários erros serão retornados caso você tente realizar a inicialização. Estes erros estão relacionados a ele não conseguir se conectar com outras réplicas. Para solucionar este caso, precisamos inserir as seguintes propriedades:

Eureka Server properties.yml
  • eureka.client.register-with-eureka: Esta propriedade indica se esta instância deverá se registrar ou não com um Eureka server.
  • eureka.client.fetch-registry: Informar se a sua aplicação deve ou não buscar informações de Eureka server.

Com esta configurações, sua aplicação já deve estar funcionando normalmente e tendo o comportamento que desejamos. Lembrando que estas propriedades estão sendo inseridas com estes valores apenas por questões didáticas, pensando em um ambiente de produção, cada um deve entender e configurar sua aplicação de acordo com sua realidade.

Configurando Client

Agora que temos o nosso server funcionando corretamente, nós precisamos realizar as configurações nas outras aplicações para que ela se registrem e tenham suas informações compartilhadas.

Utilize o site do Spring Initializr para criar uma nova aplicação, porém será preciso selecionar a dependência "Eureka Discovery Client". Com ela nós conseguiremos fazer com que nossas aplicações tenham o comportamento que desejamos.

Para habilitar o cliente do Eureka, precisamos inserir a anotação @EnableDiscoveryClient. Esta anotação possibilita que a aplicação consiga se comunicar com qualquer Service Discovery, mas caso você tenha certeza que será utilizado o Eureka, há a anotação @EnableEurekaClient que também nos dará o mesmo comportamento. Fica a seu critério qual utilizar.

Classe principal da aplicação
application.yml

A propriedade eureka.client.serviceUrl.defaultZone nos direciona para qual Eureka server a aplicação deverá se comunicar. Com estas duas simples modificações em seu projeto já é possível inicializar e ver que agora ele será registrado e mostrado no dashboard do nosso Eureka server.

Podemos ver que muitas configurações são abstraídas pelo Spring Cloud. Este comportamento é buscado pelas pessoas que o desenvolveram, remover ao máximo o tempo que o desenvolvedor fica realizando configurações e tendo o seu tempo completamente focado no desenvolvimento.

Service Discovery é um tema bem interessante de se estudar e entender, como falei no começo desta publicação, quanto mais você desejar separar sua aplicação e colocá-las em diferentes lugares, utilizá-lo com o Eureka, Consul, entre outros.

O primeiro objetivo do projeto foi alcançado. Nossa próxima etapa será configurar uma API simples e um gateway se integrando diretamente através do nosso Service Discovery que fizemos agora.

Nosso objetivo final é chegar a uma arquitetura semelhante a esta imagem:

Criando uma arquitetura simples na AWS com uma máquina EC2 e realizando todas as configurações de rede para que possamos acessar nossas aplicações de onde quisermos apenas pelo nosso gateway e tendo a possibilidade de armazenar as configurações no GitHub ou em um S3.

Vamos andando que ainda há muito aprendizado para compartilhar. Até a próxima!

--

--