首页 > 编程语言 >Spring 响应式编程-读书笔记

Spring 响应式编程-读书笔记

时间:2023-08-14 12:34:08浏览次数:50  
标签:异步 响应 Spring 编程 读书笔记 Reactive RxJava

本文为《Spring 响应式编程》的读书笔记,响应式技术栈可以创建极其高效、易于获取且具有回弹性的端点,同时响应式可以容忍网络延迟,并以影响较小的方式处理故障。响应式微服务还可以隔离慢速事务并加速速度最快的事务。通过本书可以学到以下内容:

Spring 响应式编程-读书笔记_RxJava

响应式编程基本原则和响应式流(Reactive Stream)规范;

使用 Spring 5 集成的 Project Reactor 响应式开发框架;

使用 Spring Webflux 构建响应式 RESTful 服务;

使用 Spring Data Reactive 构建响应式数据访问组件;

使用 Spring Cloud Stream Reactive 构建响应式消息通讯组件。

第一章 响应式Spring

首先了解一下响应式编程相关的名词:


弹性:可以横向扩展;

回弹:故障隔离,做到独立性;

消息驱动:不应该是阻塞的,即时响应。

响应式中,较为关键的是背压:主要用来支持回弹性,实现处理阶段之间工作负载管理的复杂机制,可以确保一个处理阶段不会压垮另一个。


在JVM领域,构建响应式系统最知名的两个框架:Akka 、Vert.x。而在在传统 Java 中,实现响应式的方式:


回调函数,但会带来回调地狱问题;

JDK 8 CompletionStage.

Spring 4为了兼容旧 JDK 没有支持CompletionStage,在Spring 5中才支持该方法。同时,Servlet 3.0 引入了异步客户端-服务器通讯,3.1 支持I/O 非阻塞写入。但是Spring MVC 没有提供一个开箱即用的异步非阻塞客户端。为了陈旧包袱,彻底丧失响应式支持。也导致了 Spring为响应式单独开了一份技术栈。


第二章 Spring响应式编程基本概念

发布订阅模式,它可以被视为观察者模式的变体。在基于RxJava的实现中,但没有人监听时,温度传感器不会探测温度数据。这种行为是响应式编程具有主动订阅概念这一事实的自然结果。基于发布-主题的实现没有这样的属性,因此存在更多限制。



RxJava库是 Reactive Extensions(响应式扩展,也称为 ReactiveX)的Java虚拟机实现。Reactive Extensions 是一组工具,能用命令式语言处理数据流,无论该流是同步的还是异步的。ReactiveX通常被定义为观察者模式、迭代器模式和函数式编程的组合。


RXJava通过订阅者订阅可观察流,该流又反过来触发事件生成的异步过程。采用这种方法对可变对象有害,唯一合理的策略是采用不变性。不变性即函数式编程(functional programming)的核心原则之一。对象一旦被创建,就不会被更改。这样一条简单的规则可以防止在并行系统中可能出现的问题。


如果没有函数式编程,人们就必须创建许多匿名类或者内部类,这些类会污染应用程序。并且他们创建的样板代码多于有效代码。正由于它的不可变性,非常适合应用于并发编程。


历史

异步编程的历史最早追溯05年微软做的:大规模异步数据密集型互联网服务架构的编程模型。09年开源了Rx.NET,后来Netflix正面临大量互联网流量这一复杂难题,就开源了RxJava。并基于它开发了诸如:Hystrix、Ribbon、Zuul、RxNetty知名的库。但其实在响应式编程方向完全落实并成功做出巨大贡献的是:Node.js。


RxJava也并不是Java中唯一的解决方案,Vert.x也可以实现类似功能。Vert.x是一个事件驱动的开发框架,在设计上类似Node.js。它为异步编程提供了一个简单的并发模型和原始语义。


随着RxJava的成功,许多公司和开源项目都开始了激烈的竞争。由于各个库的行为总体上非常相似,但在实现中又略有不同。所以如果共用一些响应式库,可能会出现隐藏的bug。为了解决这些兼容性问题,出现了一个标准:响应式流(Reactive Streams)。


第三章 响应式流-新的标准

使用多个响应式库需要自己去编写适配器进行兼容,Spring 4的ListenableFuture和CompletionStage之间并没有直接的集成,而在Spring 5中才扩展了ListenableFuture的API名为Comple-table的方法来解决不兼容问题。核心问题在于没有一种方法能够使库提供商提供对齐的API,Vert.x、Ratpack和Retrofit都比较重视RxJava,并提供了支持。


在整个响应式环境演变的早期阶段,所有库的设计思想都是把数据从源头推送到订阅者。采用推模型的主要原因是它可以通过将请求量减少到最小值来优化整体处理时间。




这也就是为什么RxJava1.x及类似的开发库以推送数据为目的进行设计,这也是为什么流技术能称为分布式系统中组件之间重要的通讯技术。但如果生产者不关注消费者的吞吐能力,则会存在一下可能:


