Slide 1

Slide 1 text

Programação reativa com Java: Primeiros passos com WebFlux KAMILA SANTOS OLIVEIRA @kamilah_santos

Slide 2

Slide 2 text

@kamilah_santos Kamila Santos Backend Developer

Slide 3

Slide 3 text

@kamilah_santos Comunidades

Slide 4

Slide 4 text

@kamilah_santos POO princípios básicos

Slide 5

Slide 5 text

@kamilah_santos Abstração Precisamos imaginar o que esse objeto irá realizar dentro de nosso sistema

Slide 6

Slide 6 text

@kamilah_santos Abstração Identidade ao objeto que vamos criar

Slide 7

Slide 7 text

@kamilah_santos Abstração Características desse objeto, as chamadas propriedades

Slide 8

Slide 8 text

@kamilah_santos Abstração Esse objeto será capaz de executar ações , que chamamos de métodos

Slide 9

Slide 9 text

@kamilah_santos Encapsulamento "protege/esconde" objetos do restante da aplicação, utilizamos getters e setters para definir e acessar esses valores

Slide 10

Slide 10 text

@kamilah_santos Polimorfismo Alteramos o funcionamento interno de um método herdado do objeto pai

Slide 11

Slide 11 text

@kamilah_santos Herança classe filha herda comportamentos da classe pai

Slide 12

Slide 12 text

@kamilah_santos S.O.L.I.D

Slide 13

Slide 13 text

@kamilah_santos SOLID Conjunto de boas práticas de desenvolvimento que facilitam a adição de novas features, manutenção e correção de bugs

Slide 14

Slide 14 text

@kamilah_santos S = Single responsibility principle - Prinípio da responsabilidade única Uma classe deve ter uma e somente uma responsabilidade, se tiver mais de uma devemos refatorar.

Slide 15

Slide 15 text

@kamilah_santos O = Open/closed principle - Princípio do Aberto/Fechado Devemos ser capazes de estender um comportamento de determinada classe sem precisar modificá-lo, pode ter seu comportamento alterado com facilidade se necessário porém através herança,interface….

Slide 16

Slide 16 text

@kamilah_santos L : Liskov substitution principle Princípio da substituição de Liskov As classes derivadas devem poder ser substituíveis pelas classes bases

Slide 17

Slide 17 text

@kamilah_santos I : Interface segregation principle - Princípio da segregação de interfaces Melhor ter várias interfaces específicas do que um interface geral, crie interfaces granulares para cada “cliente”

Slide 18

Slide 18 text

@kamilah_santos D: Dependency inversion principle - Princípio da inversão de dependência Dependa das abstrações, não das implementações, as abstrações tem menores alterações e facilitam a implementação.

Slide 19

Slide 19 text

@kamilah_santos Manifesto Reativo

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

@kamilah_santos Resiliente O sistema permanece responsivo diante de falhas

Slide 23

Slide 23 text

@kamilah_santos Elástico O sistema permanece responsivo diante de uma carga de trabalho variável.

Slide 24

Slide 24 text

@kamilah_santos MESSAGE DRIVEN Aplicações reativas dependem da passagem de mensagens assíncronas para estabelecer um limite entre os componentes, garantindo um acoplamento flexível , isolamento e transparência

Slide 25

Slide 25 text

@kamilah_santos Porque o WebFlux surgiu?

Slide 26

Slide 26 text

@kamilah_santos O Spring WebFlux pode ser definido como uma versão “paralela” ao já conhecido e bastante utilizado Spring MVC, tendo como principal diferença o suporte a reative streams NIO e por suportar o conceito de backpressure com servidor Netty vindo por default embutido em sua arquitetura.

Slide 27

Slide 27 text

@kamilah_santos A partir da versão 5.0 do Spring Framework passamos a ter uma parte reativa além da estrutura de Servlet que já existia, cada módulo destes é opcional, você pode utilizar a parte Servlet a parte reativa ou até ambas em suas aplicações.

Slide 28

Slide 28 text

@kamilah_santos Fonte: https://docs.spring.io/spring-framework/docs/5.0.0.BUILD-SNAPSHOT/spring-framework- reference/html/web-reactive.html

Slide 29

Slide 29 text

@kamilah_santos O Spring Webflux foi desenvolvido devido à necessidade de aplicações não bloqueantes que fossem capazes de trabalhar com um pequeno número de threads de modo simultâneo e que pudessem ser executadas com um poucos recursos de hardware.

Slide 30

Slide 30 text

@kamilah_santos A partir do Servlet 3.1 foi fornecido uma API NIO, porém a sua utilização não vai de encontro com o resto da API e de todos os conceitos por trás do Servlet, que possui contratos bloqueantes como o getPart e getParameter por exemplo e seus contratos foram definidos de forma síncrona tendo o Filter e Servlet como exemplo.

Slide 31

Slide 31 text

@kamilah_santos Esses fatores foram determinantes para o desenvolvimento de uma nova API que fosse utilizada independente do tempo de execução e de modo não bloqueante, o que foi possível com os servidores (Netty por ex) que se consolidaram no funcionamento assíncrono e não bloqueante.

Slide 32

Slide 32 text

@kamilah_santos Outro razão é que o WebFlux torna mais fácil a compreensão e utilização de conceitos de programação funcional/reativa. Com a adição das features funcionais a partir do Java 8 (como as expressões lambda, streams, Optional…). À nível de estilo/modelo de programação o Java 8 permitiu que o Spring WebFlux tivesse endpoints funcionais e annotated controllers nas aplicações.

Slide 33

Slide 33 text

@kamilah_santos

Slide 34

Slide 34 text

@kamilah_santos

Slide 35

Slide 35 text

@kamilah_santos

Slide 36

Slide 36 text

