响应式编程

响应式编程系列(一):什么是响应式编程?reactor入门

送分小仙女□ 提交于 2020-02-29 23:00:10
响应式编程 系列文章目录 (一)什么是响应式编程?reactor入门 (二)Flux入门学习:流的概念,特性和基本操作 (三)Flux深入学习:流的高级特性和进阶用法 (四)reactor-core响应式api如何测试和调试? (五)Spring reactive: Spring WebFlux的使用 (六)Spring reactive: webClient的使用 引言   Spring framework 5 的一大新特性:响应式编程(Reactive Programming)。那么什么是响应式?他能给我们带来什么?如何优雅地使用?本系列会从最基础的概念和简单的api讲起,再慢慢深入探讨响应式的一些高级特性,最后讲解实战内容,例如WebFlux和WebClient等在Spring boot中的使用,如何测试和调试。   想要了解原理的话,美团点评的这篇博客 Java NIO浅析 非常适合入门。 简单地说:   当我们调用socket.read()、socket.write()这类阻塞函数的时候,这类函数不能立即返回,也无法中断,需要等待socket可读或者可写,才会返回,因此一个线程只能处理一个请求。在这等待的过程中,cpu并不干活,(即阻塞住了),那么cpu的资源就没有很好地利用起来。因此对于这种情况,我们使用多线程来提高cpu资源的利用率:在等待的这段时间

理解响应式编程,来一波LiveData的深入解析

