Slide 1

Slide 1 text

Spring Cloud + Spring Webflux: como desenvolver seu primeiro microsserviço reativo em Java? C L O U D C O N F E R E N C E D A Y Kamila Santos

Slide 2

Slide 2 text

Kamila Santos Tech Lead na Zup Innovation Microsoft MVP criadora de conteúdo no youtube e instagram Kamila_code

Slide 3

Slide 3 text

Agenda DO QUE VAMOS FALAR HOJE? O que são microsservicos? Características de microsservicos Padrões de microsserviços Spring Cloud Projetos do Spring Cloud

Slide 4

Slide 4 text

Agenda DO QUE VAMOS FALAR HOJE? Paradigma reativo? Manifesto Reativo Reactive Streams Conceitos da programação reativa Spring Webflux Projeto reactor

Slide 5

Slide 5 text

Agenda DO QUE VAMOS FALAR HOJE? RxJava Mas a Netflix ta saindo do modelo reativo???? E esse tal de Project Loom? Vamos ao código!!

Slide 6

Slide 6 text

O que são microsserviços?

Slide 7

Slide 7 text

São uma abordagem de arquitetura na qual o software é composto de pequenos serviços independentes que se comunicam entre si e são organizados de acordo com seus domínios de negócio.

Slide 8

Slide 8 text

Características de microsserviços

Slide 9

Slide 9 text

Cada serviço pode ser desenvolvido, escalado e implantado sem interferir em outros serviços. Autônomos

Slide 10

Slide 10 text

Não é necessário compartilhar nenhum código e a comunicação acontece por meio de chamadas as APIs (síncronas) ou de forma assíncrona. Autônomos

Slide 11

Slide 11 text

Cada serviço é desenhado para resolver um problema específico , se começar a ser necessário ter outras responsabilidades é indicado que se crie um novo serviço. Especialistas

Slide 12

Slide 12 text

A independência do serviço aumenta a resiliência a falhas na arquitetura , se um deles tiver algum problema , só afetará alguma parte do fluxo. Resilientes

Slide 13

Slide 13 text

A divisão em módulos com responsabilidades bem definidas permite que funções específicas de algum serviço possam ser utilizadas para complementar features em outros sem precisar reescrever o código. Reutilização de código

Slide 14

Slide 14 text

Os responsáveis por cada serviço podem decidir qual a melhor stack para cada caso. Liberdade da escolha de stack

Slide 15

Slide 15 text

Padrões de microsserviços https://microservices.io/

Slide 16

Slide 16 text

Monolítica - arquitetar um aplicativo como uma única unidade implantável Microsserviços - arquitetar um aplicativo como uma coleção de serviços fracamente acoplados Padrões de arquitetura

Slide 17

Slide 17 text

Strangler Patterns - cria uma nova aplicação em torno do monolito legado, fazendo as funções do antigo monilito e adicionando novas, agregando mais valor ao novo serviço AntiCorruption Layers - cria uma camada de anticorrupção que se traduz entre os modelos de domínio (do monolito que foi herdado e do microsserviço novo que está sendo desenvolvido) Padrões de refatoração

Slide 18

Slide 18 text

Database per Service - cada serviço tem seu próprio banco de dados privado Saga - trabalha com uma sequência de transações locais, para manter a consistência dos dados entre os serviços Padrões de gerenciamento de dados

Slide 19

Slide 19 text

Api Composition - implementar consultas invocando os serviços que possuem os dados e realizando uma junção na memória CQRS - Define um banco de dados read-only, que é uma réplica somente leitura projetada para oferecer suporte a essa consulta. O aplicativo mantém a réplica atualizada por meio de eventos; Padrões de gerenciamento de dados

Slide 20

Slide 20 text

Domain Event - publica um evento sempre que os dados forem alterados Padrões de gerenciamento de dados

Slide 21

Slide 21 text

API Gateway - um serviço que fornece a cada cliente uma interface unificada para serviços, adicionando uma camada a mais de segurança, fazendo balanceamento de carga, etc Backend-for-frontend - um gateway de API separado para cada tipo de cliente Padrões de APIs externas

Slide 22

Slide 22 text

Spring Cloud

Slide 23

Slide 23 text

Spring possui uma grande variedade de projetos para os mais variados cenários e necessidades dentro de uma aplicação

