wallacecamacho / spring-seed

:leaves: Spring Seed project with Spring bootstrap, hystrix, Zuul, Eureka, Logger, Monitor Turbine

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Spring-Seed

Uma aplicação de referência

Esta é uma aplicação de prova de conceito, que demonstra o Padrão de Arquitetura de Microserviços usando Spring Boot, Spring Cloud e Docker. Com uma interface simples em angular 7.

Foram utilizados os serviços Spring Cloud para disponibilizar um arquitetura para utilização da plataforma Docker, Spring e um Front End baseado em javascript como Angular 7.

Componentes utilizados:

  • Spring Cloud
  • Eureka
  • Hystrix
  • Zuul
  • Spring Security (utilizado para dar permissão aos endpoints)
  • Angular 7
  • MongoDB

Através de uma interface de cadastro e pesquisa utilizado para realizar inserts no banco de dados MongoDB, foram realizadas configurações necessárias para mergulhar no conceito de aplicações baseadas na arquitetura de microserviços e realizar uma arquitetura de referência básica para utilização de um modelo que pode ser utilizado em ambientes corporativos de desenvolvimento.

Functional services

Springseed tem um simples exemplo de serviço. Serviço independente utilizando um banco de dados mongo para um serviço específico.

Functional services

Infraestrutura

Disponibilizando serviços

Utilizando Spring Boot application com spring-cloud-starter-config dependência

Apenas forneça bootstrap.yml com o nome da aplicação e com a url do Config service:

spring:
  application:
    name: example-service
  cloud:
    config:
      uri: http://config:8888
      fail-fast: true

API Gateway

É o ponto de entrada único no sistema, usado para manipular solicitações roteando-as para o serviço de back-end apropriado ou chamando vários serviços de back-end (http://techblog.netflix.com/2013/01/optimizing-netflix-api.html). Além disso, ele pode ser usado para autenticação, teste de estresse, migração de serviço, manipulação de resposta estática, gerenciamento de tráfego ativo. Netflix opensourced exemplo de abordagem, e com Spring Cloud pode ser habilitado com uma anotação @EnableZuulProxy. No projeto, usei Zuul para armazendar conteúdo stático com o build do angular 7 (ui application) e rotear as requisições para os apropriados serviços. Exemplo de configuração de roteamento:

zuul:
  routes:
    notification-service:
        path: /contas/**
        serviceId: example-service
        stripPrefix: false

Todas as configurações que começam com /contas será roteada para o determinado serviço. Zuul usa o serviço de descoberta Service discovery para localizar a intância definida.

Service discovery (Serviço de descoberta)

Com Spring Boot, conseguimos de forma fácil usar o Eureka spring-cloud-starter-eureka-server como dependência, e a anotação@EnableEurekaServer e uma simples configuração.

Cliente de descoberta com a anotação @EnableDiscoveryClient e o arquivo bootstrap.yml:

spring:
  application:
    name: notification-service

Eureka fornece uma interface simples, onde você pode rastrear serviços em execução e várias instâncias disponíveis: http://localhost:8761

Load balancer, Circuit breaker e Http client

Netflix OSS

Ribbon

Ribbon é um balanceador de carga do lado do cliente que lhe dá muito controle sobre o comportamento de clientes HTTP e TCP.

Hystrix

Hystrix é uma implementação Circuit Breaker pattern, que fornece controle sobre a latência e falha de dependências acessadas pela rede. A idéia principal é parar as falhas em cascata em um ambiente distribuído com um grande número de microsserviços.

Feign

Feign é um Http client. Actually, com uma dependênciaspring-cloud-starter-feign e uma anotação @EnableFeignClients.

tracing logs distribuídos

A análise de problemas em sistemas distribuídos pode ser difícil, por exemplo, solicitações de rastreamento que se propagam de um microsserviço para outro.

Spring Cloud Sleuth resolve esse problema fornecendo suporte para rastreamento distribuído. Ele adiciona dois tipos de ID ao logging: traceId e spanId. Os logs seguem o seguinte padrão [appname,traceId,spanId,exportable] do Slf4J MDC:

2018-07-26 23:13:49.381  WARN [gateway,3216d0de1384bb4f,3216d0de1384bb4f,false] 2999 --- [nio-4000-exec-1] o.s.c.n.z.f.r.s.AbstractRibbonCommand    : The Hystrix timeout of 20000ms for the command conta-service is set lower than the combination of the Ribbon read and connect timeout, 80000ms.
2018-07-26 23:13:49.562  INFO [example-service,3216d0de1384bb4f,404ff09c5cf91d2e,false] 3079 --- [nio-6000-exec-1] c.p.conta.service.AccountServiceImpl   : nova conta foi criada: test
  • appname: O nome da aplicação que será logada spring.application.name
  • traceId: ID que é atribuído a uma request
  • spanId: ID de uma específica operação
  • exportable: se o log deve ser exportado para Zipkin

Antes de começar

  • Instale Docker e Docker Compose. Config Docker
  • Construa o projeto com maven utilizando o seguinte comando: mvn clean package -DskipTests

Executando o docker

Desta forma todas as imagens utilizadas serão baixado do docker hub. Entre na pasta raiz onde foi realizado o clone do projeto onde está localizado o arquivo docker-compose.yml em seguida para construir as imagens docker-compose build e em seguinte docker-compose up

Executando o springseed

  • Execute o seguinte comando docker-compose build
  • Seguinte docker-compose up
  • abrir o navegador no http://localhost

Importantes endpoints

Front - Angular 7

Usei o angular 7 para realizar uma página de cadastro de forma simples para que fosse realizada as nossas chamadas ao endpoint dos serviços example-service.

Foram usados

  • Material angular
  • Rxjs, Subjects e Observables para realizar chamadas de forma reativas ao nosso cadastro.

captura de tela de 2018-12-11 12-17-52

Notes

Além disso, o mecanismo de Descoberta de Serviço precisa de algum tempo após a inicialização de todos os aplicativos. Qualquer serviço não está disponível para descoberta pelos clientes até que a instância, o servidor Eureka e o cliente tenham todos os mesmos metadados em seu cache local.

About

:leaves: Spring Seed project with Spring bootstrap, hystrix, Zuul, Eureka, Logger, Monitor Turbine

License:MIT License


Languages

Language:TypeScript 74.5%Language:Java 8.5%Language:CSS 6.6%Language:HTML 5.6%Language:JavaScript 2.9%Language:Dockerfile 1.0%Language:Shell 0.9%