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

Java: da orientação a objetos a aplicações reativas com Webflux

Java: da orientação a objetos a aplicações reativas 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.

More Decks by Kamila de fatima santos oliveira

Other Decks in Programming

Transcript

  1. Java: da orientação a objetos a aplicações reativas com Webflux

    Um Overview de pilares da POO, boas práticas e uma breve introdução à programação reativa com Java KAMILA SANTOS OLIVEIRA @kamilah_santos
  2. @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
  3. @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.
  4. @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….
  5. @kamilah_santos L : Liskov substitution principle Princípio da substituição de

    Liskov As classes derivadas devem poder ser substituíveis pelas classes bases
  6. @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”
  7. @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.
  8. @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
  9. @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.
  10. @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.
  11. @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.
  12. @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.
  13. @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.
  14. @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.
  15. @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
  16. @kamilah_santos Publisher produz dados, mas só fara algo quando tiver

    uma subscription para fazer o push desses dados
  17. @kamilah_santos para essas configurações de servidor NIO e bom ter

    conhecimento das threads, event loop, buffers e gerenciamento de memória
  18. @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