Upgrade to Pro — share decks privately, control downloads, hide ads and more …

[Unicorn Tech] Programação reativa com Java - Primeiros passos com WebFlux

[Unicorn Tech] Programação reativa com Java - Primeiros passos com WebFlux

Vamos falar sobre os princípios da programação reativa e como o Java foi evoluindo desde a orientação a objetos, os conceitos de programação funcional que começaram a vir com o Java 8 e como isso encaminhou para o surgimento do webflux. Ainda veremos um exemplo de uma API com Spring webflux utilizando a library reactor e o servidor assíncrono netty.

Transcript

  1. Programação reativa com Java: Primeiros passos com WebFlux KAMILA SANTOS

    OLIVEIRA @kamilah_santos
  2. @kamilah_santos Kamila Santos Backend Developer

  3. @kamilah_santos Comunidades

  4. @kamilah_santos POO princípios básicos

  5. @kamilah_santos Abstração Precisamos imaginar o que esse objeto irá realizar

    dentro de nosso sistema
  6. @kamilah_santos Abstração Identidade ao objeto que vamos criar

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

  8. @kamilah_santos Abstração Esse objeto será capaz de executar ações ,

    que chamamos de métodos
  9. @kamilah_santos Encapsulamento "protege/esconde" objetos do restante da aplicação, utilizamos getters

    e setters para definir e acessar esses valores
  10. @kamilah_santos Polimorfismo Alteramos o funcionamento interno de um método herdado

    do objeto pai
  11. @kamilah_santos Herança classe filha herda comportamentos da classe pai

  12. @kamilah_santos S.O.L.I.D

  13. @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
  14. @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.
  15. @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….
  16. @kamilah_santos L : Liskov substitution principle Princípio da substituição de

    Liskov As classes derivadas devem poder ser substituíveis pelas classes bases
  17. @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”
  18. @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.
  19. @kamilah_santos Manifesto Reativo

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

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

  22. @kamilah_santos Resiliente O sistema permanece responsivo diante de falhas

  23. @kamilah_santos Elástico O sistema permanece responsivo diante de uma carga

    de trabalho variável.
  24. @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
  25. @kamilah_santos Porque o WebFlux surgiu?

  26. @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.
  27. @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.
  28. @kamilah_santos Fonte: https://docs.spring.io/spring-framework/docs/5.0.0.BUILD-SNAPSHOT/spring-framework- reference/html/web-reactive.html

  29. @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.
  30. @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.
  31. @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.
  32. @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.
  33. @kamilah_santos

  34. @kamilah_santos

  35. @kamilah_santos

  36. @kamilah_santos

  37. @kamilah_santos

  38. @kamilah_santos

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

  40. @kamilah_santos Uma sequência de eventos ordenados no tempo

  41. @kamilah_santos Estando vinculado à uma fonte de dados, um stream

    é capaz de emitir três eventos:
  42. @kamilah_santos onNext: representa algum valor

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

  44. @kamilah_santos onComplete: no caso de eventos finitos, indica que foi

    concluído
  45. @kamilah_santos Cold Observable: a sequência de eventos só é executada

    seo Observable tiver um subscriber associado
  46. @kamilah_santos Hot Observable: ele emite eventos independente se há algum

    subscriber associado
  47. @kamilah_santos Como funcionam as requests :

  48. @kamilah_santos

  49. @kamilah_santos

  50. @kamilah_santos No WebFlux:

  51. @kamilah_santos

  52. @kamilah_santos

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

  54. @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
  55. @kamilah_santos Reactor

  56. @kamilah_santos Publisher produz dados, mas só fara algo quando tiver

    uma subscription para fazer o push desses dados
  57. @kamilah_santos https://tech.io/playgrounds/929/reactive-programming-with-reactor-3/Intro

  58. @kamilah_santos Flux

  59. @kamilah_santos Pode emitir de 0 a n eventos, e também

    onNext, onError e onComplete
  60. @kamilah_santos

  61. @kamilah_santos

  62. @kamilah_santos Mono

  63. @kamilah_santos Emite no máximo um evento, podendo ser onNext, On

    Error e onComplete também
  64. @kamilah_santos

  65. @kamilah_santos

  66. @kamilah_santos Reactor Core

  67. @kamilah_santos Reactor Netty

  68. @kamilah_santos Reactor Test

  69. @kamilah_santos Netty

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

  71. @kamilah_santos utilizada para dev de servidores altamente escaláveis

  72. @kamilah_santos é possível trabalhar a nível socket e criar seus

    próprios protocolos de comunicação
  73. @kamilah_santos para essas configurações de servidor NIO e bom ter

    conhecimento das threads, event loop, buffers e gerenciamento de memória
  74. @kamilah_santos http://www.trieu.xyz/2019/04/netty-cookbook.html

  75. @kamilah_santos

  76. @kamilah_santos Exemplo

  77. @kamilah_santos

  78. @kamilah_santos

  79. @kamilah_santos

  80. @kamilah_santos

  81. @kamilah_santos

  82. @kamilah_santos

  83. @kamilah_santos

  84. @kamilah_santos

  85. @kamilah_santos

  86. @kamilah_santos

  87. @kamilah_santos

  88. @kamilah_santos

  89. @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
  90. Demo Meus contatos Unicorn API