Slide 24

Slide 24 text

Facilita a criação de sistemas distribuidos que são cloud native https://spring.io/projects/spring-cloud Spring Cloud

Slide 25

Slide 25 text

Possibilita que microsserviços descubram facilmente a rota de outros serviços que precisem acessar, os mais conhecidos são Spring Cloud Consul e Spring Cloud Netflix Eureka Service Discovery

Slide 26

Slide 26 text

Tem o papel de ser um intermediário nas nossas requisições para outros serviços. Os mais conhecidos são o Zuul e o Spring Cloud Gateway Gateway

Slide 27

Slide 27 text

Permite armazenar configurações de modo centralizado , para isso temos o Spring Cloud Config Server Configuração centralizada - Config Server

Slide 28

Slide 28 text

Um modo simples de se comunicar com outras aplicações Open Feign

Slide 29

Slide 29 text

Controle sobre falhas e altas taxas de latência dentre os serviços, mais conhecido: Resilience4J Circuit Breaker

Slide 30

Slide 30 text

Inclui id único a cada requisição que entra na aplicação, o que facilita o rastreamento de requisições que passam por um grande fluxo dentro do serviço Sleuth

Slide 31

Slide 31 text

Paradigma reativo

Slide 32

Slide 32 text

É um paradigma de programação orientado a fluxos de dados/eventos, bem como a propagação dos mesmos de forma assíncrona. Paradigma reativo

Slide 33

Slide 33 text

Manifesto reativo

Slide 34

Slide 34 text

https://www.reactivemanifesto.org/pt-BR

Slide 35

Slide 35 text

O sistema responde em tempo hábil, se possível Responsivo

Slide 36

Slide 36 text

O sistema permanece responsivo a falhas Resiliente

Slide 37

Slide 37 text

O sistema permanece responsivo em face de uma carga de trabalho variável. Elástico

Slide 38

Slide 38 text

Os aplicativos reativos contam com a passagem de mensagens assíncronas para estabelecer um limite entre os componentes, garantindo acoplamento flexível, isolamento e transparência Message Driven

Slide 39

Slide 39 text

Conceitos de programação reativa

Slide 40

Slide 40 text

Resistência ou força que se opõe ao fluxo de dados desejado por meio do software. Feedback do receptor ao produtor de que ele não está suportando a carga. BackPressure

Slide 41

Slide 41 text

Sequência de objetos que suporta vários métodos que podem ser operados para produzir um resultado Stream

Slide 42

Slide 42 text

Pode emitir de 0 to N eventos, passando por OnNext (), OnComplete () e onError. Flux

Slide 43

Slide 43 text

No content

Slide 44

Slide 44 text

Pode emitir de 0 to 1 eventos, passando por OnNext (), OnComplete () e onError. Mono

Slide 45

Slide 45 text

No content

Slide 46

Slide 46 text

consome os dados recebidos da subscription Subscriber

Slide 47

Slide 47 text

produz os dados que serão consumidos pela assinatura. Publisher

Slide 48

Slide 48 text

conexão entre o Subscriber e o Publisher Subscription

Slide 49

Slide 49 text

a sequência de eventos só é executada se o Observable tiver um subscriber associado Cold observable

Slide 50

Slide 50 text

ele emite eventos independentemente de haver um subscriber associado Hot observable

Slide 51

Slide 51 text

Reactive streams

Slide 52

Slide 52 text

Reactive Streams https://www.reactive-streams.org/

Slide 53

Slide 53 text

Spring Webflux

Slide 54

Slide 54 text

Spring WebFlux pode ser definido como uma versão “paralela” ao já conhecido e amplamente utilizado Spring MVC (servlet), tendo como principal diferença o suporte para streams NIO reativos e por suportar o conceito de backpressure com o servidor Netty vindo por default embutido em seu arquitetura. Spring Webflux

Slide 55

Slide 55 text

A partir da versão 5.0 do Spring Framework temos uma parte reativa além da estrutura Servlet que já existia, cada módulo destes é opcional, você pode usar a parte Servlet, a parte reativa ou mesmo ambas em suas aplicações. Spring Webflux

Slide 56

Slide 56 text