@kamilah_santos

Slide 37

Slide 37 text

@kamilah_santos

Slide 38

Slide 38 text

@kamilah_santos

Slide 39

Slide 39 text

@kamilah_santos E..o que são streams mesmo?

Slide 40

Slide 40 text

@kamilah_santos Uma sequência de eventos ordenados no tempo

Slide 41

Slide 41 text

@kamilah_santos Estando vinculado à uma fonte de dados, um stream é capaz de emitir três eventos:

Slide 42

Slide 42 text

@kamilah_santos onNext: representa algum valor

Slide 43

Slide 43 text

@kamilah_santos onError: houve algum erro na execução

Slide 44

Slide 44 text

@kamilah_santos onComplete: no caso de eventos finitos, indica que foi concluído

Slide 45

Slide 45 text

@kamilah_santos Cold Observable: a sequência de eventos só é executada seo Observable tiver um subscriber associado

Slide 46

Slide 46 text

@kamilah_santos Hot Observable: ele emite eventos independente se há algum subscriber associado

Slide 47

Slide 47 text

@kamilah_santos Como funcionam as requests :

Slide 48

Slide 48 text

@kamilah_santos

Slide 49

Slide 49 text

@kamilah_santos

Slide 50

Slide 50 text

@kamilah_santos No WebFlux:

Slide 51

Slide 51 text

@kamilah_santos

Slide 52

Slide 52 text

@kamilah_santos

Slide 53

Slide 53 text

@kamilah_santos https://docs.spring.io/spring/docs/current/spring-framework-reference/web- reactive.html

Slide 54

Slide 54 text

@kamilah_santos A reactive Stream specification visa padronizar as bibliotecas de Programação Reativa na JVM e, mais importante, especificar como elas devem se comportar para serem interoperáveis

Slide 55

Slide 55 text

@kamilah_santos Reactor

Slide 56

Slide 56 text

@kamilah_santos Publisher produz dados, mas só fara algo quando tiver uma subscription para fazer o push desses dados

Slide 57

Slide 57 text

@kamilah_santos https://tech.io/playgrounds/929/reactive-programming-with-reactor-3/Intro

Slide 58

Slide 58 text

@kamilah_santos Flux

Slide 59

Slide 59 text

@kamilah_santos Pode emitir de 0 a n eventos, e também onNext, onError e onComplete

Slide 60

Slide 60 text

@kamilah_santos

Slide 61

Slide 61 text

@kamilah_santos

Slide 62

Slide 62 text

@kamilah_santos Mono

Slide 63

Slide 63 text

@kamilah_santos Emite no máximo um evento, podendo ser onNext, On Error e onComplete também

Slide 64

Slide 64 text

@kamilah_santos

Slide 65

Slide 65 text

@kamilah_santos

Slide 66

Slide 66 text

@kamilah_santos Reactor Core

Slide 67

Slide 67 text

@kamilah_santos Reactor Netty

Slide 68

Slide 68 text

@kamilah_santos Reactor Test

Slide 69

Slide 69 text

@kamilah_santos Netty

Slide 70

Slide 70 text

@kamilah_santos Estrutura de IO não bloqueante e assíncrona

Slide 71

Slide 71 text

@kamilah_santos utilizada para dev de servidores altamente escaláveis

Slide 72

Slide 72 text

@kamilah_santos é possível trabalhar a nível socket e criar seus próprios protocolos de comunicação

Slide 73

Slide 73 text

@kamilah_santos para essas configurações de servidor NIO e bom ter conhecimento das threads, event loop, buffers e gerenciamento de memória

Slide 74

Slide 74 text

@kamilah_santos http://www.trieu.xyz/2019/04/netty-cookbook.html

Slide 75

Slide 75 text

@kamilah_santos

Slide 76

Slide 76 text

@kamilah_santos Exemplo

Slide 77

Slide 77 text

@kamilah_santos

Slide 78

Slide 78 text

@kamilah_santos

Slide 79

Slide 79 text

@kamilah_santos

Slide 80

Slide 80 text

@kamilah_santos

Slide 81

Slide 81 text

@kamilah_santos

Slide 82

Slide 82 text

@kamilah_santos

Slide 83

Slide 83 text

@kamilah_santos

Slide 84

Slide 84 text

@kamilah_santos

Slide 85

Slide 85 text

@kamilah_santos

Slide 86

Slide 86 text

@kamilah_santos

Slide 87

Slide 87 text

@kamilah_santos

Slide 88

Slide 88 text

@kamilah_santos

Slide 89

Slide 89 text

@kamilah_santos https://tech.io/playgrounds/929/reactive-programming-with-reactor-3/transform https://www.callicoder.com/reactive-rest-apis-spring-webflux-reactive-mongo/ http://reactivex.io/languages.html https://projectreactor.io/ http://www.trieu.xyz/2019/04/netty-cookbook.html https://dzone.com/articles/build-a-simple-netty-application-with-and-without https://www.baeldung.com/netty https://developer.okta.com/blog/2018/09/21/reactive-programming-with-spring https://speakerdeck.com/olehdokuka/get-reactive-with-project-reactor-and-spring-5 https://speakerdeck.com/kamilahsantos/2020-d0013e50-afdf-4e9c-b411- 7f22d2f3d64c https://speakerdeck.com/kamilahsantos/tdc-floripa-melhorando-a-performance-e- legibilidade-de-aplicacoes-java-com-spring-web-flux https://www.baeldung.com/spring-webflux https://docs.spring.io/spring/docs/current/spring-framework-reference/web- reactive.html https://docs.spring.io/spring-framework/docs/5.0.0.BUILD-SNAPSHOT/spring- framework-reference/html/web-reactive.html

Slide 90

Slide 90 text

Demo Meus contatos Unicorn API