/Desenvolvimento-de-aplicacao-em-nuvem-escalavel

Microservices are a software architecture in which applications are divided into independent components, each responsible for a specific task and communicating with each other through APIs.

Primary LanguageJava

Desenvolvimento de aplicação em nuvem escalável

Continuous Integration with Github

Visão Geral

Projeto envolve o desenvolvimento de uma aplicação/sistema para uma livraria online que possui alcance mundial. Alto desempenho e capacidade de escalabilidade são demandas cruciais para lidar com um cenário de escala mundial. Para atender a essas necessidades, a modelo arquitetural de microsserviços é adotada.

Imagine que temos um cliente que quer informações sobre um livro, como o título, o autor, a data de lançamento e o preço. Mas, o preço está em dólar e precisamos vender em diferentes mercados. Para isso, precisamos fazer um cálculo para converter o preço em moeda local e considerar impostos e outras coisas que podem afetar o preço final.

O projeto é composto por dois serviços: Book Service e Câmbio Service.

Frank-gif

O Book Service é responsável por fornecer informações detalhadas sobre um livro, como o título, o autor, a data de lançamento e o preço.

Frank-gif

Frank-gif

O Câmbio Service é responsável por fornecer informações sobre as taxas de câmbio e converter o preço do livro para a moeda local do cliente, levando em consideração impostos e outras taxas aplicáveis.

Frank-gif

O projeto usa Spring Boot para gerenciar os microsserviços e Spring Cloud para gerenciar a comunicação entre os serviços. O Eureka é utilizado como servidor de descoberta de serviços.

Estrutura do projeto

Frank-gif

Spring Cloud: É um conjunto de bibliotecas que ajudam a criar sistemas distribuídos baseados em microsserviços. Ele fornece soluções para problemas comuns, como balanceamento de carga, descoberta de serviços, configuração, monitoramento e muito mais. Informações sobre o Spring Cloud podem ser encontradas: Clicando aqui

Spring Cloud LoadBalancer: É uma biblioteca que fornece uma abstração para balanceamento de carga em sistemas distribuídos. Ele pode ser usado para implementar balanceadores de carga em nível de serviço ou em nível de aplicação. Informações sobre o Spring Cloud LoadBalancer podem ser encontradas: Clicando aqui

Spring Cloud Gateway: É uma biblioteca que fornece uma solução para a criação de gateways de API. Ele permite que os desenvolvedores criem proxies de API personalizados para seus serviços, onde podem gerenciar o tráfego e aplicar políticas de segurança e autorização. Informações sobre o Spring Cloud Gateway podem ser encontradas: Clicando aqui

Netflix Eureka: É uma biblioteca de registro e descoberta de serviços. Ele permite que os microsserviços se registrem em um registro centralizado, onde podem ser descobertos e consumidos por outros serviços. Informações sobre o Netflix Eureka podem ser encontradas: Clicando aqui

Resilience4j: É uma biblioteca que fornece recursos para tornar aplicativos resilientes e tolerantes a falhas, por meio da implementação de padrões de design, como Circuit Breaker, Retry, Rate Limiter, Bulkhead e TimeLimiter. Informações sobre o Resilience4j podem ser encontradas : Clicando aqui

Feign: É uma biblioteca que permite aos desenvolvedores criar clientes HTTP declarativamente em Java. É uma solução eficaz para chamar serviços RESTful e pode ser usado em conjunto com outras bibliotecas do ecossistema Spring. Informações sobre o Feign podem ser encontradas: Clicando aqui

Spring Boot Actuator: É uma biblioteca que fornece recursos para monitorar e gerenciar a aplicação em tempo de execução. Ele expõe endpoints HTTP que fornecem informações sobre a aplicação, como saúde, métricas, estado do thread e muito mais. Os desenvolvedores podem usar esses endpoints para monitorar e gerenciar a aplicação em tempo real. O Spring Boot Actuator é muito útil em ambientes de produção, pois fornece informações valiosas sobre o estado da aplicação e ajuda os desenvolvedores a diagnosticar problemas em tempo hábil. Informações sobre o Spring Boot Actuator podem ser encontradas: Clicando aqui

Spring Rabbit: É uma biblioteca que fornece uma abstração para o uso do protocolo AMQP (Advanced Message Queuing Protocol) em aplicativos Spring. Ele permite que os desenvolvedores enviem e recebam mensagens de forma assíncrona entre os serviços. Informações sobre o Spring Rabbit podem ser encontradas: Clicando aqui

Spring Cloud Starter Sleuth: É uma biblioteca que fornece recursos de rastreamento distribuído para microsserviços. Ele gera um ID de rastreamento exclusivo para cada solicitação de serviço e permite que os desenvolvedores vejam todo o caminho de execução da solicitação em todos os serviços envolvidos. Informações sobre o Spring Cloud Starter Sleuth podem ser encontradas: Clicando aqui

OpenAPI UI: É uma biblioteca que gera documentação interativa para APIs RESTful, usando a especificação OpenAPI (anteriormente conhecida como Swagger, que é uma biblioteca que fornece uma estrutura para criar documentação e clientes para APIs RESTful. Ele permite que os desenvolvedores criem documentação clara e legível para suas APIs e gere clientes para várias plataformas). Basicamente ele ajuda os desenvolvedores a criar documentação clara e legível para suas APIs. Informações sobre o OpenAPI UI podem ser encontradas: Clicando aqui

