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

[GUOB TECH DAY] - SPRING WEBFLUX

[GUOB TECH DAY] - SPRING WEBFLUX

Transcript

  1. 15 de Agosto de 2020, Brasil TITLE Speaker Improving the

    performance and readability of Java applications with Spring Web Flux Kamila Santos
  2. 15 de Agosto de 2020, Brasil Backend Developer github.com/kamilahsantos in/kamila-santos-oliveira/

    @kamilah_santos https://dev.to/kamilahsantos
  3. 15 de Agosto de 2020, Brasil

  4. 15 de Agosto de 2020, Brasil Reactive Manifest https://www.reactivemanifesto.org/ @kamilah_santos

  5. 15 de Agosto de 2020, Brasil Responsivo O sistema responde

    em tempo hábil, se possível @kamilah_santos
  6. 15 de Agosto de 2020, Brasil Resiliente O sistema permanece

    responsivo a falhas @kamilah_santos
  7. 15 de Agosto de 2020, Brasil Elástico O sistema permanece

    responsivo em face de uma carga de trabalho variável. @kamilah_santos
  8. 15 de Agosto de 2020, Brasil Message Driven 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 @kamilah_santos
  9. 15 de Agosto de 2020, Brasil Reactive Streams Iniciativa para

    fornecer um padrão / guia / regras para processamento de fluxo assíncrono com backpressure NIO @kamilah_santos
  10. 15 de Agosto de 2020, Brasil interface Flow.Publisher<T> métodos para

    produzir streams e demais eventos @kamilah_santos
  11. 15 de Agosto de 2020, Brasil @kamilah_santos

  12. 15 de Agosto de 2020, Brasil interface Flow.Subscriber<T> métodos para

    receber streams e demais eventos @kamilah_santos
  13. 15 de Agosto de 2020, Brasil @kamilah_santos

  14. 15 de Agosto de 2020, Brasil interface Flow.Subscription métodos para

    vincular o Publisher e o Subscriber. @kamilah_santos
  15. 15 de Agosto de 2020, Brasil @kamilah_santos

  16. 15 de Agosto de 2020, Brasil interface Flow.Processor<T,R> define métodos

    para fazer algumas operações avançadas, como transformar itens de publishers para subscriber @kamilah_santos
  17. 15 de Agosto de 2020, Brasil @kamilah_santos

  18. 15 de Agosto de 2020, Brasil class SubmissionPublisher<T> implements Flow.Publisher<T>

    Producer flexível de itens, em conformidade com a Reactive Streams. @kamilah_santos
  19. 15 de Agosto de 2020, Brasil @kamilah_santos

  20. 15 de Agosto de 2020, Brasil Reactive streams destinado a

    ambientes de tempo de execução (JVM), bem como protocolos de rede. https://github.com/reactive-streams/reactive-streams-jv m @kamilah_santos
  21. 15 de Agosto de 2020, Brasil Reactive streams o objetivo

    principal é definir a troca de dados de fluxo através de um limite assíncrono. @kamilah_santos
  22. 15 de Agosto de 2020, Brasil Reactive streams seu escopo

    é encontrar um conjunto mínimo de métodos, interfaces e protocolos que irão descrever as operações e entidades necessárias para ter fluxos de dados assíncronos com backpressure NIO. @kamilah_santos
  23. 15 de Agosto de 2020, Brasil Functional Features Java 8+

    @kamilah_santos
  24. 15 de Agosto de 2020, Brasil @kamilah_santos

  25. 15 de Agosto de 2020, Brasil @kamilah_santos

  26. 15 de Agosto de 2020, Brasil @kamilah_santos

  27. 15 de Agosto de 2020, Brasil @kamilah_santos

  28. 15 de Agosto de 2020, Brasil @kamilah_santos

  29. 15 de Agosto de 2020, Brasil @kamilah_santos

  30. 15 de Agosto de 2020, Brasil Conceitos de programação reativa

    @kamilah_santos
  31. 15 de Agosto de 2020, Brasil Backpressure 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 @kamilah_santos
  32. 15 de Agosto de 2020, Brasil Stream Sequência de objetos

    que suporta vários métodos que podem ser operados para produzir um resultado @kamilah_santos
  33. 15 de Agosto de 2020, Brasil Stream vinculado a uma

    fonte de dados, um stream é capaz de emitir três eventos: @kamilah_santos
  34. 15 de Agosto de 2020, Brasil onNext() representa algum valor,

    vá para o próximo valor de uma lista @kamilah_santos
  35. 15 de Agosto de 2020, Brasil onError() houve um erro

    na execução @kamilah_santos
  36. 15 de Agosto de 2020, Brasil onComplete() no caso de

    eventos finitos, indica que foi concluído @kamilah_santos
  37. 15 de Agosto de 2020, Brasil Flux Pode emitir de

    0 to N eventos, passando por OnNext (), OnComplete () e onError. @kamilah_santos
  38. 15 de Agosto de 2020, Brasil Mono Emite um evento

    ou nenhum (0 to 1 event). @kamilah_santos
  39. 15 de Agosto de 2020, Brasil Observable um observable pode

    passar mensagens de forma assíncrona. @kamilah_santos
  40. 15 de Agosto de 2020, Brasil Subscriber consome os dados

    recebidos da subscription @kamilah_santos
  41. 15 de Agosto de 2020, Brasil Publisher produz os dados

    que serão consumidos pela assinatura. @kamilah_santos
  42. 15 de Agosto de 2020, Brasil Subscription conexão entre o

    Subscriber e o Publisher @kamilah_santos
  43. 15 de Agosto de 2020, Brasil Cold Observable a sequência

    de eventos só é executada se o Observable tiver um subscriber associado @kamilah_santos
  44. 15 de Agosto de 2020, Brasil Hot Observable ele emite

    eventos independentemente de haver um subscriber associado @kamilah_santos
  45. 15 de Agosto de 2020, Brasil Por que o WebFlux

    foi criado? 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. @kamilah_santos
  46. 15 de Agosto de 2020, Brasil Por que o WebFlux

    foi criado? 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. @kamilah_santos
  47. 15 de Agosto de 2020, Brasil https://docs.spring.io/spring-framework/docs/5.0.0.BUILD-SNAPSHOT/spring-framework-reference/ html/web-reactive.html @kamilah_santos

  48. 15 de Agosto de 2020, Brasil 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. @kamilah_santos
  49. 15 de Agosto de 2020, Brasil no Servlet 3.1, uma

    API NIO foi fornecida, mas seu uso não corresponde ao resto da API e a todos os conceitos por trás do Servlet, que possui contratos de bloqueio. @kamilah_santos
  50. 15 de Agosto de 2020, Brasil Estes fatores foram decisivos

    para o desenvolvimento de uma nova API que fosse utilizada independentemente do tempo de execução e de forma não bloqueante, o que foi possível com os servidores (Netty por exemplo) que se consolidaram na operação assíncrona e não bloqueante. @kamilah_santos
  51. 15 de Agosto de 2020, Brasil Outra razão é que

    o WebFlux torna mais fácil entender e usar conceitos de programação funcional / reativa. Com a adição de recursos funcionais do Java 8 e Flowable API no Java 9 , que permitiu ao Spring WebFlux ter functional endpoints e annotated controllers nos aplicativos. @kamilah_santos
  52. 15 de Agosto de 2020, Brasil Como as requests funcionam?

    @kamilah_santos
  53. 15 de Agosto de 2020, Brasil Este modelo, dependendo do

    volume de requisições e da forma como foi desenvolvido, pode causar lentidão na sua aplicação e até mesmo um erro de Out Of Memory (este tipo de erro geralmente ocorre quando mantemos objetos por muito tempo ou tentamos processar muito de dados de uma vez) @kamilah_santos
  54. 15 de Agosto de 2020, Brasil @kamilah_santos

  55. 15 de Agosto de 2020, Brasil Com este modelo de

    design de API tradicional, não oferecemos suporte para Backpressure, a escrita da API é imperativa e, como já foi dito, funciona de forma síncrona e bloqueante @kamilah_santos
  56. 15 de Agosto de 2020, Brasil @kamilah_santos

  57. 15 de Agosto de 2020, Brasil @kamilah_santos

  58. 15 de Agosto de 2020, Brasil E no Webflux? @kamilah_santos

  59. 15 de Agosto de 2020, Brasil Neste modelo de requisição,

    para cada item deste Flux que é lido e retornado do banco de dados, um onNext () é chamado e quando atinge o último recebe um “sinal” de onComplete () ou se ocorre um erro, ele receberá um onError (). @kamilah_santos
  60. 15 de Agosto de 2020, Brasil @kamilah_santos

  61. 15 de Agosto de 2020, Brasil Os pedidos disparados por

    um cliente, são recebidos pelo Netty, que é o nosso servidor não bloqueante, que será recebido pelo loop de eventos, que irá receber este evento e enviá-lo, o adaptador reativo (reactor-netty) passará este para o dispatcher handler que é responsável pelo terminal para passar essas informações de volta ao cliente, isso ocorre de forma assíncrona e não bloqueante. @kamilah_santos
  62. 15 de Agosto de 2020, Brasil @kamilah_santos

  63. 15 de Agosto de 2020, Brasil O adaptador reativo geralmente

    é fornecido por uma biblioteca, aqui cobrirá o projeto do Reactor. @kamilah_santos
  64. 15 de Agosto de 2020, Brasil Project Reactor @kamilah_santos

  65. 15 de Agosto de 2020, Brasil É 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). @kamilah_santos
  66. 15 de Agosto de 2020, Brasil 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-common s), que mais tarde também foram implementados por RxJava2. @kamilah_santos
  67. 15 de Agosto de 2020, Brasil Seus módulos são fluxos

    reativos abstratos e interoperáveis para facilitar o seu desenvolvimento, podendo ser utilizados com: Spring Frameworks Drivers 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. @kamilah_santos
  68. 15 de Agosto de 2020, Brasil Reactor Core é 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 @kamilah_santos
  69. 15 de Agosto de 2020, Brasil Reactor Netty é o

    servidor de nosso aplicativo NIO, usada para o desenvolvimento de servidores altamente escaláveis. @kamilah_santos
  70. 15 de Agosto de 2020, Brasil Reactor Test é responsável

    por apoiar testes reativos e asserções @kamilah_santos
  71. 15 de Agosto de 2020, Brasil Netty é possível trabalhar

    no nível do socket e criar seus próprios protocolos de comunicação @kamilah_santos
  72. 15 de Agosto de 2020, Brasil Netty Para essas configurações

    de servidor NIO, é bom ter conhecimento de threads, event loop, buffers e gerenciamento de memória @kamilah_santos
  73. 15 de Agosto de 2020, Brasil @kamilah_santos

  74. 15 de Agosto de 2020, Brasil Exemplo @kamilah_santos

  75. 15 de Agosto de 2020, Brasil Performance @kamilah_santos

  76. 15 de Agosto de 2020, Brasil Palestra completa em: https://www.youtube.com/watch?v=ODzY5uJfzDI&t=3s

    @kamilah_santos
  77. 15 de Agosto de 2020, Brasil Palestra completa em: https://www.youtube.com/watch?v=ODzY5uJfzDI&t=3s

    @kamilah_santos
  78. 15 de Agosto de 2020, Brasil Palestra completa em: https://www.youtube.com/watch?v=ODzY5uJfzDI&t=3s

    @kamilah_santos
  79. 15 de Agosto de 2020, Brasil Palestra completa em: https://www.youtube.com/watch?v=ODzY5uJfzDI&t=3s

    @kamilah_santos
  80. 15 de Agosto de 2020, Brasil Palestra completa em: https://www.youtube.com/watch?v=ODzY5uJfzDI&t=3s

    @kamilah_santos
  81. 15 de Agosto de 2020, Brasil Exemplos dos testes: https://github.com/violetagg/web-benchmarks/tree/experimental

    @kamilah_santos
  82. 15 de Agosto de 2020, Brasil Beneficios @kamilah_santos

  83. 15 de Agosto de 2020, Brasil - não bloqueante, o

    que gera certo ganho de desempenho. - menos threads, menos memória usada / gasta - visão mais clara dos recursos funcionais da linguagem - processa diferentes formas de solicitação de forma assíncrona @kamilah_santos
  84. 15 de Agosto de 2020, Brasil - segue os princípios

    do manifesto reativo: aplicativos responsivos, resilientes, elásticos e orientados por mensagens. - Backpressure - Com o Reactor temos: maior legibilidade do código, grande variedade de operadores para manipular os dados e um alto nível de abstração. @kamilah_santos
  85. 15 de Agosto de 2020, Brasil Problemas @kamilah_santos

  86. 15 de Agosto de 2020, Brasil - Uma forma diferente

    de programação (programação declarativa) - Difícil de depurar (rastreamento de pilha mais complicado de entender). - Nem todos os drivers de banco de dados estão totalmente prontos para programação reativa. @kamilah_santos
  87. 15 de Agosto de 2020, Brasil Quando usar @kamilah_santos

  88. 15 de Agosto de 2020, Brasil - Se você tem

    fast producers (emissão de informação mais rápida) e consumidores baixos (consumidores lentos e bloqueadores), sem suporte de contrapressão. - Tráfego variável - Chamadas constantes ao banco de dados e esse banco de dados já possui um driver reativo, a mudança para o webflux pode diminuir o tempo de latência. - Muitos fluxos, eventos no aplicativo. - Quando este serviço é consumido via celular e possui alto volume de tráfego. @kamilah_santos
  89. 15 de Agosto de 2020, Brasil Quando não usar @kamilah_santos

  90. 15 de Agosto de 2020, Brasil - se o seu

    aplicativo não tiver um volume de tráfego muito alto, ele não terá várias fontes de solicitação - Se não houver acúmulo de solicitações, isso ocorre devido a processos de bloqueio. - Se as dependências já utilizadas em seus serviços estão bloqueando @kamilah_santos
  91. 15 de Agosto de 2020, Brasil My contacts Example

  92. 15 de Agosto de 2020, Brasil 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://www.journaldev.com/20723/java-9-reactive-streams

    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-c om-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-react ive.html @kailah_santos