Spring Webflux foi desenvolvido porque precisávamos de aplicativos não bloqueantes que pudessem trabalhar com um pequeno número de threads simultaneamente e que pudessem ser executados com alguns recursos de hardware. Spring Webflux

Slide 57

Slide 57 text

Projeto Reactor

Slide 58

Slide 58 text

https://projectreactor.io/

Slide 59

Slide 59 text

É uma biblioteca baseada nas Reactive Streams Specifications, é totalmente não bloqueante e interage diretamente com a API Java funcional (Stream, Duration e Completable Future), para composição de elementos utilizando Flux e Mono em arquiteturas de microsserviços , oferecendo mecanismos de backpressure prontos para TCP, UDP e HTTP (incluindo sockets da web). Projeto Reactor

Slide 60

Slide 60 text

Seus operators e schedulers podem suportar um grande volume de transferência (até 10 milhões de solicitações por segundo, de acordo com a documentação do Reactor https://projectreactor.io/), também foi a primeira biblioteca reativa a implementar alguns pontos sugeridos pela reactive streams applications( https://github.com/reactor/reactive-streams-commons), que mais tarde também foram implementados por RxJava2. Projeto Reactor

Slide 61

Slide 61 text

Seus módulos são fluxos reativos abstratos e interoperáveis ​ ​ para facilitar o seu desenvolvimento, podendo ser utilizados com:Spring FrameworksDrivers e clientes (por exemplo CloudFoundry Java Client https://github.com/cloudfoundry/cf-java-client)- em protocolos / contratos como R2DBC (https://r2dbc.io/) e RSocket (https://rsocket.io/), por exemplo. Projeto Reactor

Slide 62

Slide 62 text

é a parte principal desta biblioteca, os outros módulos são dependentes dela, ela fornece tipos reativos que implementam um Publisher que fornece Flux e Mono Reactor Core

Slide 63

Slide 63 text

é o servidor de nosso aplicativo NIO, usada para o desenvolvimento de servidores altamente escaláveis. Reactor Netty

Slide 64

Slide 64 text

Voltado para o desenvolvimento de testes com webflux Reactor Test

Slide 65

Slide 65 text

RxJava

Slide 66

Slide 66 text

https://reactivex.io/

Slide 67

Slide 67 text

É uma implementação para a JVM das Reactie Extensions , que é uma biblioteca assíncrona e baseada em eventos que trabalha com sequências de observables. Rx Java

Slide 68

Slide 68 text

Estende do padrão observer -> cada objeto chamado (subject), tem uma listas de dependentes (observers) que são notificados pelo subject automaticamente a cada mudança de estado por meio de seus operadores e métodos. Rx Java

Slide 69

Slide 69 text

Suporta sequências de dados e eventos para compor suas sequências de eventos de forma declarativa. Rx Java

Slide 70

Slide 70 text

Mas se o modelo reativo é tão bom, por que a netflix parou de usar?

Slide 71

Slide 71 text

https://netflixtechblog.com/zuul-2-the-netflix-journey-to- asynchronous-non-blocking-systems-45947377fb5c

Slide 72

Slide 72 text

https://twitter.com/pbakker

Slide 73

Slide 73 text

https://twitter.com/rafaelcodes/status/1523327905434062848? s=20&t=maytWvgFrE6fhr8_07NCqQ

Slide 74

Slide 74 text

No content

Slide 75

Slide 75 text

https://filia-aleks.medium.com/microservice-performance-battle-spring-mvc-vs-webflux- 80d39fd81bf0

Slide 76

Slide 76 text

Projeto Loom

Slide 77

Slide 77 text

Traablha alterando a implementação das Threads existentes no SO para um tipo de abstração que pode representar a prórpia thread ou uma thread virtual Projeto Loom

Slide 78

Slide 78 text

Seria uma forma de tirar de um framework/linguagem a responsabilidade que criam uma abstração entre as threads da JVM. Projeto Loom

Slide 79

Slide 79 text

https://openjdk.java.net/jeps/425

Slide 80

Slide 80 text

https://deviniciative.wordpress.com/2020/08/18/java-15-project-loom-programacao- reativa-e-coroutines/

Slide 81

Slide 81 text

Chega de conversa, vamos ao código :)

Slide 82

Slide 82 text

Você tem alguma pergunta? Obrigada! https://beacons.page/kamila_code