MySQL Connector/J: É uma biblioteca que fornece um driver JDBC para o banco de dados MySQL. Ele permite que os desenvolvedores se conectem ao banco de dados MySQL e executem consultas e operações. Informações sobre o MySQL Connector/J podem ser encontradas: Clicando aqui

Flyway: É uma biblioteca de migração de banco de dados que permite que os desenvolvedores gerenciem a evolução do esquema do banco de dados de forma programática. Ele automatiza o processo de aplicação de alterações de esquema em um banco de dados e fornece um controle de versão dos scripts de migração. Com o Flyway, os desenvolvedores podem aplicar e reverter facilmente alterações de esquema em um banco de dados sem se preocupar com a sincronização manual de vários bancos de dados. Ele também é compatível com vários bancos de dados, o que o torna uma ferramenta muito útil para equipes que trabalham com vários bancos de dados diferentes. Informações sobre o Flyway podem ser encontradas: Clicando aqui

Zipkin: É uma biblioteca que fornece recursos de rastreamento distribuído usando o Zipkin, um sistema de rastreamento distribuído de código aberto. Ele permite que os desenvolvedores vejam o caminho de execução de uma solicitação em todos os serviços envolvidos em uma interface visual. Com a utilização da biblioteca Zipkin, torna-se mais fácil detectar gargalos em sistemas distribuídos, pois é possível identificar quais serviços estão consumindo mais recursos ou causando lentidão na transação. Além disso, a biblioteca permite a identificação de erros em um ambiente distribuído, tornando mais fácil a depuração e resolução de problemas. Informações sobre o Zipkin podem ser encontradas: Clicando aqui

Frank-gif

Frank-gif

Arquitetura

O projeto segue uma arquitetura de microsserviços, em que cada serviço é independente e se comunica com outros serviços por meio de APIs RESTful. Cada serviço tem sua própria base de dados para armazenar e gerenciar seus dados.

Stack do projeto

Stack necessária desse projeto para desenvolvimento de microsserviços com Spring Boot, Spring Cloud e Docker:

  • Java (conhecimento básico)
  • Spring Boot (conhecimento básico)
  • Spring Cloud (conhecimento básico)
  • Feign
  • Netflix Eureka (Service Discovery e Service Registry)
  • Spring Cloud LoadBalancer (Load Balancing)
  • Spring Cloud Gateway (API Gateway e RouteLocator)
  • Resilience4j (Circuit Breaker)
  • Spring Cloud Config Server (configuração centralizada)
  • SQL e banco de dados relacional (conhecimento básico)
  • Linux (conhecimento básico)
  • Docker (conhecimento básico)
  • Github (conta necessária)

Além disso, é abordados conceitos de Distributed Tracing com Docker, Zipkin, Eureka e Sleuth e a configuração do Swagger OpenAPI nos microsserviços. É recomendado estar familiarizado e confortável com a linha de comando e ter noções básicas de API's RESTful.

O projeto foi desenvolvido na versão 2.7.10 das dependências.

Como executar o projeto:

Endpoints

Os endpoints abaixo estão disponíveis nos serviços do projeto:

Frank-gif

Acessar os endpoints via Gateway

Caminhos(padrão) para acessar a documentação em JSON (Swagger) das aplicações sem GATEWAY:

Caminhos para acessar a documentação GRÁFICA (Swagger) das aplicações:

Caminho para acessar a documentação dos serviços via GATEWAY

Caminho padrão de acesso ao Zipkin

Caminho padrão de acesso ao Eureka

http://localhost:8761

Configuração para buildar uma imagem da aplicação direto do Intellij

  • Utilizar o plugin registry ao invés do local repository em Modify options, e executar como Maven Project; ou
  • Executar o comando mvn spring-boot:build-image -DskipTests, na pasta do projeto (projeto api-gateway por exemplo)

Alguns comandos

Para este projeto de microsserviço é necessário JRE, Maven, Java IDE, MySQL, Docker.

docker run -p 9411:9411 -d openzipkin/zipkin:2.23.2

<build>
	<plugins>
		<plugin>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-maven-plugin</artifactId>
			<configuration>
				<image>
					<name>hadesfranklyn/${project.artifactId}:${project.version}</name>
				</image>
				<pullPolicy>IF_NOT_PRESENT</pullPolicy>
			</configuration>
		</plugin>
	</plugins>
</build>

RunAs -> Maven build Goals: spring-boot:build-image -DskipTests

docker run -p 8761:8761 -d hadesfranklyn/naming-server:0.0.1-SNAPSHOT

docker-compose up -d docker-compose down

ERROR BY HAVING DOCKER CLIENT STOPPED: .docker.errors.DockerException: Error while fetching server API version: (2, 'CreateFile', 'The system cannot find the file specified.') .[1052] Failed to execute script docker-compose

cd .\10-api-gateway mvn spring-boot:build-image -DskipTests cd ..

SPRING.ZIPKIN.BASEURL: http://zipkin-server:9411 EUREKA.CLIENT.SERVICEURL.DEFAULTZONE: http://localhost:8761/eureka

docker-compose down --remove-orphans

RabbitMQ

Repository Settings Add Secret DOCKER_USERNAME/DOCKER_PASSWORD Continuous Integration with Github Github action: Publish Docker Container Catching Variables Github Actions ${{secrets.DOCKER_USERNAME}}