慢生产者和快消费者

快生产者和慢消费者

针对这种情况的解决方案是将未处理的元素收集到队列中。


无界队列:无限大小的队列;

有界丢弃队列:为避免内存溢出;

有界阻塞队列:支付订单阻塞;

通常,纯推模型中不受控制的语义可能导致许多我们不希望出现的情况。响应式宣言中提到使系统巧妙地响应负载的机制的重要性,及背压的重要性。


响应式流规范定义了4个主要的接口:Publisher、Subscriber、Subscription和Processor。


其中,Publisher和Observable、Subscriber和Observer基本相同;


在Subscriber中的onSubscribe方法中,引用了Subscription,这为控制元素的生产提供了基础。响应式流规范引入了request方法以扩展Publisher和Subscriber之间的交互能力。为了通知Publisher应该推送多少数据,Subscriber应该通过request方法发出关于所需数量的信号,并确保传入元素的数量不超过限制。



标签:异步,响应,Spring,编程,读书笔记,Reactive,RxJava
From: https://blog.51cto.com/u_16092964/7074884

相关文章

  • 【linux编程】用户态文件系统FUSE
       参考资料1. 自制文件系统——02开发者的福音,FUSE文件系统......
  • Spring Cloud之网关
    接口的分类:开放接口:可以授权一些接口口OAuth2.0协议方式第三方联合登录内部接口:一般只能在局域网中进行访问,服务与服务之间关系都在同一个微服务系统中。目的是为了保证安全问题接口设计:接口权限开放or内部幂等性安全性https防止篡改数据(验证签名)网关拦截接口实......
  • Spring Cloud Alibaba-服务雪崩效应
    一、高并发带来的问题在微服务架构中,我们将业务拆分成一个个的服务,服务与服务之间可以相互调用,但是由于网络原因或者自身的原因,服务并不能保证服务的100%可用,如果单个服务出现问题,调用这个服务就会出现网络延迟,此时若有大量的网络涌入,会形成任务堆积,最终导致服务瘫痪。二、服务......
  • 学习go语言编程之错误处理
    error接口Golang中有一个关于错误处理的标准模式,即:error接口。typeerrorinterface{ Error()string}对于大多数函数,如果要返回错误,大致上都可以定义为如下模式:funcFoo(paramint)(nint,errerror){ //...}将error作为多种返回值中的一个,但是这并非强制要求。......
  • 学习go语言编程之面向对象
    类型系统类型系统是指一个语言的类型体系结构,一个典型的类型系统通常包含如下基本内容:基础类型,如:byte、int、bool、float等复合类型,如:数组、结构体、指针等可以指向任意对象的类型(Any类型)值语义和引用语义面向对象,即:所有具备面向对象特征(比如成员方法)的类型接口为类型添......
  • 使用Spring initializr快速创建一个springboot项目
     第一步首先new一个新的project选择Springinitializr配置好相关信息后下一步编辑在左上角我们可以选择SprinBoot的版本,在这里直接加入web依赖springweb和Template的Thymeleaf依赖,点上对勾后可以在最右边里看到你选择的依赖,然后点击create编辑可以看到我们的项目结构,很多sprin......
  • 深入解析 Spring Boot 自动配置机制
    SpringBoot作为一款广泛应用的微服务框架,以其强大的自动配置功能而闻名。这一特性能够让开发人员快速搭建和部署应用程序,无需手动繁琐的配置。在本篇博客中,我们将深入探究SpringBoot自动配置的机制,剖析其背后的原理,并通过代码示例演示如何定制自动配置。1.自动配置的核心原理......
  • 深入探究 Spring Boot 自动配置的内部机制
    SpringBoot作为一款广泛应用的微服务框架,以其强大的自动配置功能而受到瞩目。这一特性能够让开发人员快速搭建和部署应用程序,无需手动繁琐的配置。在本篇博客中,我们将深入探讨SpringBoot自动配置的内部机制,揭示其背后的原理,并通过代码示例演示如何进行自定义的自动配置。1.自......
  • Spring Boot 自动配置原理深度解析
    SpringBoot作为一款广泛应用的微服务框架,以其强大的自动配置功能而著名。这一特性能够让开发人员快速搭建和部署应用程序,无需手动繁琐的配置。在本篇博客中,我们将深入探究SpringBoot自动配置的原理,揭示其背后的工作机制,并通过代码示例演示如何进行自定义的自动配置。1.自动配......
  • 揭秘 Spring Boot 自动配置的内部机制
    SpringBoot作为一款广泛使用的微服务框架,以其强大的自动配置功能而受到瞩目。这一特性能够让开发人员快速搭建和部署应用程序,无需手动繁琐的配置。在本篇博客中,我们将深入探究SpringBoot自动配置的内部机制,剖析其背后的原理,并通过代码示例演示如何进行自定义的自动配置。1.自......