Microservices - Registro de serviços e descobertas

Por Gaspar Barancelli Junior em 22 de fevereiro de 2023

Esse é o segundo post sobre microservices.

  1. Configurações

  2. Registro de serviços e descobertas

  3. Roteamento dinâmico

  4. Comunicação

  5. Falhas

  6. Rastreamento

  7. Logs

  8. Documentações

  9. Monitoramento

  10. Migração

  11. Segurança

  12. Implantação

  13. Orquestração

Criei uma apresentação bem simples comentando sobre algumas ferramentas que veremos ao longo dessa série sobre microservices, a apresentação esta pública e disponível para visualização através deste link.

Para facilitar os seus estudos e o entendimento sobre todos os posts que serão abordados, eu desenvolvi alguns projetos utilizando todas as ferramentas mencionadas na apresentação, então aproveita e dá uma olhada nos fontes, eles estão hospedados nesse repositório no github.

Registros e descobertas de serviços

O Service Discovery é um dos princípios-chave de uma arquitetura baseada em microservices, pois podemos ter inúmeros serviços sendo executados, com diversas réplicas dos mesmos sendo escaladas, bem como diversas versões rodando em paralelo e até mesmo em vários ambientes, sendo que esses serviços provavelmente não serão executados na mesma máquina, mas sim em maquinas diferentes e até mesmo em zonas diferentes para garantir a alta disponibilidade da sua aplicação, então quando houver uma comunicação entre serviços o ideal é que ela seja feito através do nome dos serviços, e que seja possível distribuir essas requisições por um balanceador de carga.

Este post vai abordar o uso do Eureka como ferramenta para Service Discovery, pois é uma das ferramentas mais utilizadas no mercado de microservices, esta ferramenta é open source e desenvolvida pela Netflix.

O Eureka é um servidor que pode ser configurado e implantado para ter alta disponibilidade, com cada servidor replicando estado sobre os serviços registrados para os demais servidores. O módulo do Spring Cloud Eureka também disponibiliza um artefato utilizado pelas aplicações clientes, que são os microservices que se registram no servidor Eureka. Quando um cliente se registra no Eureka, ele fornece metadados sobre si mesmo, como host, porta, URL do indicador de saúde, home page e outros detalhes. O Eureka recebe mensagens de batimentos cardíacos de cada instância pertencente a um serviço. Se o batimento cardíaco falhar em um cronograma configurável, a instância será normalmente removida do registro.

Criando nosso servidor de registros e descoberta de serviços

Vamos criar um novo projeto utilizando o Spring Boot, para isso acesse o endereço https://start.spring.io/ e adicione as seguintes dependências Config Client e Eureka Server, já as demais configurações ficam a sua escolha.

1

Após adicionarmos as dependências podemos gerar o nosso projeto. Assim que o download for concluído, descompacte o diretório contendo o projeto e acesse os fontes na sua IDE preferida.

Configurando o projeto

Para configuração deste serviço vamos utilizar o Config Server que desenvolvemos no post anterior, mas para isso devemos definir um nome para a nossa nova aplicação e adicionar uma simples configuração apontando para o link do Config Server. Todas essas definições devem ser adicionadas no arquivo bootstrap.properties, pois este arquivo é responsável pelo carregamento de configurações externas em projetos Spring Boot, e deve ser adicionado dentro da pasta resources do nosso projeto.

spring.application.name=discovery
spring.cloud.config.uri=${CONFIG_SERVER_URL:http://localhost:8888}
spring.cloud.config.fail-fast=true

Segue uma breve explicação sobre as configurações adicionadas:

  • Spring.application.name: Definimos o nome da nossa aplicação.

  • Spring.cloud.config.uri: Apontamos para o endereço do Config Server.

  • Spring.cloud.config.fail-fast: Especificamos que caso o Config Server não responda a nossa aplicação deve lançar uma exceção e falhar.

Agora que já sabemos o nome do nosso serviço e também já configuramos a utilização do Config Server, devemos criar um arquivo properties com o mesmo nome atribuído ao serviço, que neste caso será chamado de discovery.properties, este arquivo deve ser adicionado dentro do repositório git configurado no Config Server, e deve ter o seguinte conteúdo.

server.port=8761
eureka.instance.preferIpAddress=true
eureka.client.registerWithEureka=false
eureka.client.fetchRegistry=false

Segue uma breve explicação sobre as configurações adicionadas:

  • server.port: Porta em que o servidor http vai responder as requisiçoes.

  • eureka.instance.preferIpAddress: Como nossa aplicação vai rodar locamente queremos que os endereços de ips das maquinas sejam registradas no eureka e não o seu host name.

  • eureka.client.registerWithEureka: Neste primeiro momento não queremos que o eureka se registre nele mesmo.

  • eureka.client.fetchRegistry: Como não vamos registrar a nossa aplicação no eureka não faz sentido armazenar localmente as informações de registros do servidor.

O último passo da configuração mas não menos importante, é adicionar a anotação @EnableEurekaServer na nossa classe main.

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@SpringBootApplication
@EnableEurekaServer
public class DiscoveryApplication {

    public static void main(String[] args) {
        SpringApplication.run(DiscoveryApplication.class, args);
    }
}

Executando o serviço

Com tudo configurado agora podemos iniciar nossa aplicação, para isso execute o método main da classe DiscoveryApplication, ou gere o artefato da aplicação utilizando o seguinte comando do maven mvn package e depois acesse a pasta target pelo terminal e execute o seguinte comando java -jar discovery-1.0.jar, observe o número da versão no final do artefato, no meu repositório do github defini o Discovery com a versão 1, mas caso tenha criado um novo projeto utilize a versão que está declara no arquivo pom.xml.

Ao iniciar a aplicação observe com atenção os seguintes logs e perceba que o serviço quando iniciado fez uma chamada ao Config Server para obter as configurações da aplicação:

Fetching config from server at : http://localhost:8888

Located environment: name=discovery, profiles=[default], label=null,  version=02f616d19f74437e1106285e8819c8c5bf1dd0cc, state=null

Located property source: [BootstrapPropertySource {name='bootstrapProperties-configClient'}, BootstrapPropertySource {name='bootstrapProperties-https://github.com/gasparbarancelli/microservices.git/properties/discovery.properties'}, BootstrapPropertySource {name='bootstrapProperties-https://github.com/gasparbarancelli/microservices.git/properties/application.properties'}]

Testando o serviço

Vamos acessar o seguinte endereço no navegador http://localhost:8761/.

2

Caso a pagina acima for renderizada, sua aplicação foi iniciada com sucesso, mas observe que nenhum serviço está registrado, isso porque no futuro vamos desenvolver os serviços que se registraram no eureka, mas segue uma imagem contendo os serviços que iremos desenvolver ao long dos posts sobre microservices.

3

Resumo

Neste post criamos um servidor de registro e descoberta de serviços utilizando o Spring Cloud Eureka Server, e também fizemos o uso do Config Server para obtermos as configurações necessárias para subir nosso serviço. Assim como o Config Server este novo servidor é a base para todos os outros serviços, pois todos serão registrados no Eureka.

No próximo post vamos criar um servidor de roteamento dinâmico, este novo serviço vai fazer o uso do nosso servidor de configuração distribuída e também vai se registrar no eureka, este servidor será responsável por realizar o balanceamento das requisições feitas aos nossos microservices, que serão desenvolvidos na sequência, então fica ligado no blog e qualquer sugestão entre em contato pelas redes sociais.

// Livros recomendados relacionados ao assunto do post

// Compartilhe esse Post