爷,独闯天下 提交于 2020-01-19 12:19:38
/ 开始 / 本文章主要是对LiveData进行源码分析,本文章使用的是Android SDK 29的源码分析。 / 定义 / LiveData是一种可观察的数据存储器类,它具有生命周期感知能力,遵循应用组件(例如:Activity、Fragment、Service(可以使用LifecycleService,它是实现了LifecycleOwner接口的Service))的生命周期,这种感知能力确保LiveData仅更新处于活跃生命周期状态的应用组件观察者。 如果观察者(由Observer类表示)的生命周期处于STARTED或者RESUMED状态,那么LiveData会认为该观察者处于活跃状态,就会将更新通知它,而那些观察LiveData对象而注册的非活跃观察者不会收到更改通知。 应用组件都实现了LifecycleOwner接口,有了这种关系后,当相应的Lifecycle对象的状态变为DESTROYED时,就会移除这些观察者。 使用LiveData的优势: 确保界面符合数据状态 LiveData遵循观察者模式,当生命周期状态发生变化的时候,它就会去通知Observer对象,然后去更新界面。 不会发生内存泄露 当应用组件的生命周期处于DESTROYED状态时,就会移除这些观察者,使其不再持有应用组件的引用。 不会因Activity停止而导致崩溃 如果观察者的生命周期处于非活跃状态(例如

R-Shiny 响应式编程(二)

江枫思渺然 提交于 2019-12-27 02:41:52
Stop reactions with isolate() 有时observer/endpoint访问响应式值或表达式很有用,但不应依赖于此。 例如,如果observer执行耗时的计算或下载大量数据集,则可能希望其仅在单击按钮时才执行。 为此,我们将使用actionButton。我们将定义一个用户界面,该界面可让用户选择要从正态分布中生成的观察值的数量,并具有一个标有“Go!”的actionButton。您可以在 这里 看到它的实际效果。 actionButton包含一些JavaScript代码,可以将数字发送到服务器的。当Web浏览器首次连接时,它发送的值为0,并且在每次单击时发送的值都是递增的:1、2、3,依此类推。 ui <- pageWithSidebar( headerPanel("Click the button"), sidebarPanel( sliderInput("obs", "Number of observations:", min = 0, max = 1000, value = 500), actionButton("goButton", "Go!") ), mainPanel( plotOutput("distPlot") ) ) 在我们的server函数中,有两点需要注意。首先,仅通过访问output$distPlot即可获取对input

R-Shiny 响应式编程(一)

房东的猫 提交于 2019-12-26 14:46:35
Build Reactivity Overview reactivity-overview 在Shiny中,响应式编程中包含三种对象,这些对象用以下符号表示: reactive source & endpoint :最简单的响应式编程结构,只包括一个源点和一个终点。 在Shiny应用程序中,the source通常是通过浏览器界面输入的用户。 例如,当用户选择一个项目,键入输入或单击按钮时,这些操作将设置作为reactive source的值。 reactive endpoint通常是出现在用户浏览器窗口中的东西,例如图形或值表。 在一个简单的Shiny应用程序中,可通过输入对象可访问reactive source,并通过输出对象可访问reactive endpoint。 (实际上,还有其他可能的source和endpoint,我们将在后面讨论,但现在我们仅讨论输入和输出。) 01_hello示例使用具有一个source和一个endpoint的这种简单结构。 该示例的服务器功能代码如下所示: server <- function(input, output) { output$distPlot <- renderPlot({ hist(rnorm(input$obs)) }) } output$distPlot对象是reactive endpoint,它使用reactive

响应式编程解析

可紊 提交于 2019-12-21 17:00:29
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 响应式编程最重要的是解决生产者和消费者之间的关系。如果生产者产生的数据过大,而消费者消费不过来,就会压垮消费者。所以就需要有一个重要的概念——流控。 解决流控有几种方式 节流 若消费者无法消费生产者生产的元素,则直接丢弃。 使用缓冲区 缓冲区的作用相当于在生产者和消费者之间添加了保存并转发的一种机制,把生产者发出的数据暂时存储起来供消费者慢慢消费。 调用栈阻塞 就是同步线程。就是消费者没消费完生产者前面的数据,后面的数据则一直阻塞。 使用背压 消费者需要多少,生产者生产多少。 背压机制 如果生产者发出的数据比消费者能够处理数据的最大量还要多,消费者可能会被迫一直在获取和处理数据,消耗越来越多的资源,从而埋下潜在的崩溃风险。为了防止这一点,需要有一种机制使消费者可以通知生产者降低数据的生成速度。生产者可以采用多种策略来实现这一要求,这就是背压。 背压机制应该以非阻塞的方式工作。实现非阻塞背压的方法是放弃推策略而采用拉策略。 响应式流 响应式流规范是提供非阻塞背压的异步流处理标准的一种倡议。 响应式流接口 public interface Publisher< T > { public void subscribe (Subscriber<? super T > s) ; } 发布者(Publisher

反应式架构(1):基本概念介绍

痞子三分冷 提交于 2019-12-11 09:28:49
淘宝从2018年开始对整体架构进行反应式升级, 取得了非常好的成绩。其中『猜你喜欢』应用上限 QPS 提升了 96%,同时机器数量缩减了一半;另一核心应用『我的淘宝』实际线上响应时间下降了 40% 以上。PayPal凭借其基于Akka构建的反应式平台squbs,仅使用8台2vCPU虚拟机,每天可以处理超过10亿笔交易,与基于Spring实现的老系统相比,代码量降低了80%,而性能却提升了10倍。能够取得如此好的成绩,人们不禁要问反应式到底是什么? 其实反应式并不是一个新鲜的概念,它的灵感来源最早可以追溯到90年代,但是直到2013年,Roland Kuhn等人发布了《反应式宣言》后才慢慢被人熟知,继而在2014年迎来爆发式增长,比较有意思的是,同时迎来爆发式增长的还有领域驱动设计(DDD),原因是2014年3月25日,Martin Fowler和James Lewis向大众介绍了微服务架构,而反应式和领域驱动是微服务架构得以落地的有力保障。紧接着各种反应式编程框架相继进入大家视野,如RxJava、Akka、Spring Reactor/WebFlux、Play Framework和未来的Dubbo3等,阿里内部在做反应式改造时也孵化了一些反应式项目,包括AliRxObjC、RxAOP和AliRxUtil等。 从目前的趋势看来,反应式概念将会逐渐深入人心, 并且将引领下一代技术变革。

Spring 5 响应式编程

ぐ巨炮叔叔 提交于 2019-12-05 17:13:46
要点 Reactor 是一个运行在 Java8 之上的响应式流框架,它提供了一组响应式风格的 API 除了个别 API 上的区别,它的原理跟 RxJava 很相似 它是第四代响应式框架,支持操作融合,类似 RxJava 2 Spring 5 的响应式编程模型主要依赖 Reactor RxJava 回顾 Reactor 是第四代响应式框架,跟RxJava 2 有些相似。Reactor 项目由Pivotal 启动,以响应式流规范、Java8 和ReactiveX 术语表为基础。它的设计是Reactor 2(上一个主要版本)和RxJava 核心贡献者共同努力的结果。 在之前的同系列文章 RxJava 实例解析 和 测试RxJava 里,我们已经了解了响应式编程的基础:数据流的概念、Observable 类和它的各种操作以及通过工厂方法创建静态和动态的Observable 对象。 Observable 是事件的源头,Observer 提供了一组简单的接口,并通过订阅事件源来消费 Observable 的事件。Observable 通过 onNext 向 Observer 通知事件的到达,后面可能会跟上 onError 或 onComplete 来表示事件的结束。 RxJava 提供了 TestSubscriber 来测试 Observable,TestSubscriber 是一个特别的

Vert.x Blueprint 系列教程(二) | 开发基于消息的应用

我是研究僧i 提交于 2019-12-04 09:22:45
Vert.x 蓝图项目已经发布至Vert.x官方网站: Vert.x Blueprint Tutorials 本文章是 Vert.x 蓝图系列 的第二篇教程。全系列: Vert.x Blueprint 系列教程(一) | 待办事项服务开发教程 Vert.x Blueprint 系列教程(二) | 开发基于消息的应用 - Vert.x Kue 教程 Vert.x Blueprint 系列教程(三) | Micro Service 微服务实战 前言 欢迎回到Vert.x 蓝图系列~在本教程中,我们将利用Vert.x开发一个基于消息的应用 - Vert.x Kue,它是一个使用Vert.x开发的优先级工作队列,数据存储使用的是 Redis 。Vert.x Kue是 Automattic/kue 的Vert.x实现版本。我们可以使用Vert.x Kue来处理各种各样的任务,比如文件转换、订单处理等等。 通过本教程,你将会学习到以下内容: 消息、消息系统以及事件驱动的运用 Vert.x Event Bus 的几种事件机制(发布/订阅、点对点模式) 设计 分布式 的Vert.x应用 工作队列的设计 Vert.x Service Proxy (服务代理,即 异步RPC )的运用 更深层次的Redis运用 本教程是 Vert.x 蓝图系列 的第二篇教程,对应的Vert.x版本为 3.3.2

SpringBoot之响应式编程

我的未来我决定 提交于 2019-12-03 00:07:00
一 Spring WebFlux Framework说明 Spring WebFlux 是 Spring Framework 5.0 中引入的新 reactive web framework。与 Spring MVC 不同,它不需要 Servlet API,完全异步和 non-blocking,并通过 反应堆项目 实现 Reactive Streams 规范。 Spring WebFlux 有两种版本:功能和 annotation-based。 annotation-based 一个非常接近 Spring MVC model,如下面的示例所示: @RestController @RequestMapping("/users") public class MyRestController { ​ @GetMapping("/{user}") public Mono<User> getUser(@PathVariable Long user) { // ... } ​ @GetMapping("/{user}/customers") public Flux<Customer> getUserCustomers(@PathVariable Long user) { // ... } ​ @DeleteMapping("/{user}") public Mono<User>

RxJS入门之函数响应式编程

匿名 (未验证) 提交于 2019-12-02 23:30:02
1.声明式(Declarativ) //命令式编程: function double(arr) { const results = [] for (let i = 0; i < arr.length; i++){ results.push(arr[i] * 2) } return results } function addOne(arr){ const results = [] for (let i = 0; i < arr.length; i++){ results.push(arr[i] +1) } return results } //声明式: const double = arr => arr.map(item => item * 2); const addOne = arr => arr.map(item => item + 1); 2.纯函数(Pure Function) 相反的不纯函数: 改变全局变量的值。 操作浏览器的DOM。 3.数据不可变性(Immutability) 问题:javascript算不算函数式编程语言? 例如,在命令式编程环境中, a:=b+c表示将表达式的结果赋给 a,而之后改变 b 或 c的值不会影响 a。但在响应式编程中,a的值会随着 b或 c的更新而更新。 RxJS 属于“函数响应式编程”。 数据流抽象了很多现实问题。 擅长处理异步操作。